python 高階函數之filter

前文說到python高階函數之map,相信你們對python中的高階函數有所瞭解,這次繼續分享python中的另外一個高階函數filter。python

先看一下filter() 函數簽名微信

>>> help(filter)
Help on class filter in module builtins:

class filter(object)
 |  filter(function or None, iterable) --> filter object
 |
 |  Return an iterator yielding those items of iterable for which function(item)
 |  is true. If function is None, return the items that are true.

和map()函數相似,filter()也是接收一個函數和一個序列做爲參數,和map() 不一樣的是,filter把傳入的函數依次做用於序列中的每個元素,並根據其返回值是True 仍是 False 來決定是否保留該元素,達到過濾的效果。函數

 

下面舉例說明:ui

從一個list文件列表中篩選出已 .py 結尾的文件,文件列表以下:spa

files = ["report.py","log.txt", "logger.py",
"config.txt", "main.py"]

 

首先定義一個函數,其功能是根據傳入的文件判斷code

>>> def is_python_file(file_name):
...     if file_name.endswith(".py"):
...             return True
...     else:
...             return False
...

 

應用filter函數對象

>>> list(filter(is_python_file, files))
['report.py', 'logger.py', 'main.py']

以上就達到了篩選的功能,很牛吧,不用本身再寫一個 for 循環進行判斷了。
it

第一個參數傳入 is_python_file 函數對象io

第二個參數傳入 序列 files列表function

多說一句,有的小夥伴對傳入的參數函數對象(沒加括號)可能有疑惑,若是函數加(),表示函數執行的結果傳入 filter

 

若是感受定義一個簡單的函數麻煩,咱們可使用匿名函數lambda

lambda f:f.endswith(".py")

>>> list(filter(lambda f:f.endswith(".py"), files))
['report.py', 'logger.py', 'main.py']

 

其實還可使用列表推導式

>>> [ f for f in files if f.endswith(".py") ]
['report.py', 'logger.py', 'main.py']

 

python中其餘的高階函數使用方式也是相似的,好比sorted、reduce、reversed。內置經常使用高階函數就分享到這裏啦,更多分享請關注微信公衆號

相關文章
相關標籤/搜索