在Python中使用yield?

时间:2014-05-30 11:45:20

标签: python generator yield

我有这段代码:

def generator(n):
    list_of = range(1,n+1)
    for i in list_of:
        if i % 7 == 0:
            yield i

print generator(100)

这应打印给定范围内可被7整除的所有数字,但输出为<generator object generator at 0x1004ad280>

此外,我的文本编辑器(KOD)中的单词yield并不像所有保留字一样以天蓝色突出显示,而是以白色显示,是不是很好?

3 个答案:

答案 0 :(得分:10)

您的发电机正常工作。你忘了迭代它了:

for elem in generator(100):
    print elem

或者你可以把它变成一个列表:

print list(generator(100))

您改为通过调用生成器函数打印生成的生成器对象。生成器函数生成挂起的生成器。只有当你迭代它时才会执行代码(直到下一个yield)。

演示:

>>> def generator(n):
...     list_of = range(1,n+1)
...     for i in list_of:
...         if i % 7 == 0:
...             yield i
... 
>>> print list(generator(100))
[7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]

list()调用迭代给定的参数,生成一个Python列表对象,其中包含参数产生的所有元素。非常适合迭代生成器以引入它生成的所有元素。

至于KOD;这位编辑多年来没有见过更新;你可能想切换到别的东西。正如KOD twitter feed stated 2 years ago

  

不要等我,我有点像僵尸。去获取Sublime Text @sublimehq,这很棒:http://www.sublimetext.com

我同意; Sublime Text是我目前的首选编辑。

答案 1 :(得分:3)

生成器函数允许您声明一个行为类似于迭代器的函数,即它可以在for循环中使用。你可以在这里学习:generator

def generator(n):
        list_of = range(1,n+1)
        for i in list_of:
            if i % 7 == 0:
                yield i

    for i in generator(100):
        print i

您可以使用next(generator(100))在顶部打印一个元素

list(generator(100))

答案 2 :(得分:2)

调用生成器函数时,您会收到生成器对象。为了获得值,您应该遍历此对象。在你的情况下,你可以list(generator(100))

但这没有意义。如果需要列表,请使用列表推导:

[x for x in range(1, 101) if x % 7 == 0]