在Python中使用yield?

0 投票
3 回答
775 浏览
提问于 2025-04-18 08:03

我有这段代码:

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 个回答

2

当你调用生成器函数时,会得到一个生成器对象。要获取值,你需要遍历这个对象。在你的情况下,你可以使用 list(generator(100)) 来获取值。

不过这样做其实没什么意义。如果你需要一个列表,可以使用列表推导式:

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

生成器函数让你可以声明一个像迭代器一样工作的函数,也就是说,它可以在 for 循环中使用。你可以在这里了解更多:生成器

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))
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的推特两年前所说的:

别等我,我有点像僵尸。去试试Sublime Text @sublimehq,它非常棒:http://www.sublimetext.com

我同意;Sublime Text是我现在最喜欢的编辑器。

撰写回答