python 之匿名函式(lambda)
阿新 • • 發佈:2020-12-30
什麼是匿名函式?匿名函式就是不用def關鍵字,使用lambda關鍵字定義的一個函式。匿名函式簡約而不簡單。
匿名函式的格式:
lambda[ paramters1, paramters2 ,...... ]: expression
1.lambda是一個表示式,而不是一個語句
2.lambda 的主體是隻有一行的簡單表示式,並不能擴充套件成一個多行的程式碼塊
匿名函式和常規函式一樣,引數都是根據需要可填可不填,返回的都是一個函式物件(function object),它們的用法也極其相似。
下面分別用lambda 、def 定義一個帶有引數和無引數的函式
sum = lambda x, y: x + yprint(sum(1, 0))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py 1
等價於
def sum(x, y): return x +y print(sum(1, 0))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py 1
result = lambda: False print(result)
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py <function result at 0x031C08A0>
等價於
def result(): return False print(result)
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py <function result at 0x031C08A0>
lambda能夠出現在一些def不能出現的地方,如列表常量中
list1 = [(lambda x: x)(x) for x in range(5)] print(list1)
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py [0, 1, 2, 3, 4]
lambda可以作為某些函式的引數
import os def read_file(path, name): filename = path(name) with open(filename, encoding='utf-8') as f: datas = f.readlines() print(datas) print(read_file(path=(lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))), name="set_1.py"))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py ['# # 集合中不能含list、dict\n', '# set2 = {"rice", 1, (True, False)}\n', '# # 通過set()函式傳入可迭代物件建立集合\n', '# set3 = set(range(10))\n', '# set4 = set(list(range(10)))\n', '# set5 = set(tuple(range(10)))\n', '# set6 = set("hello")\n', '# print(set2)\n', '# print(set3)\n', '# print(set4)\n', '# print(set5)\n', '# print(set6)\n', '\n', '# set1 = {2, 3, 4, 6, 5, 10}\n', '# set2 = {1, 3, 4, 9, 10}\n', '# # 集合的交集, 取共有的元素\n', '# result1 = set1 & set2\n', '# # 集合的差集,取集合2中不存在的元素\n', '# result2 = set1 - set2\n', '# # 集合的並集,取集合1、2所有元素\n', '# result3 = set1 | set2\n', '# # 集合的對稱差,取集合1、集合2中不相同的元素\n', '# result4 = set1 ^ set2\n', '# print(result1)\n', '# print(result2)\n', '# print(result3)\n', '# print(result4)\n', '\n', 'list1 = [2, 2, 4, 5, 6, 6, 9, 0, 9]\n', '# 利用集合去重\n', 'set1 = set(list1)\n', '# 再將集合轉成列表\n', 'list1 = list(set1)\n', 'print(list1)'] None
lamada 和def定義的函式一樣,也可以巢狀
result = (lambda x: (lambda y: x+y)) # 這就是一個用lambda實現的閉包,與普通閉包一樣,內嵌lambda表示式可以獲得上層lambda函式的變數 z = result(3) print(result(3)) print(z(3))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py <function <lambda>.<locals>.<lambda> at 0x03C3A780> 6
匿名函式的應用
filter函式
# filter() 函式用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表,該函式接收兩個引數 # 其中第一個為函式,第二個為序列,序列的每個元素作為引數傳遞給函式進行判斷,然後返回 True 或 False,最後將返回 True 的元素放到新列表中 data = filter(lambda x: x < 5, [3, 6, 7, 9, 0]) print(list(data))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py [3, 0]
map函式
# map()會根據提供的函式對指定序列做對映 # 第一個引數 function 以引數序列中的每一個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表。 data = map(lambda x: x < 5, [3, 6, 7, 9, 0]) print(list(data))
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py [True, False, False, False, True]
reduce函式
# reduce() 函式會對引數序列中元素進行累積。 # reduce中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到一個結果 from functools import reduce data = reduce(lambda x, y: x + y, [3, 6, 7, 9, 0]) print(data)
"D:\Program Files\Python\Python37-32\python.exe" D:/demo/lambda_1.py 25