python生成器中的循环

2024-06-16 13:55:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了python的生成器(与from一起),但最终得到了无限循环。我的python版本是python3。为什么我会陷入无限循环

下面是我的代码:

def fib2():
    a,b = 0,1
    while True:    
        yield a
        a,b = b , a+b


def FibNumber(num):
    fi2= fib2()
    for i in range(num):
        yield from fi2


if (__name__ == "__main__"):
 
    fin = FibNumber(10)
    for i in fin:
        print (i)
        

Tags: 代码infrom版本fordefnumpython3
3条回答

您可以在第二个迭代器中使用uuu next_uuu()

def FibNumber(num):
    fi2= fib2()
    for i in range(num):
        yield fi2.__next__()

这是因为您将yield from与无限生成器一起使用PEP 380说:

yield from <expr>

其中<expr>是计算iterable的表达式,从中提取迭代器。迭代器运行到耗尽,在此期间,迭代器直接向包含来自表达式的屈服的生成器(“委托生成器”)的调用者生成并接收值

(我用粗体字)

fin确实是一个无限的生成器FiBNumber没有做你想做的事;对于i的每个值,它试图从fi2产生所有。更正确的定义是

def FibNumber(num):
    fi2 = fib2()
    for i in range(num):
        yield next(fi2)

但是,您实际上只是在重新实现itertools.islice

from itertools import islice


for i in islice(fib2(), 10):
    print(i)

相关问题 更多 >