高級知識針對包、類庫的開發者,函數只是一段可執行的代碼 並不是對象,閉包、函數式編程
閉包=函數+環境變量
a=10
def outer():
a=25
def inner(x):
print(a*x*x)
return inner
f=outer()
# __closure__內置變量
# 環境變量
print(f.__closure__[0].cell_contents) #25
f(2) # 100
def f1():
a=10
def f2():
# a此時被python認爲是一個局部變量 局部變量是不影響外部變量的
a=20
print(a) #20
print(a) #10
f2()
print(a) #10
f1() # 10 20 10
#非閉包方式
x=0
def f1(num):
#global關鍵字可以使用全局變量
global x
y=x+num
x=y
return y
print(f1(3)) #3
print(f1(5)) #5
print(f1(8)) #8
#閉包方式
def f1():
x=0
def f2(steps):
#nonlocal關鍵字將變量強制爲非本地的局部變量
nonlocal x
x=x+steps
return x
return f2
f=f1()
print(f(3)) #3
print(f(5)) #8
print(f(8)) #16
匿名函數
#匿名函數 lambda 不需要return 函數體只能是表達式
f=lambda x,y:x+y
print(f(2,3)) #5
三元表達式
x>y 返回x 否則返回y
條件爲真的結果 if 條件 else 條件爲假的結果
r=x if x>y else y
map
list_x=[1,2,3,4,5]
def squre(x):
return x*x
# for v in list_x:
# squre(v)
r=map(squre,list_x)
# [1, 4, 9, 16, 25]
print(list(r))
map與lambda
list_x=[1,2,3,4,5,6]
list_y=[1,2,3,4,5]
# 以參數較少的爲準 list_x->x list_y->y
r=map(lambda x,y:x*x+y,list_x,list_y)
#[2, 6, 12, 20, 30]
print(list(r))
reduce
from functools import reduce
# reduce 連續計算
list1=['1','2','3','4','5']
#reduce(lambda表達式,參數序列,初始值)
# 執行過程 (((('aaa'+'1')+'2')+'3')+'4')+'5'
r=reduce(lambda x,y:x+y,list1,'aaa')
print(r) #aaa12345
#map/reduce 函數式編程 大數據編程模型 映射 歸約 並行計算
filter
list1=[1,0,0,1,1]
# 大小寫的過濾 list2=['a','B','C','d']
#x>0 返回布爾值
r=filter(lambda x:x>0,list1) #filter 返回一個集合
print(list(r)) #[1, 1, 1]
命令式編程與函數式編程
命令式編程:def if else for 類 對象等
函數式編程:lambda:算子 map reduce filter 使代碼更簡潔
裝飾器
#裝飾器
# 在每一個函數前面打印當前時間
import time
#func:核心函數
def decorate(func):
# *arg 可變參數 **kw:關鍵字參數組成的字典
def wrapper(*arg,**kw):
#unix時間戳:是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
print(time.time())
# 未知函數參數的函數的通用寫法
func(*arg,**kw)
return wrapper
#1個參數 @裝飾器名 語法糖
@decorate
def f1(func_name):
print("this is function1"+func_name)
#2個參數
@decorate
def f2(func_name1,func_name2):
print("this is function2"+func_name1)
print("this is function2"+func_name2)
# 帶關鍵字參數的情況
@decorate
def f3(func_name1,func_name2,**kw):
print("this is function3"+func_name1)
print("this is function3"+func_name2)
print(kw) # {'a': 1, 'b': 2, 'c': 3}
# 無參
@decorate
def f4():
print("this is function4")
# 不改變原函數的調用方式
#1538815374.121 ,this is function1參數1
f1("參數1")
# 1538815374.122 this is function2參數1 this is function2參數2
f2("參數1","參數2")
#1538815374.122,this is function3參數1,this is function3參數2,{'a': 1, 'b': 2, 'c': 3}
f3("參數1","參數2",a=1,b=2,c=3)
#1538815374.125,this is function4
f4()
# 裝飾器的應用:flask框架 @api.router使函數成爲控制器
# 還有可以設置對外可以訪問的接口還是需要登錄才能訪問的接口的裝飾器 @auth.login.required