gpt4 book ai didi

python - 为什么 __next__() 内部的 yield 会返回生成器对象?

转载 作者:太空狗 更新时间:2023-10-29 18:24:10 25 4
gpt4 key购买 nike

我正在使用 yield 在我的类中的 __next__() 函数中返回下一个值。但是它不返回下一个值,它返回生成器对象。

我正在尝试更好地理解迭代器和 yield。我可能做错了。

看看。

class MyString:
def __init__(self,s):
self.s=s

def __iter__(self):
return self

def __next__(self):
for i in range(len(self.s)):
yield(self.s[i])

r=MyString("abc")
i=iter(r)
print(next(i))

返回:

生成器对象 __next__ 位于 0x032C05A0

最佳答案

next 在这种情况下几乎只是调用 __next__()。在你的对象上调用 __next__ 将启动生成器并返回它(此时没有魔法)。


在这种情况下,您可能根本不定义 __next__ 就可以逃脱:

class MyString:
def __init__(self,s):
self.s=s

def __iter__(self):
for i in range(len(self.s)):
yield(self.s[i])
# Or...
# for item in self.s:
# yield item

如果你想使用 __iter____next__(定义 iterator 而不是简单地制作 iterable ),你可能想做一些事情像这样:

class MyString:
def __init__(self,s):
self.s = s
self._ix = None

def __iter__(self):
return self

def __next__(self):
if self._ix is None:
self._ix = 0

try:
item = self.s[self._ix]
except IndexError:
# Possibly reset `self._ix`?
raise StopIteration
self._ix += 1
return item

关于python - 为什么 __next__() 内部的 yield 会返回生成器对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com