发布网友 发布时间:2022-04-22 09:18
共4个回答
热心网友 时间:2023-12-24 07:44
关键是理解”s and s.strip()“ 这个表达式的值。Python语法是这么运行的:
如果s is None,那么s会被判断为False。而False不管和什么做and,结果都是False,所以不需要看and后面的表达式,直接返回s(注意不是返回False)。
如果s is not None,那么s会被判断为True,而True不管和什么and都返回后一项。于是就返回了s.strip()。
热心网友 时间:2023-12-24 07:44
关键知识点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后的元素)
热心网友 时间:2023-12-24 07:45
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()。”
热心网友 时间:2023-12-24 07:45
从廖大那刚过来,开始也是不解,后来试了一下理解了
首先要理解and,结果是一个布尔值(True或False),只有当s和s.strip( )【都】为True时结果才为True,不然就是False
因为filter的筛选作用,不是True的统统扔掉,所以我们来重点分析一下为什么 "" ," ",None会被扔掉
1. None:
这个很容易理解,bool(None)=False,在判断s的时候就被扔了
2. "" :
字符串类型,里面什么也没有,只用了两个引号围起来表示他是字符串,bool("")=False,判断时同上
3. " ":
字符串类型,重点来了,【里面有空格】,这和上面那个什么都没有的字符串类型不等价,空格也是东西,这时候bool(" ")=True!!!
所以单靠判断bool(s)的话这种【字符串类型的空格】是可以躲过筛选的,所以需要加入s.strip( )修补这种情况
s.strip( )作用:去除字符串首尾的空格,例如“ A ”得到“A”
在这里 " " 遇到s.strip( )就被打回原形变成了"",bool结果为False