如何优雅地将getElem()非None返回值添加至列表l?
优雅的单行解决方案
这里有几个简洁的单行实现,既能满足「仅当getElem()返回值不为None时添加到列表l」的需求,又保持代码简洁:
方案1:使用海象运算符(Python 3.8+)
这是最推荐的方案,因为它只调用一次getElem(),没有额外副作用,逻辑清晰:
l.append(a) if (a := getElem()) is not None else None
解释:海象运算符:=会先执行getElem()并把结果赋值给a,接着判断a是否为None,如果不是就执行l.append(a),否则什么都不做。
方案2:兼容旧Python版本(无海象运算符)
如果你使用的Python版本低于3.8,没法用海象运算符,可以用列表推导式配合extend:
l.extend([x for x in [getElem()] if x is not None])
解释:先把getElem()的返回值放到一个临时列表里,再通过列表推导式过滤掉None的情况,最后用extend把过滤后的结果(要么是单个元素的列表,要么是空列表)添加到l中。空列表的话extend不会对l做任何修改,刚好符合需求。
注意避开坑
别用这种写法:
# 不推荐!会调用两次getElem() l += [getElem()] if getElem() is not None else []
这个写法会执行两次getElem(),如果getElem()有副作用(比如读取文件、修改外部变量),会导致逻辑错误,所以一定要避免。
其实你原来的两行写法可读性已经很好了,如果团队里有不熟悉海象运算符的成员,保留原写法也完全没问题——代码的可读性永远优先于行数~
内容的提问来源于stack exchange,提问作者william007
相关产品推荐
相关产品推荐

