python :閉包,匿名函式,decorater裝飾器以及偏函式
阿新 • • 發佈:2018-12-20
#python閉包
- 封裝
- 提高程式碼複用
- 內層函式引用外層函式的變數,返回內層函式
- 返回函式不可以為迴圈變數 示例1:
#標準線不同時,判斷學生的成績是否通過 方法1: def pass_60(val) : #標準線為60時,判斷是否通過 passline = 60 if val > passline : print("pass") else : print("No pass") def pass_90(val) : #標準線為90時,判斷是否通過 passline = 90 if val > passline : print("pass") else : print("No pass") 方法2:閉包實現 def pass_line(passline) : def cmp(val) : if val > passline : print("Pass") else : print("No pass") return cmp #呼叫函式 f_60 = passline(60) f_60(100) ------>print("pass") f_60(29) ------->print("No pass")
#將函式作為引數傳遞閉包
#方法1 def my_sum (*args) : if len(args) == 0 : return 0 for val in args : if not isinstance(val, int): return 0 return sum(args) def my_ave(*args) : if len(args) == 0 : return 0 for val in args : if not isinstance(val, int): return 0 return sum(args)/len(sum) #方法2 :通過閉包實現 def my_sum (*args) : return sum(args) def my_ave(*args) : return sum(args)/len(sum) def dec(Func) : def in_dec(*args) : if len(args) == 0: return 0 for val in args: if not isinstance(val, int): return 0 return Func(*args) return in_dec my_sum = dec(my_sum(1,2,3,4,5)
#python中的匿名函式
- 關鍵字lambda表示匿名函式
- 函式形式:lambda args : 表示式
- 匿名函式只能有一個表示式,
return,返回值為表示式的結果 - 匿名函式不需要定義函式名,直接建立函式物件,簡化程式碼 示例1: #返回x的值
val = lambda x : x if x > 0 else -x
print(val(1))
示例2: #返回列表中的元素的平方列表
val = map(lambda x :x*x,[1,2,3,4,5,6]) print(list(val)) #等價於 def Func(x) : return x*x val =map(Func,[1,2,3,4,5,6]) print(list(val))
示例3:
#原始碼
def Function(s) :
return s and len(s.strip()) > 0
val = filter(Function,["Herry","","Gerry"])
print(list(val))
#程式碼簡化
val = filter(lambda s:s and len(s.strip())> 0,["Herry","","Gerry"])
print(list(val))
#decorator裝飾器
- 實質:閉包的使用
def dec(Func) :
def in_dec(*args) :
if len(args) == 0: return 0
for val in args:
if not isinstance(val, int):
return 0
return Func(*args)
return in_dec
@dec #對閉包的使用
def my_sum (*args) :
return sum(args)
def my_ave(*args) :
return sum(args)/len(sum)