標籤:包含 深度 div src == img 錯誤 函數定義 span
python基礎——匿名函數及遞迴函式
1 匿名函數文法
匿名函數lambda x: x * x實際上就是:
def f(x): return x * x
關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。
匿名函數有個限制,就是只能有一個運算式,不用寫return,傳回值就是該運算式的結果。
2 匿名函數舉例
用匿名函數有個好處,因為函數沒有名字,不必擔心函數名衝突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變數,再利用變數來調用該函數:
>>> f = lambda x: x * x>>> f<function <lambda> at 0x10453d7d0>>>> f(5)25
同樣,也可以把匿名函數作為傳回值返回,比如:
def build(x, y): return lambda: x * x + y * y
遞迴函式
1、遞迴函式定義
遞迴就是引用(或者調用)自己的意思
有用的遞迴函式包含以下幾個部分:
1 必須有一個明確的結束條件
2 每次進入更深一層遞迴時,問題規模相比於上次遞迴都應有減少
3 遞迴效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用時通過棧stack這種資料結構實現的,每當進入一個函數調用,棧就會加一層幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出,程式會以一個“超過最大遞迴深度”的錯誤資訊結束)
遞迴中每次函數被調用,針對這個調用函數的新命名空間會被建立,意味著當函數調用“自身”時,實際上啟動並執行是兩個不同的函數(或者說是同一個函數具有兩個不同的命名空間)
遞迴的深度:
import sysprint(sys.getrecursionlimit())
輸出結果為:
1000
2 遞迴函式實現二分法舉例
二分法舉例:
data=list(range(1000))def sear(num,data): if len(data)>1: #二分 mid_index=int(len(data)/2) mid_value=data[mid_index] if num > data[mid_index]: #num在列表的右邊 data=data[mid_index:] sear(num,data) elif num < data[mid_index]: #num在列表的左邊 data=data[:mid_index] sear(num,data) else: print("find it") return else: if data[0]==num: print(‘find it‘) else: print(‘not exists‘)sear(0,data)sear(999,data)sear(10000,data)
輸出結果為:
find itfind itnot exists
求5的階乘
def num (n): if n == 1: return 1 else: return num (n-1)*nprint(num(5))
輸出結果為:
120
方法和函數的區別
1 調用方法不一樣 函數括弧 方法點號
2 方法只對調用它的對象有用
函數沒有綁定任何對象
方法可以綁定到具體的對象
函數式編程
函數式編程概念
編程風格
1不會修改外部值的狀態
2 精簡,可讀性差
python基礎——匿名函數及遞迴函式