使用生成器和迭代器时,Python多循环失败
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用生成器和迭代器时,Python多循环失败,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1546字,纯文字阅读大概需要3分钟。
内容图文
我需要一个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的答案总结得很好:你只能迭代一次发电机.您的示例中的代码尝试迭代三次,一次针对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]]
内容总结
以上是互联网集市为您收集整理的使用生成器和迭代器时,Python多循环失败全部内容,希望文章能够帮你解决使用生成器和迭代器时,Python多循环失败所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。