Pythonic方式循环纯粹基于副作用的理解

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)

然而,对于没有看过这种模式的人来说,这并不是很明显.是否有更好的方法来循环完全理解而不保留内存中的所有返回值?

Mar*_*ers 5

不使用生成器表达式.

只需写一个合适的循环:

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当你想要的是为了将值附加到另外两个列表时,为什么要生成一个对象加上一系列返回值?

使用显式循环对于代码(包括您)的未来维护者来说更容易理解,并且更有效.


Joh*_*ooy 5

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)

在你的情况nNone,所以:

collections.deque(iterator, maxlen=0)
Run Code Online (Sandbox Code Playgroud)

这很有趣,但也有很多机器来完成一个简单的任务

大多数人只会使用for循环