#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类型的值,防止出错。