我正在用python编写生成器,此代码可以正常工作:
def gen(a, b):
for i in itertools.count():
if i % 2 == 0:
yield a
if i % 2 != 0:
yield b
def main():
x, y = 2, 1
res = gen(x, y) # gen = gen(x, y) would raise error
print(list(next(res) for _ in range(10)))
if __name__ == '__main__':
main()
>>
[2, 1, 2, 1, 2, 1, 2, 1, 2, 1]
如果我将res
中的gen
更改为main()
,则会引发Unresolved reference error
。但是,如果我删除main()
并将gen = gen(x, y)
放在if __name__ == '__main__':
下,它就可以正常工作:
def gen(a, b):
for i in itertools.count():
if i % 2 == 0:
yield a
if i % 2 != 0:
yield b
if __name__ == '__main__':
gen = gen(2, 1)
print(list(next(gen) for _ in range(10)))
>>
[2, 1, 2, 1, 2, 1, 2, 1, 2, 1]
我认为python中的generator
是iterator
的一种,因为它们可以在next()
中使用,那为什么我们不能直接将gen(2, 1)
传递到{{1 }}和next()
一样?这引发了另一个错误:
print(list(next(gen(2, 1)) for _ in range(10)))
答案 0 :(得分:1)
如果您更改main
函数并在行gen = gen(x, y)
上出现错误,因为您正在重用变量名,将全局变量更改为局部变量,将会感到困惑。基本上,当您在函数内声明gen
时,它会取消全局gen
,因此现在gen()
不存在。您可以通过不重用变量名来避免这种情况,或者如果您确实想重用该名称,则可以指定要导入全局变量gen
,如下所示:
def main():
global gen
x, y = 2, 1
gen = gen(x, y)
print(list(next(gen) for _ in range(10)))
有关全局变量和局部变量的更多信息,请参见:https://www.geeksforgeeks.org/global-local-variables-python/