使用生成器和迭代器时,Python多循环失败

发布于 2021-01-29 15:03:26

我需要一个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

不知道为什么?在此先感谢您的帮助。

关注者
0
被浏览
91
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    既然您要澄清一下,我再说一遍。但实际上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]]
    

    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]]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看