Python教程補充內容(函式中接收元組、列表和lambda的用法)——簡明python教程學習筆記
本文大量內容來源於沈老師的簡明python教程,其中夾雜部分個人的理解如有偏頗之處還望海涵。
一. 在函式中接收元組和列表
當要使函式接收元組或字典形式的引數的時候,有一種特殊的方法,它分別使用*和**字首。 這種方法在函式需要獲取可變數量的引數的時候特別有用。
下面舉一個很簡單的例子:
def powersum(power,*args) : ''' Return the sum of each argument ''' total = 0 for i in args: total +=pow(i,power) return total >>> powersum(2,3,4) 25 >>> powersum(2,0) 0 >>> powersum(2,1) 1 >>> powersum(2,2) 4 >>> powersum(2,3) 9
從上面的例子中我們可以看出,當在args變數前有字首時,所有多餘的引數都會作為一個元組儲存在args中。具體的來看,當我們輸入powersum(2,3,4)時,將引數2傳遞給形參power,[3,4] 打包為一個元組傳送給args並存儲。
為了說明**args的用法,再舉一個簡單的例子:
>>> def saveloser(a,b,**args): print(a,b) for k in args.keys(): print(k,args[k]) >>>saveloser(1,2,chem='loser',CS='saver',sem='bullshit') 1 2 chem loser CS saver sem bullshit
從以上程式碼片可以看出,傳給**args的實參將被作為字典,因此實參傳遞時會寫成something=‘XXX’的形式,在傳遞實參時,something=‘XXX’ 中的something將作為字典的key,且為字串型別,而‘XXX’則被原樣保留。
二. lambda語句的使用
1.語法
在Python中,lambda的語法是唯一的。其形式如下:
lambda argument_list: expression
其中,lambda是Python預留的關鍵字, argument_list和expression由使用者自定義。
這裡的argument_list是引數列表。它的結構與Python中函式(function)的引數列表是一樣的。
具體來說,argument_list可以有非常多的形式。
例如:
- a, b
- a=1, b=2
- *args
- **kwargs
- a, b=1, *args
- 空
- …
這裡的expression是一個關於引數的表示式。表示式中出現的引數需要在argument_list中有定義,並且表示式只能是單行的。以下都是合法的表示式:
- 1
- sss
- a+c
- sum(x)
- 1 if a>10 else 0
- …
這裡的lambda argument_list: expression表示的是一個函式。這個函式叫做lambda函式。
2.特性
lambda函式的特性有三:
- lambda函式是匿名函式,通俗地說就是沒有名字的函式。lambda函式沒有名字。
- lambda函式的輸入是傳入到引數列表argument_list的值,輸出是根據表示式expression計算得到的值
- lambda函式一般功能簡單:單行expression決定了lambda函式不可能完成複雜的邏輯,只能完成非常簡單的功能。由於其實現的功能一目瞭然,甚至不需要專門的名字來說明。
簡單的lambda函式使用示例:
- lambda x, y: xy 函式輸入是x和y,輸出是它們的積xy
- lambda:None;函式沒有輸入引數,輸出是None
- lambda *args: sum(args); 輸入是任意個數的引數,輸出是它們的和(隱性要求是輸入引數必須能夠進行加法運算)
- lambda **kwargs: 1;輸入是任意鍵值對引數,輸出是1
簡單舉例的程式碼實現:
# Filename the use of lambda
func_double=lambda x:x+2
print((func_double(12)))
#等同於
def func_double2(x):
return(x+2)
可以這樣認為,lambda作為一個表示式,定義了一個匿名函式,上例的程式碼x為入口引數,x+2為函式體。在這裡lambda簡化了函式定義的書寫形式。是程式碼更為簡潔,但是使用函式的定義方式更為直觀,易理解。
3.用法
由於lambda語法是固定的,其本質上只有一種用法,那就是定義一個lambda函式。在實際中,根據這個lambda函式應用場景的不同,可以將lambda函式的用法擴充套件為以下幾種:
- 將lambda函式賦值給一個變數,通過這個變數間接呼叫該lambda函式。
例如,執行語句add=lambda x, y: x+y,定義了加法函式lambda x, y: x+y,並將其賦值給變數add,這樣變數add便成為具有加法功能的函式。例如,執行add(1,2),輸出為3。 - 將lambda函式賦值給其他函式,從而將其他函式用該lambda函式替換。
例如,為了把標準庫time中的函式sleep的功能遮蔽(Mock),我們可以在程式初始化時呼叫:time.sleep=lambda x:None。這樣,在後續程式碼中呼叫time庫的sleep函式將不會執行原有的功能。例如,執行time.sleep(3)時,程式不會休眠3秒鐘,而是什麼都不做。 - 將lambda函式作為其他函式的返回值,返回給呼叫者。
- 將lambda函式作為引數傳遞給其他函式。部分Python內建函式接收函式作為引數。典型的此類內建函式有這些。
(1)filter函式。此時lambda函式用於指定過濾列表元素的條件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]。
(2)sorted函式。此時lambda函式用於指定對列表中所有元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
(3)map函式。此時lambda函式用於指定對列表中每一個元素的共同操作。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。
(4)reduce函式。此時lambda函式用於指定列表中兩兩相鄰元素的結合條件。例如reduce(lambda a, b: ‘{}, {}’.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字元的形式依次結合起來,其結果是’1, 2, 3, 4, 5, 6, 7, 8, 9’。