python過濾器和lambda函數

1. 過濾器

Python 具有通過列表解析 將列表映射到其它列表的強大能力。這種能力同過濾機制結合使用,使列表中的有些元素被映射的同時跳過另外一些元素。

過濾列表語法: [ mapping-expression for element in source-list if filter-expression ]

這是列表解析的擴展,前三部分都是相同的,最後一部分,以 if開頭的是過濾器表達式。過濾器表達式可以是返回值爲真或者假的任何表達式 (在 Python 中是幾乎任何東西)。任何經過濾器表達式演算值爲真的元素都可以包含在映射中,其它的元素都將忽略,它們不會進入映射表達式,更不會包含在輸出列表中。

列表過濾介紹

>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> [elem for elem in li if len(elem) > 1]
['mpilgrim', 'foo']
// 由於 Python 會遍歷整個列表,它將對每個元素執行過濾器表達式,如果過濾器表達式演算值爲真,該元素就會被映射,同時映射表達式的結果將包含在返回的列表中,這裏過濾掉了所有單字符的字符串,留下了一個由長字符串構成的列表。

>>> [elem for elem in li if elem != "b"]
['a', 'mpilgrim', 'foo', 'c', 'd', 'd']
// 這裏過濾掉了一個特定值 b ,注意這個過濾器會過濾掉所有的 b, 因爲每次取出 b, 過濾表達式都將爲假。

>>> [elem for elem in li if li.count(elem) == 1]
['a', 'mpilgrim', 'foo', 'c']
// count 是一個列表方法,返回某個值在列表中出現的次數,你可以認爲這個過濾器將從列表中刪除重複元素,返回一個只包含了在原始列表中有着唯一值拷貝的列表。但並非如此,因爲在原始列表中出現兩次的值 (在本例中, b 和 d ) 被完全剔除了,從一個列表中排除重複值有多種方法,但過濾並不是其中的一種。

filter 內置函數

Python2.7.13官方文檔中的介紹: filter(function, iterable)
Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None.

See itertools.ifilter() and itertools.ifilterfalse() for iterator versions of this function, including a variation that filters for elements where the function returns false.

Python內建的filter()函數用於過濾序列

// 保留長度大於1的字符串
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> def func(s):
...     return len(s) > 1

>>> filter(func,li)
['mpilgrim', 'foo']

// 刪除奇數
>>> def del_odd(n):
...     return n % 2 == 0
>>> filter(del_odd,[0,1,2,3,4,5,6,7,8,9])
[0, 2, 4, 6, 8]

2. lambda函數

Python 支持一種有趣的語法, 它允許你快速定義單行的最小函數, 這些叫做
lambda 的函數, 是從 Lisp 借用來的, 可以用在任何需要函數的地方。

>>> def f(x):
...     return x*2 
>>> f(3)
6

>>> g = lambda x : x*2
>>> g(3)
6
// 這是一個 lambda 函數,完成同上面普通函數相同的事情。注意這裏的簡短的語法:在參數列表周圍沒有括號,而且忽略了 return 關鍵字 (隱含存在,因爲整個函數只有一行)。而且,該函數沒有函數名稱,但是可以將它賦值給一個變量進行調用。

>>> (lambda x : x*2)(3)
6
// 使用 lambda 函數時甚至不需要將它賦值給一個變量。

總的來說, lambda 函數可以接收任意多個參數 (包括可選參數) 並且返回單個表達式的值。 lambda 函數不能包含命令, 包含的表達式不能超過一個, 不要試圖向 lambda 函數中塞入太多的東西, 如果你需要更復雜的東西, 應該定義一個普通函數, 然後想讓它多長就多長。

Note: lambda函數 是可選的, 它是一種風格問題,不一定非要使用它們,任何能夠使用它們的地方,都可以定義一個單獨的普通函數來進行替換,應將它們用在需要封裝特殊的、非重用代碼上,避免代碼充斥着大量單行函數。

發佈了48 篇原創文章 · 獲贊 141 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章