[英]Function generators vs class generators in Python 3
为什么函数发生器和类生成器的行为不同? 我的意思是,使用类生成器我可以根据需要多次使用生成器,但是使用函数生成器,我只能使用它一次? 为什么这样?
def f_counter(low,high):
counter=low
while counter<=high:
yield counter
counter+=1
class CCounter(object):
def __init__(self, low, high):
self.low = low
self.high = high
def __iter__(self):
counter = self.low
while self.high >= counter:
yield counter
counter += 1
f_gen=f_counter(5,10)
for i in f_gen:
print(i,end=' ')
print('\n')
for j in f_gen:
print(j,end=' ') #no output
print('\n')
c_gen=CCounter(5,10)
for i in c_gen:
print(i,end=' ')
print('\n')
for j in c_gen:
print(j,end=' ')
调用f_gen()
函数会生成一个迭代器 (特别是生成器迭代器 )。 迭代器只能循环一次。 您的类不是迭代器,而是一个可迭代的对象,可以生成任意数量的迭代器 。
你的类生成一个新的发电机迭代器每次使用for
,因为for
应用iter()
函数传递的对象,这反过来又调用object.__iter__()
这在您的实现返回一个新的发电机迭代器每次它叫做。
换句话说,您可以通过在循环之前调用iter(instance)
或instance.__iter__()
来使类的行为方式相同:
c_gen = CCounter(5,10)
c_gen_iterator = iter(c_gen)
for i in c_gen_iterator:
# ...
你还可以使CCounter()
通过返回到迭代器 self
由__iter__
以及添加object.__next__()
方法 ( object.next()
在Python 2):
class CCounter(object):
def __init__(self, low, high):
self.low = low
self.high = high
def __iter__(self):
return self
def __next__(self):
result = self.low
if result >= self.high:
raise StopIteration()
self.low += 1
return result
您的类是可迭代的,但不是迭代器本身。 每次在它上面调用iter
时,都会得到一个新的迭代器。
如果你想用类复制生成器函数的行为,那么你想要一个像这样的迭代器:
class CCounter(object):
def __init__(self, low, high):
self.low = low
self.high = high
self.counter = self.low
def __iter__(self):
return self
def __next__(self):
if self.counter > self.high:
raise StopIteration()
val = self.counter
self.counter += 1
return val
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.