如何使用and和or运算符实现返回0的Python lambda函数?
如何使用and和or运算符实现返回0的Python lambda函数?
嘿,你这个问题刚好戳中了Python逻辑运算符的一个小细节!and和or这俩是短路逻辑运算符,而且返回的是参与运算的实际值,不是咱们直觉里的布尔值True/False,这就是为啥你写的求和lambda会报错,乘法的却能正常跑。
先看你给出的求和lambda:
sum = lambda tab: tab == [] and 0 or tab[0] + sum(tab[1:])
当传入空列表时,tab == []是True,and会返回后面的0,但0在Python里是假值啊!所以or一看前面返回的是假,就会硬着头皮去执行后面的tab[0] + sum(tab[1:]),可这时候列表是空的,自然就触发IndexError了。
再看乘法的例子为啥没问题:
prod = lambda tab: tab == [] and 1 or tab[0] * prod(tab[1:])
空列表时and返回的是1,1是真值,or一看前面是真,直接就短路返回1了,根本不会碰后面的乘法逻辑,所以啥问题都没有。
那要让求和的lambda用and/or返回0,核心思路就是把0包装成一个真值对象,让and返回的结果能让or乖乖短路。给你俩实用的写法:
- 包装成列表的方式:
sum = lambda tab: (tab == [] and [0] or [tab[0] + sum(tab[1:])])[0]
[0]是列表,哪怕里面装的是0,它本身也是真值。空列表时and返回[0],or直接用这个值,最后取索引0就能拿到0;非空列表时or会执行求和逻辑,同样取索引0得到结果,完美解决问题。
- 更简洁的短路写法:
sum = lambda tab: (tab and tab[0] + sum(tab[1:])) or 0
空列表时tab是假,括号里的表达式返回假,or就返回0;非空列表时,括号里会算出求和结果——哪怕结果是0,or返回的0也正好是我们要的求和结果,完全不影响正确性。
最后提一嘴,其实现在Python有了三元表达式a if cond else b,用它写lambda可读性会更高:
sum = lambda tab: 0 if tab == [] else tab[0] + sum(tab[1:])
但如果非要死磕and/or的写法,前面两种方案都能完美解决你的问题~
内容来源于stack exchange
相关产品推荐
相关产品推荐

