问题描述
既然您要澄清一下,我再说一遍。但实际上Ignacio的答案很好地总结了这一点:您只能在一个生成器上进行一次迭代。您示例中的代码尝试对其进行3次迭代,对于中的每个值一次a
。
要了解我的意思,请考虑以下简单示例:
>>> def mygen(x):
... i = 0
... while i < x:
... yield i
... i += 1
...
>>> mg = mygen(4)
>>> list(mg)
[0, 1, 2, 3]
>>> list(mg)
[]
当mygen
被调用时,它将创建一个对象,该对象可以被迭代一次。当您尝试再次对其进行迭代时,将得到一个空的可迭代对象。
这意味着 每次 要迭代时都必须mygen
重新调用一次。因此,换句话说(使用相当冗长的样式)… __
>>> def make_n_lists(gen, gen_args, n):
... list_of_lists = []
... for _ in range(n):
... list_of_lists.append(list(gen(*gen_args)))
... return list_of_lists
...
>>> make_n_lists(mygen, (3,), 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
如果您想将参数绑定到生成器并将其作为无参数函数传递,则可以执行此操作(使用更简洁的样式):
>>> def make_n_lists(gen_func, n):
... return [list(gen_func()) for _ in range(n)]
...
>>> make_n_lists(lambda: mygen(3), 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>> def call_mygen_with_3():
... return mygen(3)
...
>>> make_n_lists(call_mygen_with_3, 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
解决方法
我需要一个2D循环,其中第一个循环使用迭代器,第二个循环使用生成器,但是此简单函数无法正常工作,有人可以帮助检查吗?
def alphabet(begin,end):
for number in xrange(ord(begin),ord(end)+1):
yield chr(number)
def test(a,b):
for i in a:
for j in b:
print i,j
test(xrange(8,10),alphabet('A','C'))
The result shows:
>>> 8 A
>>> 8 B
>>> 8 c
不知道为什么?在此先感谢您的帮助。