1. 程式人生 > >python :閉包,匿名函式,decorater裝飾器以及偏函式

python :閉包,匿名函式,decorater裝飾器以及偏函式

#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)