1. 程式人生 > >python3基礎(七)-遞迴函式和匿名函式

python3基礎(七)-遞迴函式和匿名函式

1、遞迴函式

函式內呼叫自己本身函式,就叫做遞迴函式。
計算一個數字的階乘n!=1*2*3*4*......*n
公式演變:
n! = 1 * 2 * 3 * 4 * ...... * (n - 2) * (n - 1) * n
    = n * (n - 1) * (n - 2) * ...... * 4 * 3 * 2 * 1
    = n * (n - 1)!
注意:
1、在函式的內部呼叫自己本身。
2、遞迴函式本質是一個方法的迴圈呼叫。有可能出現死迴圈。
3、一定要定義遞迴的邊界(什麼時候退出迴圈)

def factorial(n):
	if n < 0:
		print("負數沒有階乘")
	elif n == 0 or n == 1:
		#定義函式的終止條件
		return 1
	else:
		#定義函式的階乘
		return n * factorial(n - 1)

a = factorial(10)
print(a)

2、匿名函式

用lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。lambda函式的語法只包含一個語句:
lambda [arg1 [, arg2, ......, argn]]:expression    # lambda 引數 : 表示式
例如:
普通的函式實現一個簡單的加法。
def add(a, b):
    return a + b
print(add(11, 22))
使用匿名函式的方式實現一個簡單的加法:
func = lambda x, y : x + y
print(func(11, 22))    #func雖然是一個變數,但是就相當於是一個函數了

常用招數-使用匿名函式方式實現動態函式:
def test(a, b, fuction):
    result = function(a, b)    #在此函式裡面,並未指定對a,b兩個變數的操作方式,最終的結果與傳入的匿名函式的實現方式為結果
    return result
print(11, 22, lambda x, y : x + y)    #此處傳入的匿名函式對a, b兩個引數的操作為執行相加

list.sort(key=None,reverse=False)    #排序函式,有兩個預設引數,key是指定按照什麼引數來進行排序,reverse是指定按升序還是降序,True為降序,False為升序
例如:
nums=[1, 3, 6, 2, 4]
nums.sort()    #如果不帶引數,則代表sort()函式會取出nums當中每個元素,賦值給key,然後做對比排序。由於列表當中的元素是數字型別,所以是可以比對大小進行排序的。
然而如果列表當中的值是一個一個的字典呢?
stus=[{"name":"zs", "age":"10"},{"name":"ls", "age":"30"},{"name":"ww", "age":"20"}]
如果呼叫stus.sort()則會報錯。因為字典與字典之間無法進行對比排序,比如{"name":"zs", "age":"10"}和{"name":"ls", "age":"30"}是完全無法比對的。
然而字典之間的比對,我們一般不是通過字典本身來進行比對排序,是通過字典內的某一個值進行排序,這種情況下應該怎麼辦呢?
因為sort()函式在比對時,會將每個值取出,賦值給key,那麼在比對數值型別的列表的時候,key就是一個變數,特別方便比較。而如果key被人為的指定成了一個匿名函式呢?當key被賦值成一個字典的時候,是不是就可以通過匿名方法的引數,獲取到這個字典,然後再通過表示式取出字典當中的某一個值後,再重新賦值給key,這樣就可以進行比較了。
例如:
stus.sort(key = lambda x : x["name"])    #通過匿名函式取出字典變數當中的name值作對較
stus.sort(key = lambda x : x["age"])    #通過匿名函式取出字典變數當中的age值作對較

在上述的例子當中,雖然實現了函式的動態,但是整個程式卻是死的,程式碼執行結果永遠固定不變,那麼怎麼實現由使用者輸入指令呢?
def test(a, b, fuction):
    result = function(a, b)
    return result
func=input("請輸入")    #在python2當中,這樣就可以了
func_new=eval(func)    #由於在python3當中輸入的內容全部被當成字串,所以需要使用eval函式進行轉換
print(11, 22, func_new)

那麼lambda x, y : x + y則是由使用者輸入,則實現了動態程式。

3、資料交換

a=11
b=22
a,b=b,a
可變型別不能作為字典的key

作者:滄水巫雲
部落格:http://blog.csdn.NET/amir_zt/
以上原創,轉載請註明出處,謝謝。
https://blog.csdn.net/amir_zt/article/details/83090567