(一)匿名函式:
此函式不是沒有名字,他是有名字的,他的名字就是你給其設定的變數,比如
lambda是定義匿名函式的關鍵字,相當于函式的def
lambda后面直接加形參,形參加多少都可以,只要用逗號隔開就行,
回傳值在冒號之后設定,回傳值和正常的函式一樣,可以說任意資料型別,
一句話函式,比較簡單的函式,不管多復雜,只能寫一行,且邏輯結束后直接回傳函式
-
構建匿名函式
def func(a, b): return a + b ? ? func1 = lambda a, b: a + b # lambda相當于def定義函式,:之前的是形參,之后的是回傳值 print(func1(1, 2))
-
接受兩個int引數,將較大的資料回傳,
f = lambda a, b: a if a > b else b
(二)內置函式(2)重點
-
print():螢屏輸出,
-
int()
-
str()
-
list()
-
tuple()
-
abs():回傳絕對值
-
sum():求和(可迭代物件,可設定初始值)
-
reversed():將一個原串列翻轉,回傳的是一個翻轉的迭代器,
-
bytes():把字串轉成bytes
-
zip():拉鏈方法
l1 = [1,2,3,4,5] tul = ('小楊','小哥','剛剛') s1 = 'abcd' obj = zip(l1,tul,s1) for i in obj: print(i) ? (1, '小楊', 'a') (2, '小哥', 'b') (3, '剛剛', 'c')
-
********以下方法最重要,
-
凡是可以加key的:他會自動的將可迭代物件中的每個元素按照順序傳入key對應的函式中,
-
min():求最小值 max():求最大值
-
以絕對值去取最大或最小
-
以回傳值比大小
ll = [1, 22, 4, 5, 1, -5, 66, 65, 95, 12, 45, 1, -15, 48, 7] print(max(ll, key=abs)) print(min(ll, key=abs)) # 輸出 95 1
-
如果比較的是字典:默認會按照字典的鍵去比較大小,
-
會把 dic 的鍵取出來給 key 對應的函式,回傳鍵所對應的值給min()做比較,默認回傳鍵
# 求出值最小的鍵 dic = {'a': 3, 'b': 2, 'c': 1} m = min(dic, key=lambda a: dic[a]) print(m) # 輸出 c
-
-
sorted:排序函式,排序成為一個新串列,
按照數字進行降序排序
ll = [('tai', 18), ('lsk', 73), ('asd', 50)] s = sorted(ll, key=lambda x: x[1], reverse=True) print(s) # 輸出 [('lsk', 73), ('asd', 50), ('tai', 18)]
-
filter:串列推導式的篩選模式,串列推導式回傳的是串列,filter回傳的是迭代器
回圈遍歷ll的元素,把 ll 每個元素傳到函式中的x,以回傳值是真的留下來
ll = [2, 3, 4, 1, 5, 6, 7, 8] f = filter(lambda x: x > 3, ll) print(f) # 回傳的是一個迭代器 print(list(f)) # 輸出 <filter object at 0x018E38E0> [4, 5, 6, 7, 8]
-
map:串列推導式的回圈模式
f = map(lambda x: x ** 2, range(1, 6)) print(f) print(list(f)) # 輸出 <map object at 0x0223B6D0> [1, 4, 9, 16, 25]
-
reduce:在 from functools import reduce
from functools import reduce ? def func(x,y): ''' 第一次: x = 11 y = 2 x + y = 記錄:13 第二次: x = 13 y = 3 x + y = 記錄:16 第二次: x = 16 y = 4 x + y = 記錄:20 ''' return x + y ? ll = reduce(func,[11,2,3,4,]) print(ll) # 輸出 20
(三)閉包:封閉的東西,保證資料的安全,
-
舉例,
整個歷史中的某個商品的平均收盤價,什么叫平局收盤價呢?就是從這個商品一出現開始,每天記錄當天價格,然后計算他的平均值:平均值要考慮直至目前為止所有的價格,
比如大眾推出了一款新車:玩具車,
第一天價格為:100元,平均收盤價:100元
第二天價格為:110元,平均收盤價:(100 + 110)/2 元
第三天價格為:150元,平均收盤價:(100+ 110+ 150)/3 元
-
方案一:ll 會被誤更導致資料出錯
ll = [] def _average(count): ll.append(count) # 每次新增給全域變數ll av = sum(ll) / len(ll) return av ? ? print(_average(100)) print(_average(110)) ''' N多代碼.... 不小心給ll被更改 ll.append(10) 就會造成后面的資料出錯 ''' print(_average(150)) print(_average(200)) # 輸出: 100.0 105.0 120.0 140.0
-
方案二:閉包
def _average(): ll = [] # ll 為自由變數,和內層函式age做了系結,在全域也找不到 def age(count): ll.append(count) av = sum(ll) / len(ll) return av return age ? ave = _average() print(ave(100)) print(ave(110)) print(ave(150)) print(ave(200)) # 輸出 100.0 105.0 120.0 140.0
閉包只能存在嵌套的函式中
閉包定義:內層函式對外層函式非全域變數的參考(使用),就會形成閉包,
被參考的非全域變數也稱作為自由變數,這個自由變數會與內層函式產生一個系結關系,
自由變數不會在記憶體中消失,
閉包的作用:保障資料安全,
如何用代碼判斷閉包:
# 是否是閉包? def wrapper(a,b): ''' 相當于此處添加了兩個變數 a = 2 b = 3 ''' def inner(): print(a) print(b) return inner ? a = 2 b = 3 ret = wrapper(a,b) print(ret.__code__.co_freevars) # 輸出 ('a', 'b') # 這就是ret系結的自由變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277969.html
標籤:Python
上一篇:API介面冪問題
