前文說到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。內置經常使用高階函數就分享到這裏啦,更多分享請關注微信公衆號