gpt4 book ai didi

python - 取消注释 `if False: yield` 更改 `__iter__` 行为

转载 作者:行者123 更新时间:2023-12-03 20:41:18 25 4
gpt4 key购买 nike

我不明白为什么 __iter__ 的行为当我取消注释时会发生变化 if False: yield .条件永远不为真,那么为什么结果会改变呢?

class Example:
def __init__(self):
self.lst = [1,2,3]
self.size = 3

def __iter__(self):
self.n = 0
#if False: yield
return self

def __next__(self):
self.n += 1
if self.n > self.size:
raise StopIteration
return self.lst[self.n-1]

ex = Example()
for i in ex:
print(i)
在这段代码中,一切都按预期工作,并打印出列表。
如果我取消注释 if False: yield__iter__方法然后迭代器停止工作并且没有打印出任何内容,即使该行从未被执行。

最佳答案

当您取消注释行时 if False: yield Python 解释器将编译 def __iter__(self)generator而不是一个函数。生成器是一个封装在函数中的迭代器,只要 next,它就会一直返回值(在 yield 调用上)。语句继续提供值并将引发 StopIteration当生成器退出其功能时:

>>> class A:
... def __iter__(self):
... if False:
... yield
...
>>> a = A()
>>> type(iter(a))
<class 'generator'>
>>> class B:
... def __iter__(self):
... return self
... def __next__(self):
... return 1
...
>>> type(iter(B()))
<class '__main__.B'>
当您评论该行时,您的 __iter__是一个常规函数并返回 self作为迭代器,任何实现 __next__ 的类方法可以用作迭代器;如果你没有你会得到这个错误:
>>> class B:
... def __iter__(self):
... return self
...
>>> type(iter(B()))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: iter() returned non-iterator of type 'B'
请注意,如果所有 __iter__是返回 self你甚至不需要实现它,只需 __next__就足够了。您的 __iter__实现甚至危险:多个 iter(ex)调用都将返回相同的 ex对象作为迭代器并将重置 n所有这些“迭代器”实际上使用相同的 ex :
>>> ex = Example()
>>> itr1 = iter(ex)
>>> print(next(itr1), next(itr1))
1 2
>>> iter(ex)
>>> print(next(itr1))
1
调用 iter再次重置您之前的迭代器引用?我无法想象这就是您想要实现的目标;)

关于python - 取消注释 `if False: yield` 更改 `__iter__` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67037745/

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