为什么 “return s and s.strip()” 在用 filter 去掉空白字符时好使?

如题:

给定一个数组,其中该数组中的每个元素都为字符串,删除该数组中的空白字符串。

_list = ["A", "", "", "B", "", "C", "", "", "D", "", ' ']

根据廖大文章,答案是这样的:
1 def not_empty(s):
2     return s and s.strip()
3 
4 print(list(filter(not_empty, _list)))

结果:

['A', 'B', 'C']

 

那么问题来了,

Why does “return s and s.strip()” work when using filter?

这其实是一道逻辑题(手动狗头)。听我娓娓道来。

 

先把涉及的知识点说下:

1. filter原理:

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象。

此函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数

然后返回 True 或 False,最后将返回 True 的元素放到新列表中。 格式:filter(function, iterable)

2. python的and 返回值

>>> 'a' and 'b'
'b'
>>> '' and 'b'
''

  >>> 'b' and ''
  ''

>>> 'a' and 'b' and 'c'
'c'

  >>> '' and None and 'c'
  ''

在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。

如果布尔上下文中的某个值为假,则 and 返回第一个假值

3. strip()方法作用

去掉字符串前、后空白字符 (即空格)

>>> print("     j d s fk     ".strip())
j d s fk

 

 

注意听:return s and s.strip() 中的 s/s.strip()  如果是空字符串 ===》 它为假,根据and 返回值,s and s.strip() 一定返回第一个假值 ===》所以函数返回给filter() 为False,即此元素被过滤掉 ===》filter(返回 True 的元素放到新列表中),即新列表中存储的都是非空、非空格字符串。

也就是说 用filter()来过滤元素, 函数中 s去除的是空字符串,s.strip() 去除的是空格字符串。

 

 



猜你喜欢

转载自www.cnblogs.com/liangmingshen/p/9992845.html
s
a's