我正在通过learnpython.org学习python。我完成了所有基本类,但是我遇到了Generators级别的问题。
我想我理解yield
命令是如何工作的,但是我无法弄清楚如何使用它来获得完成课程所需的Fibonacci序列。这是我的代码,但它只给我前两个数字。
# fill in this function
def fib():
a,b = 1,0 # Sets the values (is this causing a problem?)
yield a # Sends back the value of a to the iterator (for loop)
b = a + b # Sets the value of b to a + b
yield b # Sends back the value of b to the iterator (for loop)
# testing code
import types
if type(fib()) == types.GeneratorType:
print "Good, The fib function is a generator."
counter = 0
for n in fib():
print n
counter += 1
if counter == 10:
break
这是最烦人的,因为我想完成这个级别,但我不知道如何。
答案 0 :(得分:4)
您的生成器将为每个执行的yield
语句生成一个结果。您只执行了两个yield
语句,因此您的生成器产生了两个结果。
试试这个:
def fib():
a,b = 1,0 # Sets the values (is this causing a problem?)
while True:
a,b = b, a + b # Sets the value of b to a + b
yield b # Sends back the value of b to the iterator (for loop)
正如您所看到的,while
循环将永远运行,因此该生成器将产生无限(无限?)数量的结果。
或者,您可以修改生成器以生成有限序列,并修改调用者以利用它:
def fib(counter=None, limit=None):
a,b = 0,1
i = 0
while (counter is None or counter > i) and (limit is None or limit > b):
i += 1
yield b
a,b = b, a + b
print list(fib(counter=10))
print list(fib(limit=60))
答案 1 :(得分:0)
在python中,每个函数末尾都有一个隐式return
。因此,当您的发电机到达功能的末尾时,在第二次产量之后,它会停止。如果你想继续(无限生成器),你需要将产量放在无限循环中。
def fib():
current, past = 1, 0
while True:
yield current
current, past = current + past, current
旁注:
此外,python有一个nice function用于从内置于名为itertools的酷库中的无限生成器中获取前N个项目,因此第二部分可以像这样清理:
from itertools import islice
for number in islice(fib(), 10):
print(number)