python打印内部vs外部功能?
这个问题在这里已经有了答案:
在你的代码中, 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))
yield
语句使该函数返回一个generator object
,而不仅仅是一个函数。
总之,python生成器是迭代器。 描述简单发电机的PEP 255。 通过调用生成器对象的下一个方法或在for循环中使用生成器对象,可以使用生成器。
要执行生成器,您需要遍历它。 因此, for x in fibon(20)
中的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))
如果您只是更改要print
的yield
语句,就会得到常规功能。 但我不会建议使用斐波纳契,收益率选择是最好的选择。
>>> fibon
<function fibon at 0x0000000002D31C88>
如果目标只是打印数字,只要用print
替换yield
就足够了。