Lambda函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。 先來看個簡單lambda函數 x和y是函數的兩個參數,冒號後面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變數的和 ...
Lambda函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?
當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。
先來看個簡單lambda函數
>>> lambda x, y : x+y <function <lambda> at 0x102bc1c80>
x和y是函數的兩個參數,冒號後面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變數的和,但作為一個函數,沒有名字如何使用呢?
這裡我們暫且給這個匿名函數綁定一個名字,這樣使得我們調用匿名函數成為可能。
>>> add = lambda x, y : x+y >>> add <function <lambda> at 0x102bc2140> >>> add(1,2) 3
它等同於常規函數
>>> def add2(x, y): ... return x+y ... >>> add2 <function add2 at 0x102bc1c80> >>> add2(1,2) 3
lambda使用場景:
#1.函數式編程: 例如:一個整數列表,要求按照列表中元素的絕對值大小升序排列 >>> list1 = [3,5,-4,-1,0,-2,-6] >>> sorted(list1, key=lambda x: abs(x)) [0, -1, -2, 3, -4, 5, -6] 排序函數sorted支持接收一個函數作為參數,該參數作為 sorted的排序依據,這裡按照列表元素的絕對值進行排序。 當然,我也可以用普通函數來實現: >>> def foo(x): ... return abs(x) ... >>> sorted(list1, key=foo) [0, -1, -2, 3, -4, 5, -6] 只不過是這種方式代碼看起來不夠 Pythonic 而已。 lambda:這是Python支持一種有趣的語法,它允許你快速定義單行的最小函數,可以用在任何需要函數的地方: >>> add = lambda x,y : x+y >>> add(5,6) 11 >>> (lambda x,y:x+y)(5,6) 11 #2.Python中最常見的filter篩選、map小刷子、reduce合併,都可以用lambda表達式來生成! 對於序列來講,有三個函數式編程工具: filter()、map()和reduce()。 map(function,sequence):把sequence中的值當參數逐個傳給function,返回一個包含函數執行結果的list。如果function有兩個參數,即map(function,sequence1,sequence2)。 #求1~20的平方 >>> list(map(lambda x:x*x,range(1,21))) #Python2.x使用map(lambda x:x*x,range(1,21)) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400] filter(function,sequence):對sequence中的item依次執行function(item),將執行結果為True的item組成一個List/String/Tuple(取決於sequence的類型)返回。 #求1~20之間的偶數 >>> list(filter(lambda x:x%2 == 0,range(1,21))) #Python2.x使用filter(lambda x:x%2 == 0,range(1,21)) [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] reduce(function,sequence):function接收的參數個數只能為2,先把sequence中第一個值和第二個值當參數傳給function,再把function的返回值和第三個值當參數傳給function,然後只返回一個結果。 #求1~100之和 >>> from functools import reduce #Python3.x之後需要導入reduce模塊 >>> reduce(lambda x,y:x+y,range(1,101)) 5050 #求1~100之和,再加上10000 >>> reduce(lambda x,y:x+y,range(1,101),10000) 15050 #3.閉包 閉包:一個定義在函數內部的函數,閉包使得變數即使脫離了該函數的作用域範圍也依然能被訪問到。 來看一個用lambda函數作為閉包的例子。 >>> def add(n): ... return lambda x:x+n ... >>> add2 = add(5) >>> add2(15) 20 這裡的lambda函數就是一個閉包,在全局作用域範圍中,add2(15)可以正常執行且返回值為20。之所以返回20是因為在add局部作用域中,變數n的值在閉包的作用使得它在全局作用域也可以被訪問到。