iter()方法如何在str类中工作?
为什么当你调用它的__next__()方法时str说它没有这个方法......
b = 'hello'
b.__next__() # give AttributeError: 'str' object has no attribute '__next__'
a = iter(b)
a.__next__() # output == 'h'
该__iter__()方法不返回自我吗?好吧,如果它返回self,它是一个没有__next__()方法的字符串?
那么如何返回 "h"呢?
回答
iter如果值是迭代器,则仅返回其参数。str是不是一个迭代; 它是一个可迭代对象,其__iter__方法返回一个str_iterator对象。
>>> a = iter(b)
>>> type(a)
<class 'str_iterator'>
该str_iterator对象实现__next__并维护与同一对象上的任何其他迭代器分开的迭代状态。
>>> b = 'hello'
>>> a1 = iter(b)
>>> a2 = iter(b)
>>> next(a1)
'h'
>>> next(a2)
'h'
>>> next(a2)
'e'
>>> next(a2)
'l'
>>> next(a1)
'e'
你可以想象str_iterator被定义为类似
class str_iterator:
def __init__(self, s):
self.s = s
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i == len(self.s):
raise StopIteration
i = self.i
self.i += 1
return self.s[i]
class str:
...
def __iter__(s):
return str_iterator(s)
迭代器记住的是在调用 之间的字符串中的位置__next__。的工作__next__是推进“指针”并将字符返回到正确的位置。
回答
不要将“迭代器”与“迭代器”混淆:
1- Iterables 实现了 iterables 的协议,它是__iter__.
2- 迭代器实现迭代器的协议,即__iter__和__next__。
你可以看到迭代器本身是可迭代的,但反之则不然。
在您的情况下,b是“可迭代的”而不是“迭代器”。你应该打电话iter()让迭代器回来。
该
__iter__()方法不返回自我吗?
如果对象是“迭代器”是的。如果对象是“可迭代的”否,它应该返回迭代器。