在Python中使用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 个回答
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是我现在最喜欢的编辑器。