gpt4 book ai didi

python - Python 3 中的函数生成器与类生成器

转载 作者:行者123 更新时间:2023-12-03 15:38:39 25 4
gpt4 key购买 nike

为什么函数生成器和类生成器的行为不同?我的意思是,对于类生成器,我可以根据需要多次使用生成器,但是对于函数生成器,我只能使用一次?为什么这样?

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()函数产生 iterator (特别是 generator iterator )。迭代器只能循环一次。你的类(class)是 不是 一个迭代器,而是一个 iterable ,一个可以产生任意数量的迭代器的对象。

每次使用 for 时,您的类都会生成一个新的生成器迭代器。 , 因为 for应用 iter() function在你传入的对象上,然后调用 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__() method ( 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

关于python - Python 3 中的函数生成器与类生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38872149/

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