Python列表推导式如何在条件判断中复用表达式返回值
实现方案
核心需求:遍历可迭代对象调用指定函数,仅当函数返回值不为None时将返回值加入结果列表,需要兼顾代码简洁性,避免函数重复调用产生额外开销和逻辑错误。
方案1:高版本Python首选(3.8+):海象运算符实现
Python 3.8版本新增的海象赋值运算符:=原生支持在表达式内部完成变量赋值,完全匹配你预期的写法逻辑,func仅会执行一次,写法简洁直观:
result = [a for item in items if (a := func(item)) is not None]
方案2:兼容所有Python版本:嵌套单元素迭代写法
如果运行环境低于Python 3.8,可以通过在列表推导式里嵌套一次单元素遍历,把函数返回值绑定到临时变量,全程func仅调用一次,没有额外开销:
result = [a for item in items for a in [func(item)] if a is not None]
方案3:优先保证可读性:普通for循环
如果团队编码规范不推崇偏技巧性的写法,普通for循环是逻辑最直白、几乎没有理解成本的实现,不存在任何性能问题,仅写法稍长:
result = [] for item in items: temp = func(item) if temp is not None: result.append(temp)
避坑提醒
- 不要使用
[func(item) for item in items if func(item) is not None]这种写法:除了重复调用产生不必要的性能损耗外,如果func是带副作用的函数(比如涉及IO操作、修改外部状态、生成随机值等),重复调用会直接产生业务逻辑错误。 - 不要直接用
list(filter(None, map(func, items))):这个写法会把所有假值(0、False、空字符串、空列表等)全部过滤掉,和“仅排除None返回值”的需求不匹配。如果要使用filter+map组合,需要明确判断条件:result = list(filter(lambda x: x is not None, map(func, items)))
内容的提问来源于stack exchange,提问作者cc-9812398123
相关产品推荐
相关产品推荐

