python中filter函数的使用问题

#wh注意:filter其实是将列表传入函数中,然后根据函数返回true或者false进行筛选,保留true的结果,筛选掉false的结果
def func(s):
    print s and len(s.strip())>0
    return s and len(s.strip())>0
def f(s):
    print len(s.strip())>0
    return len(s.strip())>0
print filter(func,['akb',' ','dffd '])
print '-------'
print filter(f,['akb',' ','dffd'])

输出结果:

True
False
True
['akb', 'dffd ']
-------
True
False
True
['akb', 'dffd']

这里有个疑问,既然func函数和f函数运行结果一样,那是不是函数里面就直接写

return len(s.strip())>0就可以了?
看一个例子:
def func(s):
    print len(s.strip())>0
    return len(s.strip())>0
print filter(func,['akb',None,' ','dffd '])
结果报错:
True
Traceback (most recent call last):
  File "C:/Users/wt/PycharmProjects/practice1/practice1/shiyanlou/demo.py", line 51, in <module>
    print filter(func,['akb',None,' ','dffd '])
  File "C:/Users/wt/PycharmProjects/practice1/practice1/shiyanlou/demo.py", line 47, in func
    return len(s.strip())>0
AttributeError: 'NoneType' object has no attribute 'strip'
因为字符串才可以使用strip(或者upper,lower等),None类型是不能使用的,所以会报错
看另一个差不多的例子:
def func(s):
    print s and len(s.strip())>0
    return s and len(s.strip())>0
print filter(func,['akb',None,' ','dffd '])
结果:
True
None
False
True
['akb', 'dffd ']

从上面就能看出区别了,这里说一下python的and和or
在python中,and和or执行布尔逻辑运算,但它们返回的不是布尔值,使用and时,如果所有值为真,则返回最后一个真值,如果某个值为假,则返回第一个假值

使用or时,如果所有值为假,则返回最后一个假值,如果有值为真,则返回第一个真值

所以
return s and len(s.strip())>0是一个布尔逻辑判断,如果filter函数中列表元素有None类型,则

(注意:None.strip()的写法是错误的,None类型没有strip,这里只是演示)
它们的结果是None,返回给filter,所以不会报错,但是filter只筛选取出返回是True的值,所以结果列表中是
['akb', 'dffd ']而不是['akb',None, 'dffd ']
因此函数中写return s and len(s.strip())>0的作用是应对列表元素中有像None类型的值,防止出错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值