仅将列表推导用于副作用是否符合 Pythonic?
- 2024-11-20 08:44:00
- admin 原创
- 12
问题描述:
考虑一下我调用的函数的副作用,而不是返回值(例如打印到屏幕、更新 GUI、打印到文件等)。
def fun_with_side_effects(x):
...side effects...
return y
现在,使用列表推导来调用这个函数是否符合 Pythonic风格:
[fun_with_side_effects(x) for x in y if (...conditions...)]
请注意,我没有保存该列表
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
哪一个更好?为什么?
解决方案 1:
这样做非常违反 Python 规范,任何经验丰富的 Pythonista 都会因此而责怪你。中间列表在创建后会被丢弃,而且它可能非常非常大,因此创建起来非常昂贵。
解决方案 2:
您不应该使用列表推导,因为正如人们所说,这将构建一个您不需要的大型临时列表。以下两种方法是等效的:
consume(side_effects(x) for x in xs)
for x in xs:
side_effects(x)
consume
使用手册页中的定义itertools
:
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)
当然,后者更加清楚,也更容易理解。
解决方案 3:
列表推导用于创建列表。除非您确实要创建列表,否则不应使用列表推导。
因此我会选择第二种选择,只需遍历列表,然后在条件适用时调用该函数。
解决方案 4:
第二个更好。
想想那些需要理解你的代码的人。对于第一个人来说,你很容易得到坏的报应 :)
你可以使用 filter() 在两者之间找到折中方案。请考虑以下示例:
y=[1,2,3,4,5,6]
def func(x):
print "call with %r"%x
for x in filter(lambda x: x>3, y):
func(x)
解决方案 5:
取决于你的目标。
如果您尝试对列表中的每个对象执行某些操作,则应采用第二种方法。
如果您尝试从另一个列表生成一个列表,则可以使用列表推导。
明确优于隐含。简单优于复杂。(Python Zen)
解决方案 6:
你可以做
for z in (fun_with_side_effects(x) for x in y if (...conditions...)): pass
但不太漂亮。
解决方案 7:
使用列表推导式来实现它的副作用是丑陋的、非 Python 的、低效的,我不会这么做。我会使用循环for
,因为for
循环表明了一种程序风格,其中副作用很重要。
但是,如果你坚持使用列表推导式来消除其副作用,那么你应该改用生成器表达式来避免效率低下的问题。如果你坚持使用这种风格,请执行以下两项操作之一:
any(fun_with_side_effects(x) and False for x in y if (...conditions...))
或者:
all(fun_with_side_effects(x) or True for x in y if (...conditions...))
这些是生成器表达式,它们不会生成随机列表并被丢弃。我认为这种all
形式可能更清晰一些,尽管我认为它们都令人困惑,不应该使用。
我认为这很丑陋,我不会在代码中真正做到这一点。但如果你坚持以这种方式实现循环,我就会这样做。
我倾向于认为列表推导及其同类应该表明尝试使用至少与函数式风格略微相似的东西。将具有副作用的东西放入其中会破坏这一假设,这将导致人们不得不更仔细地阅读你的代码,我认为这是一件坏事。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件