为什么当你在str
上调用__next__()
方法时,它说它没有这个方法......
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-可迭代对象实现可迭代对象__iter__
协议。
2-迭代器实现了迭代器的协议,该协议是__iter__
和__next__
。
您可以看到迭代器本身就是可迭代对象,但反之则不然。
在您的情况下,b
是"可迭代的"而不是"迭代器"。您应该调用iter()
来恢复迭代器。
__iter__()
方法不返回自我吗?
如果对象是"迭代器"是。如果对象是"可迭代的"否,它应该返回迭代器。
第一行:
b = 'hello'
意味着b
是一个str
,它没有__next__()
方法。
下一行:
a = iter(b)
意味着现在a
是一个str_iterator
,它确实有一个__next__()
方法。
最后:
a.__next__()
只是在返回它想要返回的内容的str_iterator
上调用__next__()
,a
仍然是一个str_iterator
.