【问题标题】:zip function python - weird behaviour [duplicate]zip函数python - 奇怪的行为[重复]
【发布时间】:2021-02-21 16:05:27
【问题描述】:

对下面发生的事情有任何解释吗?

>>> foo = [10, 20]
>>> bar = [30, 40]
>>> foobar = zip(foo, bar)

>>> list(foobar)
[(10, 30), (20, 40)]

>>> tuple(foobar)
()

>>> list(foobar)
[]

>>> foobar
<zip object at 0x000001198D28E280>

虽然foobar 仍然是一个 zip 对象,为什么会有这些输出?

【问题讨论】:

  • 你用第一行耗尽了迭代器,现在没有任何东西可以转换为元组了。

标签: python python-3.x


【解决方案1】:

zipgenerator 并返回一个迭代器。完成后,就是这样。

def mygen():
  count = 10
  while count:
    yield count
    count -= 1

gen_obj = mygen()

print(list(gen_obj))
print(list(gen_obj))
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# []

【讨论】:

  • zip 对象实际上不是生成器,但它们是迭代器
  • 我相信它实际上是一个生成器。 docs.python.org/3/library/functions.html#zip 我想我在术语上搞混了。生成器返回一个可迭代对象?
  • 来自您的链接:“zip(*iterables): 创建一个 iterator 来聚合来自每个可迭代对象的元素”
  • 我编辑了我的答案以反映这一点。谢谢。
  • @DragonBobZ 不,它们不是生成器。所有生成器都是迭代器,但并非所有迭代器都是生成器。任何可以迭代的东西都是iterable,包括迭代器,基本上,任何具有__iter__ 方法的东西都是可迭代的。这必须返回一个交互器,它本身有一个__iter__ 方法(它只是返回self)和一个__next__ 方法,它是产生下一个项目的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 2017-05-14
  • 2016-01-26
  • 2014-03-08
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多