繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM