iter() 方法在 str 类中是如何工作的?



为什么当你在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.

最新更新