“s and s.strip()”在filter中的使用问题

问题描述

“s and s.strip()”在filter中使用时,与单独使用结果不一样,且跟 and本身的用法矛盾。

一、在filter使用的代码块
def not_empty(s):
    return s and s.strip()
print(list(filter(not_empty, ['A ','', ' B', None, 'C', '  '])))  #字符串A和B中都有空格
#运行结果为   ['A ',' B','C']
#字符串空格并没有去除
二、单独使用的代码块
def not_empty(s):
    return s and s.strip()
print(not_empty('A '))   #字符串A中有空格
#运行结果为  'A'
#字符串空格去除了
疑问:

如果and连接的所有值都为真,应该返回最后一个真值。为什么在filter中使用的结果没有返回去除空格的字符串呢?求解答~

filter的逻辑是:遍历数组,把每一个元素传入条件函数(not_empty),条件函数返回为真的元素,会被输出到新的数组中。也就是filter返回的数组,元素个数可能发生变化,元素本身不会发生变化

filter(function, iterable)
function -- 判断函数,对值不做修改

filter的第一个参数(这里是not_empty)用于判断第二个参数中的列表中的每个元素是否满足条件,也就是会对列表中的每个元素调用not_empty,结果为True的元素会出现在结果列表中,结果为False的则会被过滤掉,这个过程中不会改变这个列表中的元素

因为filter中的第一个参数是判断后面的参数是否符合条件,属于过滤条件,并不会改变后面的值,现在你的代码的意思就是说:
把后面列表中的元素符合 s and s.strip()的条件的留下来,不符合的过滤掉
s and s.strip()只是条件,即 not_empty 返回True就留下,返回False就过滤,所以过滤了空和None的值,留下了 'A ', ' B', 'C'