无法理解发电机

时间:2014-04-18 11:41:25

标签: python generator

我在python(3.3.4)中制作生成器时遇到问题。这是我的代码:

def gene(a):

    for b in range(a):
        if b==0 or b==1:
            continue
        if a%b==0:
            yield ("This is Composite number "+str(a))

    yield ("Out!")


gio = gene(12)

当我使用next(gio)时,它表示"这是复合数字12"但据我所知,当我再次使用下一个功能时,该功能应该从它停止的地方恢复。所以下一个(gio)应打印出#34; out"。但事实并非如此。帮助我理解为什么会这样发生。

2 个答案:

答案 0 :(得分:2)

您需要for-loop结束才能到达"Out!"。如果您希望在找到a复合后执行此操作,则需要使用break

def gene(a):    
    for b in range(a):
        if b==0 or b==1:
            continue
        if a%b==0:
            yield ("This is Composite number "+str(a))
            break
    yield ("Out!")

答案 1 :(得分:2)

您正在使用a生成一个字符串,该函数的原始参数。另一方面,b仍然需要在for循环完成之前逐步完成2,3,4和6,并且Python到达yield ("Out!")语句。

因此,在 4 步骤之后,您将进入Out

>>> gio = gene(12)
>>> next(gio)
'This is Composite number 12'
>>> next(gio)
'This is Composite number 12'
>>> next(gio)
'This is Composite number 12'
>>> next(gio)
'This is Composite number 12'
>>> next(gio)
'Out!'

如果你在字符串中使用b,这可能会更明显,或许:

>>> def gene(a):
...     for b in range(a):
...         if b==0 or b==1:
...             continue
...         if a%b==0:
...             yield ("This is Composite number "+str(b))
...     yield ("Out!")
... 
>>> gio = gene(12)
>>> next(gio)
'This is Composite number 2'
>>> next(gio)
'This is Composite number 3'
>>> next(gio)
'This is Composite number 4'
>>> next(gio)
'This is Composite number 6'
>>> next(gio)
'Out!'