【发布时间】:2020-10-06 00:49:26
【问题描述】:
我遇到了一些类似的代码:
[func(val) for val in iterable]
有一个可迭代对象(在我的例子中是一个生成器),用户希望为其副作用调用每个值的函数(例如,func 可能只是 print)但返回值无关紧要.
我不喜欢这种方法的是,它会创建一个临时的list,如果生成器产生大量值,它可能会消耗相当多的内存。
如果func 的返回值始终计算为False,则以下工作:
any(func(val) for val in iterable)
如果 func 的返回值总是True,那么下面的工作:
all(func(val) for val in iterable)
如果 func 的返回值可以评估为True 或False,我该怎么办
还有什么比将值强制为 False 更好的方法吗?
我想出的最好的是:
any(func(val) and False for val in iterable)
或
all(func(val) or True for val in iterable)
【问题讨论】:
-
您能否澄清或举例说明预期的输出/结果?如果是你害怕的内存,只需使用
(func(val) for val in iterable),它是一个构造函数,仅在被询问时才产生结果,因此在启动时所有答案都不会保存在内存中。 -
事实上,这个人不想写两行代码:
for val in iterable():后跟func(val)他想写一个优雅且快速执行的方式来为可迭代的每个成员调用一个函数,并且使用列表表达式。所以她在寻找一个单行(理想情况下)一个表达式,它为可迭代的每个成员调用一个函数,但不会白白地列出一个列表 -
不确定这是否属实(懒得反编译和比较),但我的印象是,
for语句的性能略低于使用any或all,但是我对此不是 100% 确定的。我遇到了上面的代码,并对改进它的最佳方法感到好奇(内存和性能方面)