python打印内部vs外部功能?

时间:2017-10-12 07:42:14

标签: python

以下代码之前使用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)  

3 个答案:

答案 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即可。