kal*_*anz 0 python list-comprehension generator
在不关心返回值的情况下执行完整生成器理解的最pythonic方法是什么,而操作纯粹是基于副作用的?
一个例子是基于这里讨论的谓词值来拆分列表.想到编写生成器理解是很自然的
split_me = [0, 1, 2, None, 3, '']
a, b = [], []
gen_comp = (a.append(v) if v else b.append(v) for v in split_me)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我能想出的最佳解决方案是使用 any
any(gen_comp)
Run Code Online (Sandbox Code Playgroud)
然而,对于没有看过这种模式的人来说,这并不是很明显.是否有更好的方法来循环完全理解而不保留内存中的所有返回值?
您不使用生成器表达式.
只需写一个合适的循环:
for v in split_me:
if v:
a.append(v)
else:
b.append(v)
Run Code Online (Sandbox Code Playgroud)
也许:
for v in split_me:
target = a if v else b
target.append(v)
Run Code Online (Sandbox Code Playgroud)
这里使用生成器表达式是没有意义的,如果你要立即执行发电机反正.None
当你想要的是为了将值附加到另外两个列表时,为什么要生成一个对象加上一系列返回值?
使用显式循环对于代码(包括您)的未来维护者来说更容易理解,并且更有效.
itertools
有这个消费食谱
def consume(iterator, n):
"Advance the iterator n-steps ahead. If n is none, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
Run Code Online (Sandbox Code Playgroud)
在你的情况n
是None
,所以:
collections.deque(iterator, maxlen=0)
Run Code Online (Sandbox Code Playgroud)
这很有趣,但也有很多机器来完成一个简单的任务
大多数人只会使用for
循环
归档时间: |
|
查看次数: |
482 次 |
最近记录: |