1. 程式人生 > >Python教程補充內容(函式中接收元組、列表和lambda的用法)——簡明python教程學習筆記

Python教程補充內容(函式中接收元組、列表和lambda的用法)——簡明python教程學習筆記

本文大量內容來源於沈老師的簡明python教程,其中夾雜部分個人的理解如有偏頗之處還望海涵。

一. 在函式中接收元組和列表

\quad當要使函式接收元組或字典形式的引數的時候,有一種特殊的方法,它分別使用*和**字首。 這種方法在函式需要獲取可變數量的引數的時候特別有用。
\quad下面舉一個很簡單的例子:

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函式的特性有三:

  1. lambda函式是匿名函式,通俗地說就是沒有名字的函式。lambda函式沒有名字。
  2. lambda函式的輸入是傳入到引數列表argument_list的值,輸出是根據表示式expression計算得到的值
  3. 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函式的用法擴充套件為以下幾種:

  1. 將lambda函式賦值給一個變數,通過這個變數間接呼叫該lambda函式。
    例如,執行語句add=lambda x, y: x+y,定義了加法函式lambda x, y: x+y,並將其賦值給變數add,這樣變數add便成為具有加法功能的函式。例如,執行add(1,2),輸出為3。
  2. 將lambda函式賦值給其他函式,從而將其他函式用該lambda函式替換。
    例如,為了把標準庫time中的函式sleep的功能遮蔽(Mock),我們可以在程式初始化時呼叫:time.sleep=lambda x:None。這樣,在後續程式碼中呼叫time庫的sleep函式將不會執行原有的功能。例如,執行time.sleep(3)時,程式不會休眠3秒鐘,而是什麼都不做。
  3. 將lambda函式作為其他函式的返回值,返回給呼叫者。
  4. 將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’。