我们就爱程序媛

python的and左右有玄机

2017-10-27  本文已影响1人  予岁月以文明

廖雪峰filter教程中有这么一段函数

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))

处理空字符,开始不理解为什么not_empty返回的不是布尔值,而是str。。。
原来表示真假的不只有布尔值TRUE和false,空字符串,空字典,列表,数字0,none,都是FALSE。
另外一点是,在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。如果布尔上下文中的某个值为假,则 and 返回第一个假值。

>>> 'a' and 'b'
'b'
>>> '' and 'b'
''
>>> 'a' and 'b' and 'c'
'c'

回到廖雪峰的例子,直接用lambda更简洁。

print(list(filter(lambda x: x and x.strip(), ['A', '0','', 'B', None, 'C', '  '])))

遇到第一个空字符串,and返回的是假,遇到多个空格,and返回的是真,而且返回右边的数值,也就是空格.strip(),结果又变成了空(假的),所以删除了。

不过他的这个表达式如果遇到数字就完蛋了。我用正则修改了一下,不管数字还是其他都能处理掉。

print(list(filter(lambda x: x and re.sub('\s','',x), ['A', '0','', 'B', None, 'C', '  ',0])))
上一篇下一篇

猜你喜欢

热点阅读