您的位置:首页 > 编程语言 > Python开发

python中filter函数的使用问题

2015-11-26 16:37 861 查看
#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类型的值,防止出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python filter and or return