第十三節 一,匿名函數 匿名函數 == 一行函數 lambda == def == 關鍵字 函數體中存放的是代碼 生成器體中存放的也是代碼 就是yield導致函數和生成器的結果不統一 函數體中存放的是代碼 生成器體中存放的也是代碼 就是yield導致函數和生成器的結果不統一 二,內置函數Ⅱ sep ...
一,匿名函數
-
匿名函數 == 一行函數
lambda == def == 關鍵字
-
函數體中存放的是代碼
-
生成器體中存放的也是代碼
-
就是yield導致函數和生成器的結果不統一
lambda x:x
# x,可以不寫是普通函數的形參,可以不接受參數
# :後邊是返回值,x必須寫 是普通函數的函數值 (lambda只能返回一個數據類型)
print(lambda x:x)
print((lambda x:x+6)(5))
f = lambda x:x+6(5)
print(f.__name__)# 查看函數名字 lambda
f1 = lambda x,y,z,:(x,y,z) # :返回值必須是一個數據類型
print(f(1,2,3))# 輸出一個元組(1,2,3)
print([lambda :5][0]())
print((lambda :5)())
a = lambda :5
a()
# 返回 5 5
lst = [lambda :i for i in range(5)]
print(lst[1]) # 返回的是索引1的函數記憶體地址
print(lst[0]()) # 調用函數,返回值,返回的是i最後一次迴圈所賦值lst = [] # [lambda x:x+1,lambda x:x+1]
for i in range(2):
lst.append(lambda x:x+1)
print(lst[-1](5)) # 輸出6, lambda 5:5+1
lst = [lambda x:x+1 for i in range(5)] # 同上一個
print(lst[0](5))# 輸出6, lambda 5:5+1
tu = (lambda :i for i in range(3)) # 生成器
print(next(tu)) # 沒調用,就是返回函數地址
print(next(tu)()) # 記錄上一次查看的位置,輸出 1# 面試題拆解:
lst = []
for i in range(5):
def func():
return i
lst.append(func) # lst 裡面放了5個func函數的地址
print(lst[1]) # 輸出的是函數地址
print(lst[1]()) # 調用函數,返回的是i最後一次迴圈def func():
for i in range(3): # i = 0 1 2
def foo(): # foo1 foo2 foo3
return i
yield foo # foo1 foo2 foo3
g = func()
print(next(g)()) # foo1 返回的是值
print(next(g)()) # foo2
print(next(g)) # foo3 返回的是地址,沒有調用
------------------------------------------------------
lst = [lambda :i for i in range(3)] # lst中有三個lambda : i
print(lst[0]()) # 取的是最後一次i迴圈的值
-----------------------------------------------------
tu = (lambda : i for i in range(3)) # 生成器是把迴圈的每次值 都存放在一個地址中
print(next(tu)())
print(next(tu)()) # 每次都是yield 逐個提取
print(next(tu)())lst = [lambda x:x+5 for i in range(2)]
# lst = [lambda x:x+5,lambda x:x+5]
print([i(2) for i in lst]) # x = 2,
# 返回結果 [7,7]
# 以下為分解式子
lst = [] # [lambda x:x+5,lambda x:x+5]
for i in range(2):
lst.append(lambda x:x+5)
new_lst = []
for i in lst:
new_lst.append(i(2))
print(new_lst)
---------------------------------------------------
lst = (lambda x:x+5 for i in range(2))
print(i(2) for i in lst) # 是一個記憶體地址
print([i(2) for i in lst]) # 是列表的兩個值,[7,7]
# 以下是分解
def func():
for i in range(2):
f = lambda x: x + 5
yield f
g = func()
lst = []
for i in g:
lst.append(i(2))
print(lst)lst = [lambda x:x*i for i in range(2)]
print([i(2) for i in lst]) #[2,2]
# 以下為分解式
lst = [] # [lambda x:x*i,lambda x:x*i]
for i in range(2):
lst.append(lambda x:x*i)
# print(i)
new_lst = []
for em in lst:
new_lst.append(em(2))
print(new_lst)lst = (lambda x:x*i for i in range(2))# 這是一個生成器
print([i(2) for i in lst]) #[0,2] # i為0的時候存儲一次,i為1的時候存儲一次
# 分解
def func():
for i in range(2):
f = lambda x:x*i
yield f
g = func()
lst = []
for i in g:
lst.append(i(2))
print(lst)func = lambda x:[i for i in x]
print(func('afafasd'))
# 將字元串轉換列表['a', 'f', 'a', 'f', 'a', 's', 'd']
print(list('afafasd')) -
二,內置函數Ⅱ
-
-
sep :每一個元素之間分割的方法 預設 " "
print(1,2,3,sep="|")# 1|2|3
-
end : print執行完後的結束語句,預設\n
print(1,2,3,end="")
print(4,5,6,end="") # 1 2 34 5 6 -
file : 文件句柄,預設顯示到屏幕
print(1,2,3,4,file=open("test","w",encoding="utf-8"))
-
flush 刷新
-
sum : 求和,可迭代對象容器,容器的元素必須是數字
print(sum([1,2,2,1]))
print(sum([10,20,30,40],100))# 設置初始值 -
abs : 絕對值
print(abs(-9))
-
dir : 查看當前對象的所有方法
print(dir(str))
-
zip : 拉鏈,當長度不一致時選擇最短的進行合併
lst1 = [1,2,3,5]
lst2=["alex","wusir","元"]
print(list(zip(lst1,lst2))) # 拉鏈
# 面試題:
print(dict(zip(lst1,lst2)))
# {1: 'alex', 2: 'wusir', 3: '寶元'} -
format : 格式轉換
print(format("alex",">20")) # 右對齊
print(format("alex","<20")) # 左對齊
print(format("alex","^20")) # 居中
# 進位轉換:
# 將十進位轉換成二進位 bin
print(format(12,"b"))
print(format(12,"08b"))
# 將十進位轉換成八進位 oct
print(format(12,"o"))
print(format(12,"08o"))
# 將二進位轉換成十進位 digit
print(format(0b11001,"d"))
# 將十進位轉換成十六進位 hex
print(format(17,"x"))
print(format(17,"08x")) -
reversed : 反轉
print(list(reversed("alex")))
# ['x', 'e', 'l', 'a']
print(list(reversed([1,2,3,4,5])))
# [5, 4, 3, 2, 1] -
filter : 過濾,1,指定過濾規則(函數名[函數的記憶體地址]) 2,要過濾的數據
lst = [1,2,3,4,5,6]
print(list(filter(lambda x:x>1,lst)))
# 分解
def func(a):
return a>1
print(list(filter(func,lst)))
-------------------------------------------------
# 底層代碼
lst = [1,2,3,4,5,6]
def f(func,args):
new_lst = []
for i in args:
if func(i):
new_lst.append(i)
return new_lst
def func(a):
return a>1
print(f(func,lst)) # [2,3,4,5,6]
# fiter寫法
print(list(filter(lambda x:x>2,[1,2,3,4,5])))lst = [{'id':1,'name':'alex','age':18},
{'id':1,'name':'wusir','age':17},
{'id':1,'name':'taibai','age':16},]
# 篩選年齡大於16歲的
print(list(filter(lambda x:x['age']>16,lst)))
--------------------------------------------------
def func(a):
return a>1
print(list(filter(func,[1,2,3,4,5])))
print(list(filter(lambda a:a>1,[1,2,3,4,5]))) -
map : 映射函數(將每個元素都執行了執行的方法)
print([i*8 for i in [1,2,3,4]])
#[8, 16, 24, 32]
-----------------------------------------------------------
lst = []
for i in [1,-22,3,4,5,6]:
lst.append(abs(i))
lst.sort()
print(lst)# [1, 3, 4, 5, 6, 22]
------------------------------------------------------------
def map(argv,args):
lst = []
num = len(args) if len(args) < len(argv) else len(argv)
for i in range(num):
lst.append(argv[i] + args[i])
return lst
print(map([1,2,3,4],[3,4,5,6,7,8,9,0]))
print(list(map(lambda x,y:x+y,[1,2,3,4,5],[33,22,44,55])))
# [4, 6, 8, 10] -
sorted : 排序
print(sorted([1,2,3,4,5,6],reverse=True))
print(sorted([1,2,3,4,5,-6],reverse=True,key=abs))
lst = ["三國演義","紅樓夢","鐵道游擊隊","西游記","水滸傳","活著"]
print(sorted(lst,key=len))
# [6, 5, 4, 3, 2, 1]
# [-6, 5, 4, 3, 2, 1]
# ['活著', '紅樓夢', '西游記', '水滸傳', '三國演義', '鐵道游擊隊']
-----------------------------------------------------------------
print(sorted([1,-22,3,4,5,6],key=abs)) # key指定排序規則
#[1, 3, 4, 5, 6, -22]
------------------------------------------------------------------
lst = [{"age":19},{"age1":20},{"age2":80},{"age3":10}]
print(sorted(lst,key=lambda x:list(x.values()))) # 值排序
print(sorted(lst,key=lambda x:list(x.keys()),reverse=True)) # 鍵排序 -
max : 最大值
-
min : 最小值
print(max(10,12,13,15,16))
print(max([10,12,13,15,-16],key=abs))
# 16 -16 -
reduce : 累計算
from functools import reduce
# 從 functools工具箱中拿來了reduce工具
from functools import reduce
def func(x,y):
return x+y
print(reduce(func,[1,2,3,4,5]))
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
# 15 15
-
三,閉包
-
什麼是閉包?
-
閉包的作用:
1,保護數據的安全性。2,裝飾器
-
__colsure__查看是是否為閉包
-
函數執行完後,函數體內文件自動銷毀
例一:
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper() # 閉包
例二:
a = 2
def wrapper():
def inner():
print(a)
return inner
ret = wrapper() # 不是
例三:
def wrapper(a,b):
def inner():
print(a)
print(b)
inner()
a = 1
b = 2
wrapper(a,b) -