【问题标题】:Python function or syntactic sugar to return all elements of a generator expression?Python函数或语法糖返回生成器表达式的所有元素?
【发布时间】:2014-07-16 13:23:19
【问题描述】:

给定一个(有限的)生成器表达式,我想进行一个函数调用,返回生成器表达式的所有元素。

>>> a = (i for i in range(1,101))
>>> a
<generator object <genexpr> at 0x101873460>
>>> a.next()
1
>>> a.next()
2

换句话说,我想避免这样的循环:

for i in a:
    print i

而是为循环添加语法糖:

a.all() # or the like

我查看了itertools,但我并不清楚这样的事情是否存在。

【问题讨论】:

  • 如何处理永不结束的生成器表达式?即def my_gen(): i = 0 while True: i = i+1 yield i
  • 你没有。在我所指的情况下,生成器是表达式是有限的。
  • 生成器表达式a 可以是任意类型,而不仅仅是一个列表;它可以是 tuple、dict、set、frozenset 或任何其他/非内置类型。

标签: python generator lazy-evaluation syntactic-sugar


【解决方案1】:

您可以从中创建一个列表:

list(a)

示例

a = (i for i in range(1,101))

print list(a)
[1, 2, 3, ..., 100]

事实上,由于在这种情况下您将项目放入列表中,因此您也可以使用列表推导:

a = list(range(1, 101))

现在,a 是一个列表而不是生成器对象。

【讨论】:

  • 我不确定我是否遵循您的最后评论。为什么[i for i in range(1, 101)list(a) 简单? (这里是list(range(1,101))-- 虽然因为我们使用的是 Python 2,所以我们真的不需要这个列表。)你经常看到人们写 [i for i in something_iterable],而实际上他们可以简单地写 list(something_iterable),我认为这是因为他们在看到 listtupleset 如何使用可迭代对象之前学习了 listcomps。
  • 只有当我们知道a 应该是一个列表时。生成器表达式a 可以是任意类型,而不仅仅是一个列表;它可以是 tuple、dict、set、frozenset 或任何其他/非内置类型。
【解决方案2】:

我认为这是最好的解决方案。

a = [i for i in range(1, 101)]
print a
[1, 2, 3, ..., 100]

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 2013-10-15
    • 2017-03-27
    • 2011-07-12
    • 2021-04-07
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多