Python filter函数笔记(一)

在雪峰前辈的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,需要用一个listfilter函数的筛选结果接收:

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()就不会被执行,因此程序就不会报错。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值