栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/626586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号