def not_empty(s):
return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', ' '])
# 结果: ['A', 'B', 'C']
怎么解释这个return s and s.strip(),没理解
关键知识点A:and
在布尔上下文中从左到右演算表达式的值。
0、''、[]、()、{}、None 在布尔上下文中为假,其它任何东西都为真。
关键知识点B:filter 函数
filter 函数的作用是“根据返回值是True还是False决定保留还是丢弃该元素。”(True的留下 False的去除)
因此:
如果s = None,表达式的结果是False,filter过滤该队列元素
如果s = '',表达式的结果是False,filter过滤该队列元素
如果s = 空格,s.strip()的结果是'',表达式的结果是False,filter过滤该队列元素
如果s = 其他,表达式的结果是Ture,filer保留该队列元素(并不是s.strip后的元素)
filter 函数的作用是“根据返回值是True还是False决定保留还是丢弃该元素。”(真的留下 假的去除)
看下到底返回了什么:
def not_empty(s):
return s and s.strip()
print(not_empty("A"),not_empty(""),not_empty("B"),not_empty(None),not_empty("C"),not_empty(" "))
A B None C
用bool() 检测下 哪些是真,假print(bool(not_empty("A")),bool(not_empty("")),bool(not_empty("B")),bool(not_empty(None)),bool(not_empty("C")),bool(not_empty(" ")))
True False True False True False
明白了不?关于return s and s.strip() 返回值的问题上边的最佳答案写的很明白 :“如果s is None,那么s会被判断为False。而False不管和什么做and,结果都是False,所以不需要看and后面的表达式,直接返回s(注意不是返回False)。
如果s is not None,那么s会被判断为True,而True不管和什么and都返回后一项。于是就返回了s.strip()。”