我需要一个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
不知道为什么?在此先感谢您的帮助。
既然您要澄清一下,我再说一遍。但实际上Ignacio的答案很好地总结了这一点:您只能在一个生成器上进行一次迭代。您示例中的代码尝试对其进行3次迭代,对于中的每个值一次a。
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
这意味着 每次 要迭代时都必须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]]
在lambda刚刚定义了一个匿名函数; 上面与此相同:
lambda
>>> 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]]