關乎Python lambda你也看得懂

文章首發於個人技術博客:你能夠在上面看到更多的Python教程python爬蟲java

經過示例介紹Python中的lambda,map,filter 函數的使用方法。python

lambda

lambda 操做符(或 lambda函數)一般用來建立小巧的,一次性的匿名函數對象。它的基本語法以下:express

lambda arguments : expression

lambda操做符能夠有任意數量的參數,可是它只能有一個表達式,且不能包含任何語句,返回一個能夠賦值給任何變量的函數對象。python爬蟲

下面經過一個例子來理解一下。首先看看一個Python函數:函數

def add(x, y):
    return x+y

# call the function
add(1, 2)  # Output: 3

上述函數名爲add, 它須要兩個參數x和y,並返回它們的和。
接下來,咱們把上面的函數變成一個lambda函數:lua

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,能夠看到它是一個functionspa

type(add)  # Output: function

絕大多數lambda函數做爲一個參數傳給一個須要函數對象爲參數的函數,好比map,reduce,filter等函數。code

map

map的基本語法以下:對象

map(function_object, iterable1, iterable2, ...)

map函數須要一個函數對象和任意數量的iterables,如list,dictionary等。它爲序列中的每一個元素執行function_object,並返回由函數對象修改的元素組成的列表。
示例以下:blog

def add2(x):
    return x+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(lambda x: 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(lambda x : x['name'], dict_a) # Output: ['python', 'java']
  
map(lambda x : x['points']*10,  dict_a) # Output: [100, 80]

map(lambda x : 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:

map_output = map(lambda x: x*2, [1, 2, 3, 4])
print(map_output) # Output: map object:

list_map_output = list(map_output)

print(list_map_output) # Output: [2, 4, 6, 8]
 

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]
相關文章
相關標籤/搜索