為什麼 “return s and s.strip()” 在用 filter 去掉空白字元時好使?
阿新 • • 發佈:2018-11-21
如題:
給定一個數組,其中該陣列中的每個元素都為字串,刪除該陣列中的空白字串。
_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() 去除的是空格字串。