在雪峰前辈的filter教程中是如此介绍filter函数的:
filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
详细来说是这个样子:
#具有筛选功能、可返回True和False的函数
def not_empty(s):
return s and s.strip()
#待筛选的序列
Array = ['A','','B',None,'C',' ']
#filter(函数 , 序列)
list(filter(not_empty,Array))
filter会将序列中的每一个元素传入函数中进行计算,若函数计算某一元素后返回了True,那么这个元素就会得以保留,反之函数计算得到了False,那这个元素就会被筛除掉。最终filter将返回一个所有保留元素组成的Iterator,需要用一个list将filter函数的筛选结果接收:
L = list(filter(not_empty,Array))
然后举了一个这样的例子:
可以用以下函数将序列中的空字符删除掉:
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty,['A','','B',None,'C',' '])))
#输出 ['A','B','C']
作为Python的初学者其实这个函数还是有一点难以理解,为什么这个函数能直接将""(空字符串)、" "(只包含空格的字符串)、None(None Type对象)这三种字符串给直接删除掉呢?
其实这个函数包含了两大知识点:
一、非零数值、非空字符串、非空list等在条件判断中为True,其他皆为False
在Python中非零数值、非空字符串、非空list在判断中为True,假设有如下的代码:
#1 非空字符串
if "A" :
print("True")
else:
print("Flase")
if " ":
print("True")
else:
print("Flase")
#2 非空list
if [1,2,3]:
print("True")
else:
print("Flase")
#3 非零数值
if -1:
print("True")
else:
print("Flase")
上述几个例子无一例外会输出True,而在如下代码中则全部会输出Flase:
#1 空字符串
if "" :
print("True")
else:
print("Flase")
#2 空list
if []:
print("True")
else:
print("Flase")
#3 零数值
if 0:
print("True")
else:
print("Flase")
#4 Nony Type 对象
if None:
print("True")
else:
print("Flase")
那问题来了,既然s.strip()可以将仅包含空格的字符串直接缩成空字符串,为什么我们还要写成return s and s.strip()而不直接写成return s.strip()呢?这就是第二点
二、None Type不能接.strip()函数
其实这里还有一个小知识点,那就是and的运算规则,众所周知and是个二目运算符,它的用法如下:
变量1 and 变量2
而and的属性决定了只要两个变量有一个为False那结果一定就是False,因此只要当变量1为False,变量2就不会被计算。为什么要说这个知识点呢,因为我们看到了Array中我们传入了一个None Type对象——None。而None.strip()是不合法的语句,它不具有这个属性,因此如果我们只写return s.strip()的话,当传入了None就会报错,而我们写成了 s and s.strip(),这句话在判断None的时候就变成了:
None and None.strip()
由于None等价于False,因此None.strip()就不会被执行,因此程序就不会报错。