程序員秒解 Python 三大難題,他做對了什麼?
作者 | veelion
責編 | 胡巍巍
函數lambda、map、filter,是Python中的重要知識點。本篇文章,將通過示例,來介紹Python中的lambda、map、filter函數的使用方法。
lambda
lambda操作符(或lambda函數)通常用來創建小巧的,一次性的匿名函數對象。它的基本語法如下:
lambda操作符可以有任意數量的參數,但是它只能有一個表達式,且不能包含任何語句,返回一個可以賦值給任何變數的函數對象。
下面通過一個例子來理解一下。首先看看一個Python函數:
上述函數名為add, 它需要兩個參數x和y,並返回它們的和。接下來,我們把上面的函數變成一個lambda函數:
add = lambda x, y : x + y
print(add(1,2))# Output: 3
在lambda x, y : x + y中,x和y是函數的參數,x+y是表達式,它被執行並返回結果。
lambda x, y : x + y返回的是一個函數對象,它可以被賦值給任何變數。在本例中函數對象被賦值給了add變數。如果我們查看add的type,可以看到它是一個Function。
絕大多數lambda函數作為一個參數傳給一個需要函數對象為參數的函數,比如map,reduce,filter等函數。
map
map的基本語法如下:
map(function_object, iterable1, iterable2, ...)
map函數需要一個函數對象和任意數量的iterables,如list、dictionary等。它為序列中的每個元素執行function_object,並返回由函數對象修改的元素組成的列表。
示例如下:
defadd2(x):
returnx+2
map(add2, [1,2,3,4])
# Output: [3,4,5,6]
在上面的例子中,map對list中的每個元素1,2,3,4執行add2函數並返回[3,4,5,6]。接著看看,如何用map和lambda重寫上面的代碼:
map(lambdax:x+2,[1,2,3,4])
#Output:[3,4,5,6]
僅僅一行即可搞定!
使用map和lambda迭代dictionary:
dict_a = [
{"name":"python","points":10},
{"name":"java","points":8}
]
map(lambdax:x["name"], dict_a)
# Output: ["python", "java"]
map(lambdax:x["points"]*10, dict_a)
# Output: [100, 80]
map(lambdax:x["name"] =="python", dict_a)
#Output: [True, False]
以上代碼中,dict_a中的每個dict作為參數傳遞給lambda函數。lambda函數表達式作用於每個dict的結果作為輸出。
map函數作用於多個iterables:
list_a = [1, 2, 3]
list_b = [10, 20, 30]
map(lambda x, y: x + y, list_a, list_b)
# Output: [11, 22, 33]
這裡,list_a和list_b的第i個元素作為參數傳遞給lambda函數。
在Python3中,map函數返回一個惰性計算(lazily evaluated)的迭代器(Iterator)或map對象。就像zip函數是惰性計算那樣。
我們不能通過index訪問map對象的元素,也不能使用Len()得到它的長度。
但我們可以強制轉換map對象為list:
filter
filter的基本語法如下:
filter(function_object, iterable)
filter函數需要兩個參數,function_object返回一個布爾值(boolean),對iterable的每一個元素調用function_object,filter只返回滿足function_object為True的元素。
和map函數一樣,filter函數也返回一個list,但與map函數不同的是,filter函數只能有一個iterable作為輸入。
示例:
返回偶數:
a = [1, 2, 3, 4, 5, 6]
filter(lambda x : x % 2 == 0, a)
# Output: [2, 4, 6]
過濾dicts的list:
dict_a = [
{"name":"python","points":10},
{"name":"java","points":8}
]
filter(lambda x : x["name"] =="python", dict_a)
# Output: [{"name":"python","points":10}]
和map一樣,filter函數在Python3中返回一個惰性計算的filter對象或迭代器。我們不能通過index訪問filter對象的元素,也不能使用Len()得到它的長度。
list_a = [1, 2, 3, 4, 5]
filter_obj = filter(lambda x: x % 2 == 0, list_a)
# filter object
even_num = list(filter_obj)
# Converts the filer obj to a list
print(even_num)# Output: [2, 4]
作者:veelion,具有十年開發經驗,主要使用Python、C++語言,從事網路爬蟲、搜索引擎、自然語言理解處理等領域的研發工作。
聲明:本文為作者投稿,版權歸對方所有。


※堅守普惠 AI,看華為雲如何讓 AI 落地!
※圖靈獎得主Silvio Micali上海之行講了啥?都在這裡了
TAG:CSDN |