1. 程式人生 > >為什麼 “return s and s.strip()” 在用 filter 去掉空白字元時好使?

為什麼 “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() 去除的是空格字串。