【问题标题】:Print elements in comprehension as soon as they are computed计算后立即在理解中打印元素
【发布时间】:2018-03-31 10:08:56
【问题描述】:

假设我希望计算和查看一个列表推导的结果,它需要一段时间来计算但只返回少量结果;例如(人工示例),

L = [x for x in range(100000000) if x<10]; print(L)

有没有一种简单的方法可以在计算这些元素后立即打印它们,而不是在最后打印所有元素?可以编写一个装饰器来做到这一点:

import sys

def print_as_computed(gen):
    try:
        while True:
            v = next(gen)
            print v
            sys.stdout.flush()
            yield v
    except StopIteration:
        pass

L1 = list(print_as_computed(x for x in range(10000000) if x<10))

但我想知道是否有内置函数可以做到这一点,或者更标准/Pythonic 的方式。

【问题讨论】:

标签: python list-comprehension


【解决方案1】:

如果您想要具有显式 for 语句的生成器函数的等价物,但理解的简洁,这就是生成器表达式的用途:

L = (x for x in range(100000000) if x<10)
for value in L: print(value)

如果你真的想把print 塞进表达式,你可以,虽然它绝对不是惯用的或可读的。例如:

L = (print(x) or x for x in range(100000000) if x<10)
L1 = list(L)

因为print(x) 总是返回None,所以print(x) or x 总是x。 (同样,你实际上不应该这样做——但在你理解它之前,值得研究它是如何工作的。)


对于 Python 2,如果你不使用 from __future__ import print_function,如果你想做同样的 hack,你还必须创建一个类似 print 的函数,因为你不能在表达式中使用语句:

def printify(s):
    print s

L = (printify(x) or x for x in range(100000000) if x<10)

【讨论】:

  • 谢谢,非常好的建议!我假设第一种方法是print(value)。另外,如果我理解正确,第一种方法不会返回值列表,对吗?它们被打印出来,然后被丢弃。
  • @FedericoPoloni 很好地抓住了print 论点。无论如何,没有人返回任何东西。第一个打印,第二个也将值存储在列表中,但您只能使用 return 语句返回值。
  • 抱歉,打错字了。我的意思是:在我最初的建议或您的第二种方法之后,L1 包含一个包含有效值的列表。在您的第一个方法之后,L 什么都不包含,我无法检索计算值以供以后在我的代码中使用。
  • (另外,仅供参考:方法2仅适用于python3——在Python 2中 print 是一条特殊指令,没有返回值。)
  • @FedericoPoloni 当然可以,但是在 Python 2 中,您可以简单地编写一个函数,只使用 prints 的参数,然后调用它。
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2016-12-20
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多