【发布时间】:2020-06-14 18:44:21
【问题描述】:
所以我得到了用于惰性求值和生成器表达式的生成器函数,也就是生成器理解作为它的语法糖等价物。
我了解类似的课程
class Itertest1:
def __init__(self):
self.count = 0
self.max_repeats = 100
def __iter__(self):
print("in __inter__()")
return self
def __next__(self):
if self.count >= self.max_repeats:
raise StopIteration
self.count += 1
print(self.count)
return self.count
作为实现迭代器接口的一种方式,即 iter() 和 next() 在同一个类中。
但那是什么
class Itertest2:
def __init__(self):
self.data = list(range(100))
def __iter__(self):
print("in __inter__()")
for i, dp in enumerate(self.data):
print("idx:", i)
yield dp
在iter成员函数中使用yield语句?
我还注意到在调用 iter 成员函数时
it = Itertest2().__iter__()
batch = it.__next__()
仅在第一次调用 next() 时才会执行打印语句。 这是由于产量和迭代的这种奇怪的混合吗?我认为这很违反直觉......
【问题讨论】:
-
在生成器中,值是延迟计算的即值仅在需要时计算。
-
(1) 你应该以不同的方式命名这两个类,至少 Itertest1 和 Itertest2。 (2) Itertest2 是一个可迭代对象,它在其
__iter__方法中创建新的独立迭代器。生成器函数返回这样一个迭代器。 Itertest1 是一个迭代器,按照惯例,它在__iter__中返回自身。例如。 Java 更清晰地区分可迭代和迭代器,但不太舒服。 -
谢谢,但为什么在“__inter__()”中只在下一次调用而不是调用 __iter__() 之后才打印?
-
@CD86 因为对
__iter__的调用只会返回您的生成器。事情是,yield旨在简化编写迭代器的过程(除其他外),幕后发生了很多事情。因此,您没有在定义 both__iter__和__next__时所做的控制级别;你把它们挤在一起并用yield粘在一起。 -
__iter__itself 是一个生成器函数,所以每次调用Itertest2.__iter__都会返回一个独立的迭代器,这与Itertest1不同,Itertest1的实例本身带有迭代状态。