请问这段删除list中空字符串的python代码中的filter是咋起作用的

你要理解Python的if本来就不一定只能输入True或者False,而是对几乎任意值都有一套判断它为真或者为假的规则,你需要去读Python文档,Library不说,Language那一章是要从头到尾读一遍的,它是这么说的:In the context of Boolean operations, and also when expressions are used bycontrol flow statements, the following values are interpreted as false:False, None, numeric zero of all types, and empty strings and containers(including strings, tuples, lists, dictionaries, sets and frozensets). Allother values are interpreted as true. (See the __nonzero__()special method for a way to change this.)5. Expressions在if语句等地方也反复提到了这一段。True和False只是有代表性的真和假的值,方便你写程序而已。True和False是唯一的Boolean类型的值,但不代表只有Boolean类型才有真和假的区别。文章都是在你已经熟读了文档之后给你扩展视角用的,有那么多时间去看别人写的文章,为什么不好好去读一遍官方文档。
■网友
其实题主这里有两个问题:1. filter 函数的功能:廖老师的博客里面写的很清楚filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。意思是什么呢?就是执行 filter(not_empty, ) 的时候,not_empty(\u0026#39;A\u0026#39;) 返回 True 保留、not_empty(\u0026#39;\u0026#39;) 返回 False 丢弃,not_empty(\u0026#39;B\u0026#39;),not_empty(None)丢弃…… 这样最后就得到了 2. bool 判断:True 还是 False ,不仅仅只能靠 True 和 False 来表示,是否为空(空字符串、空list、空字典…)、数值是否为0、对象是否为None,都可以用来表示 True 和 False。回到题中,可以根据字符串是否为空(\u0026#39;\u0026#39;)来做 True 或 False 判断,所以 not_empty(s) 中 return s and s.strip()其实就表达 return True 或 return False。那再将 filter() 函数的功能描述套在题中:filter()把传入的函数 not_empty 作用于 中的每个元素,然后根据返回值是否为空(\u0026#39;\u0026#39;)来决定是否保留该元素,最终得到了 ,这么理解就清楚多了。
■网友
刚刚正好思考了这个问题,你的理解基本上是对的。
x and y 根据具体情况返回x 或者y,而不是True或者False。然后这个x或者y被filter拿到,其实filter会计算它的布尔值,也就是bool(x)或者bool(y)。
注意,None和bool(None)不一样,None经过bool运算以后已经不是None了,bool(None)==False
【请问这段删除list中空字符串的python代码中的filter是咋起作用的】 下面贴上我试验的例子:
print(not_empty(\u0026#39;None\u0026#39;))#输出Noneprint(not_empty(\u0026#39;None\u0026#39;) == False)#输出False,因为None不是Falseprint(not_empty(\u0026#39;None\u0026#39;) == False)#输出True,因为bool(None)是false#not_empty()之中的s and s.strip()语句执行,实际上第一步是if bool(s),由于为False,直接表达式直接返回s#注意这里返回的s是None或\u0026#39;\u0026#39;而不是False,然后filter判断时,其实是if bool(not_empty(x))==False.is_empty(\u0026#39;A\u0026#39;)返回\u0026#39;A\u0026#39;,确实是字符串本身,交给filter时,会判断if bool(is_empty(\u0026#39;A\u0026#39;))==True而不是if (is_empty(\u0026#39;A\u0026#39;))==True

■网友
我也琢磨不通廖雪峰这个逻辑,也跟楼主一样试验了很多次。看了洪宸的回答,又看了题主给的链接地址,两个结合才明白。首先,不是只有TRUE和FALSE代表真假,空字符串,空字典,列表,数字0,none,都是FALSE。


推荐阅读