Python小技巧之列表推導式到匿名函數
最近又看了一遍python的基礎知識,所謂溫故而知新,哈哈哈,所以在這裏寫下自己的一些見解,我覺得在實戰過程中還是非常有用的一些小技巧,也分享給大家,如果寫的不好,請大家留言或者私信我,一起學習一下!
下面進入正題:
列表推導式
個人覺得列表推導式非常強大,在實戰中也經常用到
所謂列表推導式就是使用列表結合for循環快速創建一個新的列表,列表推導式返回的是一個列表類型
Python在執行列表推導式時,會對可迭代對象 L 進行迭代,將每一次迭代的值賦給循環變量 x ,然後收集變量表達式 x ** 2 的計算結果,最終由這些結果構成了新的列表,也就是列表推導式所返回的值。
只要支持 for 循環進行迭代的對象,都可以對它使用列表推導式。
舉例(找出列表中所有’a’的元素,並添加到新列表)
list = ['a','b','a','d','e','a','g']
result = []
for i in list:
if i == 'a':
result.append(i)
print(result)
結果
['a', 'a', 'a']
那麼有了列表推導式,我們可以改寫成
print([i for i in list if i == 'a'])
結果
['a', 'a', 'a']
如果我們列表中的元素還需要做其他運算,比如:
def add(parms):
res = ''.join(parms + 'pple')
return res
再結合上面的列表推導式
print([add(i) for i in list if i == 'a'])
結果
['apple', 'apple', 'apple']
列表推導式的一般語法可以表示爲 [ expression for item in list ],如果你希望加上一些布爾型條件語句,那麼上面的語法可以修改爲 [ expression for item in list if conditional ] 或者
[
expression for x in X [if condition]
for y in Y [if condition]
…
for n in N [if condition]
]
舉例(爲了方便好看,寫成下面格式)
print(
[
(x, y, z) for x in range(6) if x % 3 == 0
for y in range(6) if y % 3 == 1
for z in range(6) if z % 2 ==1
])
結果
[(0, 1, 1), (0, 1, 3), (0, 1, 5), (0, 4, 1), (0, 4, 3), (0, 4, 5), (3, 1, 1), (3, 1, 3), (3, 1, 5), (3, 4, 1), (3, 4, 3), (3, 4, 5)]
Lambda 和 Map
Lambda 是一種匿名函數,也非常好用的,它不需要定義函數名,可以做最直觀的運算
還是以上面的例子爲例
def add(parms):
res = ''.join(parms + 'pple')
return res
直接寫成
add = (lambda parms: ''.join(parms+ 'pple'))
print(add('a'))
結果
apple
那麼我們爲什麼要用上面的表達式?很大一部分原因在於,當我們想執行一些簡單運算時,可以不需要定義真實函數就能完成。例如排序列表元素,一種直觀的方法可以使用 sorted() 方法:
print(sorted([0, -3, 3, -2, 2], key=lambda x: x ** 2, reverse=True))
結果
[-3, 3, -2, 2, 0]
上面就是根據每個元素的二次方進行從大到小的排列
Map 是一個簡單的函數,屬於python的內置函數,它可以將某個函數應用到其它一些序列元素,例如列表
最簡單的例子
x = map(lambda x: x ** 2,[1,2,3])
print(list(x))
結果
[1, 4, 9]
注意:map函數返回的迭代器只能迭代一次,迭代之後會自動清空
x = map(lambda x: x ** 2,[1,2,3])
print(list(x))
print(list(x))
結果
[1, 4, 9]
[]
上面輸出了兩次,第一次有數據,第二次爲空,所以我們在開發過程中,將map函數返回的迭代器保存轉爲list,可以多次使用
x = map(lambda x: x ** 2,[1,2,3])
y = list(x)
print(y)
print(y)
結果
[1, 4, 9]
[1, 4, 9]
有興趣的朋友可以看看源碼