以下代码之前使用for循环打印了fibonnacci。我将打印件移到了函数内部,然后调用了它,但是尽管函数中有打印,但没有打印出fibonacci nubers。他们不应该吗?
def fibon(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
print(a) # move here inside function but doesnt print?
fibon(20)
旧代码的作用如下:
for x in fibon(100):
print(x)
答案 0 :(得分:2)
yield
语句使函数返回generator object
,而不只是函数。
简而言之,python生成器是迭代器。描述简单生成器的 PEP 255 。通过在生成器对象上调用 next 方法或在 for 循环中使用生成器对象来使用生成器。
要执行生成器,您需要迭代。
因此,for x in fibon(20)
执行迭代,而fibon(20)
返回生成器对象。
def fibon(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
fibon(5)
<generator object fibon at 0x00000000034A6A20>
for i in fibon(5):
print i
# list() can be used too, because it accepts generator as a param
fibos = list(fibon(5))
如果您只是将yield
语句更改为print
,则会获得常规功能。但我不推荐使用斐波纳契,屈服选择是可行的方法。
>>> fibon
<function fibon at 0x0000000002D31C88>
答案 1 :(得分:0)
在您的代码fibon
中是一个生成器函数。当你调用它时返回生成器对象。您可以从功能中删除yield
def fibon(n):
a = b = 1
for i in range(n):
a, b = b, a + b
print(a) # move here inside function but doesnt print?
fibon(20)
或从生成器对象构建列表
def fibon(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
print(a) # move here inside function but doesnt print?
list(fibon(20))
答案 2 :(得分:-1)
如果目标只是打印数字,只需将yield
替换为print
即可。