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__()方法不返回自我吗?

如果对象是“迭代器”是的。如果对象是“可迭代的”否,它应该返回迭代器。


以上是iter()方法如何在str类中工作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>