filter

看到一个比较有趣的程序

def not_empty(s):

  return s and s.strip()

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

结果是['A', 'B', 'C   ']

这里的函数我本来自己写成如下:

def not_empty(s):

  return s.strip()

报错,提示None没有strip这个属性,所以第一个代码段中用到了return s and s.strip(),连顺序都不能变,否则还是会出错

这里解释一下:

Python中and是从左到右计算,若所有值为真,则返回最后一个值,若存在假,则返回第一个假值,所以正常情况下

1、'A'进入filter之后,先计算s='A'为真,再计算s.strip()为真,所以返回s.strip()='A'

这是一个真值,所以'A'成功筛选了

2、''进入filter之后,先计算s=''为假,所以返回s=''

这是一个假值,所以''筛选失败

3、'C   '进入filter之后,先计算s='C   '为真,再计算s.strip()='C'为真,所以返回s.strip()='C'

这是一个真值,所以'C   '成功筛选

4、None进入filter之后,先计算s=None为假,所以返回s=None

这是一个假值,所以None筛选失败

如果使用s.strip() and s,就会报错提示None没有strip()

原文地址:https://www.cnblogs.com/vonkimi/p/6858997.html