Python lambda 匿名函數,map函數與列表推導講解與運用實例


lambda 匿名函數,map函數與列表推導在Python中也屬於比較基礎的內容,但是在使用過程中往往容易忘記其使用方法。
而如果可以合理的時候使用這些方法,會使我們的開發效率得到大大的提高,同時程序的運行效率也會得到提升。
以下是對lambda 匿名函數,map函數與列表推導進行詳細的講解:

1、lambda 匿名函數

也是一種生成函數對象表達式的方法,與def 定義函數類似,但是它沒有給函數對象取名。

f = lambda x,y : x + y
print(f(2, 3))
# ------運行結果------
# 5
# ------運行結果------

lambda 函數通常用來定義一個簡單,臨時需要使用的函數,當然也正是因爲這一特點,它也經常被用在其他地方。
如在PyQt中,當信號與需要傳參的槽函數連接時,就會用到lambda函數來臨時構建一個匿名函數。

2、map函數

map 函數將可迭代對象中的每一個對象依次傳入需調用的函數,並返回一個新的可迭代對象。如:

def add_one(data):
    return data + 1
int_list = [1,3,5,7,9]
map_obj = map(add_one,int_list)
print(map_obj)
# ------運行結果------
# <map object at 0x000002538E4FC0C8>
# ------運行結果------
# Python 內置可迭代對象可用list方法取出
print(list(map_obj))
# ------運行結果------
# [2, 4, 6, 8, 10]
# ------運行結果------

map 函數與lambda 結合

print(list(map(lambda x: x + 1, int_list)))
# 運行結果與上面自定義的函數相同
# ------運行結果------
# [2, 4, 6, 8, 10]
# ------運行結果------

注意map函數與zip函數的差別,zip的用法爲:
如有兩組分別一一對應的列表(或元祖),就可以使用zip函數來方便的構建字典。

name_list = ['小明', '小李', '小周']
age_list = [18, 20, 22]
name_age_dict = dict(zip(name_list, age_list))
print(name_age_dict)
# ------運行結果------
# {'小明': 18, '小李': 20, '小周': 22}
# ------運行結果------

map 函數也可以作用於多個可迭代對象 如:

print(pow(2, 3)) # 2的3次方
# 相當於計算 2的2次方,3的3次方,4的4次方
map_obj2 = map(pow, [2,3,4], [2,3,4])
print(list(map_obj2))
# ------運行結果------
# [4, 27, 256]
# ------運行結果------

3、列表推導

列表推導用簡單的話來說就是:**對一個系列中的值應用一個任意的表達式,將其結果收集到一個新的列表中並返回。**如:

list_a = [1,2,3,4]
list_b = [str(i) for i in list_a]
print(list_b)
# ------運行結果------
# ['1', '2', '3', '4']
# ------運行結果------

代碼解析:在 in 後面的可迭代對象中進行 for 循環取值,將取出來的值,放入句首的函數或者表達式中進行處理。

用map函數也可實現上述功能:

map_obj3 = map(str,list_a)
print(list(map_obj3))

但明顯列表推導式比map函數使用起來更加簡單。

列表推導和if 判斷

**而且列表推導中還可以增加if判斷條件,**如:

list_c = [str(i) for i in list_a if i < 3]
print(list_c)
# ------運行結果------
# ['1', '2']
# ------運行結果------

增加了if判斷的列表推導式的運行過程,可簡單的理解爲:
先for循環取值,然後if條件判斷,滿足條件的值,再放入句首的函數中進行處理。

多個列表推導

多個列表推導式的情況:

list_d = [1,2,3]
list_e = [(str(i),j**2) for i in list_d
          for j in list_d ]
print(list_e)
# ------運行結果------
# [('1', 1), ('1', 4), ('1', 9), ('2', 1),
# ('2', 4), ('2', 9), ('3', 1), ('3', 4), ('3', 9)]
# ------運行結果------

多個for循環的結果,就像是自己寫的兩層嵌套的for循環一樣,出現的結果數量是內層循環次數乘以外層循環數,也叫多個for循環的笛卡爾積。

多個列表推導式與多個if 條件

list_f = [(str(i),j) for i in list_d if i < 3
                     for j in list_d if j < 3]
print(list_f)
# ------運行結果------
# [('1', 1), ('1', 2), ('2', 1), ('2', 2)]
# ------運行結果------

看起來有點複雜,但是結合前面的內容,理解起來應該很容易。其基本過程也是for循環取值,然後判斷,只不過又多層for循環而已。

4、字典推導式、集合推導式

從列表推導式衍生出來的還有字典推導式,集合推導式。如:

字典推導式:

list_g = [1,2,3,4]
dict_a = {i:i**2 for i in list_g}
print(dict_a)
# ------運行結果------
# {1: 1, 2: 4, 3: 9, 4: 16}
# ------運行結果------

注意此種情況:

dict_b = {i:j**2 for i in list_g for j in list_g}
print(dict_b)
# ------運行結果------
# {1: 16, 2: 16, 3: 16, 4: 16}
# ------運行結果------

本來是要產生笛卡爾積個數量的結果,但是由於字典的鍵不能重複,所以鍵對應的值都爲最後的內層循環4的平方的值,這裏需要注意一下。

還有一種情況是:

list_h = [('小明', 18), ('小李', 20), ('小周', 22)]
dict_c = {key:value for key,value in list_h}
print(dict_c)
# ------運行結果------
# {'小明': 18, '小李': 20, '小周': 22}
# ------運行結果------

集合推導式

list_g = [1,2,3,4]
set_a = {str(i) for i in list_g}
print(set_a)
# ------運行結果------
# {'1', '4', '3', '2'}
# ------運行結果------

以上內容均爲原創,未經允許,禁止轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章