一. 匿名函數
Python使用 lambda 來創建匿名函數。所謂匿名函數,它與用 def 關鍵字定義的函數相比,沒有函數名稱。
語法:
lambda [para1, para2, ...]: expression
從匿名函數的定義格式可以看出:
1. lambda后沒有跟函數名,這就是匿名函數名稱的由來. 2. [para1, para2, ...]是一個參數列表,它是可選的,而且是任何類型的. 3. expression表達式實現匿名函數功能的過程,並返回操作結果, 具有通常函數return的功能. 4. 整個匿名函數要在一行內實現所有定義.
1.2 代碼示例
>>> lambda x, y: x+y # 在一行定義匿名函數 <function <lambda> at 0x00000217D39E1F28> # 打印上面 >>> a = lambda x, y: x + y # 定義匿名函數並賦值給a >>> a(2, 3) # a具有匿名函數的功能, 通過參數傳值 5 # 輸出結果
說明:
lambda的冒號前面表示的是參數,冒號后面的是表達式. 注意, lambda 可以接受任意多個參數, 但只能有一個表達式.
1.3 匿名函數的優點
1 使用Python寫一些腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精簡. 2 對於一些抽象的,不會被別的地方再重復使用的函數,有時候函數起個名字也是個難題,使用lambda不需要考慮命名的問題. 3 使用lambda在某些時候能使代碼更容易理解.
二. 匿名函數在內置函數中的使用
匿名函數一般不單獨使用,經常與一些內置函數一塊使用.
能使用匿名函數的內置函數為:
map,filter,sorted ,max,min
記住上面這五個!!!
2.1 在 map 函數中的使用
map()函數接受兩個參數.一個是函數, 一個是 Iterable(可迭代).
map 將傳入的函數依次作用到序列的每個元素上., 並把結果作為新的 Iterator 返回,注意返回結果需要轉為list.
舉個例子:
def f(x): return x * x lis = [1, 2, 3, 4, 5] res = map(f, lis) # 求列表中每個數的平方 print(res) # 此時返回的是一個對象 <map object at 0x00000254573B0B38> print(list(res)) # 可以直接用list()求結果 [1, 4, 9, 16, 25]
用 lambda 表示就是這樣:
lis = [1, 2, 3, 4, 5] res = map(lambda x: x*x, lis) # 求列表中每個數的平方 print(res) # 同上面的例子一樣,返回的是一個對象 <map object at 0x000001D102040B38> print(list(res)) # 用list()獲取結果 [1, 4, 9, 16, 25]
L1 = [12, 3, 12, 2, 1, 2, 35]
result1 = map(lambda x: str(x).strip().zfill(3), L1) #map方式實現
print(list(result1))
['012', '003', '012', '002', '001', '002', '035']
res=map(lambda x:x*x,[1,2,3,4,5,6])
print(list(res)) #按照條件,循環后面傳入的參數的
[1, 4, 9, 16, 25, 36]
2.2 在 filter 函數中的使用
和map()類似, filter()也接受一個函數,一個序列.
與map()不同的是,filter()把傳入的函數依次作用於每個元素, 然后根據返回值是True還是False來決定保留還是丟棄該元素.
filter() 會根據判斷結果自動過濾掉不符合條件的元素, 只返回由符合條件的元素組成的新列表(需要list一下).
舉個例子:
# 在一個列表中, 刪除偶數, 保留奇數 def is_odd(x): return x%2 == 1 lis = [1, 2, 3, 4, 5, 6, 7, 8, 9] res = filter(is_odd, lis) print(res) # 注意, 這里依舊返回的是對象 <filter object at 0x0000022832D00C18> print(list(res)) # 這樣返回的才是我們想要的結果 [1, 3, 5, 7, 9]
用 lambda 表示就是這樣:
# 在一個列表中, 刪除偶數, 保留奇數 lis = [1, 2, 3, 4, 5, 6, 7, 8, 9] res = filter(lambda x: x % 2 == 1, lis) print(res) # 同上例子,返回的是對象. <filter object at 0x0000020A8F240B38> print(list(res)) # 這樣就是我們想要的結果 [1, 3, 5, 7, 9]
def filter_test(x):
return x>5
result = filter(filter_test, [12, 3, 12, 2, 1, 2, 35])
print(list(result))
[12, 12, 35]
用 lambda 表示就是這樣:
result = filter(lambda x: x > 5, [12, 3, 12, 2, 1, 2, 35])
print(list(result))
[12, 12, 35]
2.3 在 max 函數中的使用
max() 函數返回給定參數的最大值.
舉個例子:
# 找出字典中值最大的那個key prices = { 'A': 123, 'B': 450.1, 'C': 12, 'E': 444, } res = max(prices, key=lambda x: prices[x]) 按照值取最大,返回key print(res) B
2.4 在 min 函數中的使用
min() 函數返回給定參數的最小值.
用法和 max() 一樣
2.5 在 sorted 函數中的使用
排序是在程序中經常用到的算法, 如果是數字, 我們可以直接比較. 而如果是字符串或者是dict, 我們就可以用 sorted() 來進行排序.
sorted() 語法:
sorted(Iterable,key = None,reverse = False)
- Iterable: 可迭代的.
- key:排序規則(排序函數). 在sorted內部將可迭代對象的每一個元素傳遞給這個函數的參考值,根據函數運算的結果進行排序.
- reverse:排序規則. reverse = True 降序 , reverse = False 升序(默認).
舉個例子:
# 按絕對值大小排序 >>>sorted([2, 1, -3, 8, -5], key = abs) [1, 2, -3, -5, 8]
用 lambda 表示就是這樣:
>>>sorted([2, 1, -3, 8, -5], key = lambda x: abs(x)) [1, 2, -3, -5, 8]
再來個例子:
# 按照字母長度排序, 如果長度一樣, 則按照字母順序(ASCII)排序. ret = sorted(['cat', 'bird', 'dog', 'bira', 'animal'], key=lambda x: len(x)) print(ret) -> ['cat', 'dog', 'bird', 'bira', 'animal']
可以根據可迭代的對象中的元素進行排序:
# sort和sorted的區別,sorted有返回值 sort沒有
# key傳一個函數名:可以循環的都可以排序,字符串、字典、列表、元組
多維數組排序
name = [ ('小名',5,['xx',11]), ['xiaohei',19,['xx',13]], ['xiaobai',20,['xx',18]], ['xiaolan',10,['xx',20]] ] def use_key(x): return x[1] l4 = sorted(name,reverse=True,key=lambda x:x[-1][-1]) print(l4) [['xiaolan', 10, ['xx', 20]], ['xiaobai', 20, ['xx', 18]], ['xiaohei', 19, ['xx', 13]], ('小名', 5, ['xx', 11])]
列表排序
print(sorted([2, 31, 34, 6, 1, 23, 4])) # 排序 [1, 2, 4, 6, 23, 31, 34]
字典排序:
d={'a':1,'b':2} print(d.items()) l2 = sorted(d.items(),reverse=True,key=lambda x:x[0]) print(l2) l3 = sorted(d.items(),reverse=True,key=lambda x:x[1]) print(l3) dict_items([('b', 2), ('a', 1)]) [('b', 2), ('a', 1)] [('b', 2), ('a', 1)]