首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅仅为了副作用而使用列表理解是Pythonic式的吗?

仅仅为了副作用而使用列表理解是Pythonic式的吗?
EN

Stack Overflow用户
提问于 2011-04-22 16:22:02
回答 7查看 12.3K关注 0票数 119

考虑一下我调用的函数的副作用,而不是返回值(比如打印到屏幕、更新GUI、打印到文件等)。

代码语言:javascript
复制
def fun_with_side_effects(x):
    ...side effects...
    return y

现在,使用列表理解来调用这个函数是Pythonic式的吗:

代码语言:javascript
复制
[fun_with_side_effects(x) for x in y if (...conditions...)]

请注意,我不会将列表保存在任何地方

或者我应该这样叫这个函数:

代码语言:javascript
复制
for x in y:
    if (...conditions...):
        fun_with_side_effects(x)

哪一个更好?为什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-22 16:24:33

这样做是非常反Pythonic的,任何经验丰富的Pythonista都会让你下地狱。中间列表在创建后被丢弃,它可能非常非常大,因此创建成本很高。

票数 96
EN

Stack Overflow用户

发布于 2011-04-22 16:38:35

你不应该使用列表理解,因为正如人们所说的那样,这将建立一个你不需要的大的临时列表。以下两种方法是等效的:

代码语言:javascript
复制
consume(side_effects(x) for x in xs)

for x in xs:
    side_effects(x)

使用itertools手册页中的consume定义:

代码语言:javascript
复制
def consume(iterator, n=None):
    "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)

当然,后者更清晰,也更容易理解。

票数 38
EN

Stack Overflow用户

发布于 2011-04-22 16:27:27

列表理解是用于创建列表的。除非你真的在创建列表,否则你不应该使用列表理解。

因此,我会得到第二种选择,只需迭代列表,然后在条件适用时调用函数。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5753597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档