我有这段代码:
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
并不像所有保留字一样以天蓝色突出显示,而是以白色显示,是不是很好?
答案 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]