函式進階的例項化理解
阿新 • • 發佈:2022-03-31
一 內建函式的常用高階函式例項理解
函式 | filter(function, iterable) | map(function, iterable, ...) | sorted(iterable, cmp=None, key=None, reverse=False) |
描述 | 過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。 | 根據提供的函式對指定序列做對映處理。 | 對所有可迭代的物件進行排序操作。 |
例項1 |
'''2. 從指定2個數字範圍內中找出所有的迴文數字。 |
'''1. 提取列表中每個字串成員中的數字。 |
'''1. 對下列資料進行排序 |
二 閉包函式例項理解
1 編寫函式,計算兩個數字的平方的和,基於閉包原理快取計算的結果到記憶體中,當出現重複的引數時,直接從外函式的變數中提取結果。""" 例項1: 首次輸入:7, 2 [首次出現,記錄到外函式的變數中] 結果:53 # 49+4 再次輸入:2, 3 [首次出現,記錄到外函式的變數中] 結果:13 # 4+9 再次輸入:7, 2 [重複輸入,直接從外函式的記錄中提取結果,不需要經過運算] 結果:53 # 49+4 """ def outer(): result = { # (7, 2): 53, } def inner(a, b): key = (a, b) if key in result: print("來自快取的結果:") return result[key] ret = a**2+b**2 print("來自計算的結果:") result[key] = ret return ret return inner calc = outer() ret = calc(7,2) print(ret) #來自計算的結果:53 ret = calc(2,3) print(ret) #來自計算的結果:13 ret = calc(7,2) print(ret) #來自快取的結果:53
三 遞迴函式例項理解
python在記憶體中是使用棧楨空間是用來執行函式的。呼叫函式就是開闢棧楨空間的過程,呼叫結束之後,會自動釋放棧楨空間。
每呼叫一次函式,就開闢一個棧楨空間,每結束一個函式,就釋放一層棧楨空間,遞迴本質上就是開闢和釋放棧楨空間的過程。
遞迴函式的執行需要佔用的空間記憶體等效能消耗遠比迴圈要高。使用遞迴時務必在函式呼叫前新增一個判斷條件,直到不滿足退出重複操作。如果遞迴的層數過多,層數達到1000層則報錯,將會被python直譯器強制終止遞迴。
建議大家針對簡單操作少用遞迴,多用迴圈,除非這個問題真的很適合使用遞迴。而針對複雜操作多用遞迴,少用迴圈,因為複雜操作情況下的迴圈程式碼(4層以上巢狀迴圈),很容易讓人懵逼。
以下為一些遞迴函式例項便於理解
""" 1. 編寫遞迴函式,計算任意數n的階乘。 1*2*3*4...*n n 的階乘 採用遞迴的思路: 假設n=4 1*2*3*4 要計算4的階乘,先要計算3的階乘是多少 1*2*3 要計算3的階乘,先要計算2的階乘是多少 1*2 要計算2的階乘,先要計算1的階乘是多少 1 1的階乘就是1呀!!! 得到1的階乘1以後, 則2的階乘就是 fn(2) ---> fn(1)*2 則3的階乘就是 fn(3) ---> fn(2)*3 """ # def fn(n): # if n == 1: # return 1 # else: # return n*fn(n-1) # # ret = fn(4) # print(ret) #24 """ 2. 編寫遞迴函式,輸出斐波那契數列的第n項。 斐波那契數列: 0,1,1,2,3,5,8,13,21,34,55... 計算第n項的數列 fa(n) ---> fa(n-1) + fa(n-2) 假設n=5 fn(5) ---> fa(4) + fa(3) fa(4) ----> fa(3) + fa(2) fa(3) ---> fa(2) + fa(1) fa(2) ---> fa(1) + fa(0) 1 0 """ # def fa(n): # if n == 0: # return 0 # if n == 1: # return 1 # return fa(n-2) + fa(n-1) # # print( fa(4) ) # 3
3. 思路:
"""
3. 編寫遞迴函式,輸出類似123454321這樣的迴文數字。
"""
def func(s):
if s < 5:
print(s, end="")
func(s + 1)
print(s, end="")
func(1)
4. 思路
4.編寫函式,基於遞迴原理,反轉字串
例項1:
輸入:"12453"
結果:"35421"
例項2:
輸入:"abf"
結果:"fba"
def fn(content):
if content == "":
return content
else:
return fn(content[1:]) + content[0]