假设我希望计算和查看列表推导的结果,这需要一段时间来计算,但只返回少量结果;例如(人工例子),
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方式。
答案 0 :(得分:3)
如果你希望生成器函数的等价物具有明确的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
,如果你想要做同样的黑客攻击,你还必须创建一个类似print
的功能,因为你可以&#39 ; t在表达式中使用语句:
def printify(s):
print s
L = (printify(x) or x for x in range(100000000) if x<10)