[TOC]
函數(shù)
函數(shù)定義
def function():
return
函數(shù)調(diào)用
function()
高階函數(shù)
def func(function):
print(function)
return
嵌套函數(shù)
def function1:
def function2:
print("this is second function")
function2()
function1()
裝飾器
裝飾器=高階函數(shù)+嵌套函數(shù)
基礎(chǔ)裝飾器
假設(shè)有一個(gè)計(jì)算器函數(shù)1:
def calculator():
x=float(input("please input x value:"))
y=float(input("please input y value:"))
z=x+y
print(z)
calculator()
以上運(yùn)行結(jié)果為:

計(jì)算器函數(shù)
現(xiàn)在要在不修改源代碼及調(diào)用方式的情況下為計(jì)算過(guò)程添加裝飾性文字,故必須使用裝飾器:
# 裝飾器函數(shù)
def decoration(function):
def wrapper():
print("----計(jì)算函數(shù)開(kāi)始-------")
function()
print("----計(jì)算函數(shù)終止-------")
return wrapper
# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
x=float(input("please input x value:"))
y=float(input("please input y value:"))
z=x+y
print(z)
calculator()
帶形參的裝飾器
現(xiàn)在,由于新需求產(chǎn)生,我需要計(jì)算一些帶形參的函數(shù):
def calculator_1(a,b):
z=a+b
print(z)
要想使其擁有計(jì)算器函數(shù)1相同的裝飾,需要更改裝飾器,但同時(shí)要兼容計(jì)算器函數(shù)1!
# 裝飾器函數(shù)
def decoration(function):
def wrapper(*args,**kwargs):
print("----計(jì)算函數(shù)開(kāi)始-------")
function(*args,**kwargs)
print("----計(jì)算函數(shù)終止-------")
return wrapper
# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
x=float(input("please input x value:"))
y=float(input("please input y value:"))
z=x+y
print(z)
@decoration
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
n=a+b
print(n)
calculator()
calculator_1(5,7)
運(yùn)行結(jié)果:

形參裝飾器
帶返回值的裝飾器
若函數(shù)返回值為,運(yùn)行結(jié)果為None,如果將計(jì)算器函數(shù)1加入返回值,運(yùn)行結(jié)果為:

image
None ?怎么會(huì)為空呢,原因是裝飾器在函數(shù)運(yùn)行時(shí)無(wú)返回 。
# 裝飾器函數(shù)
def decoration(function):
def wrapper(*args,**kwargs):
print("----計(jì)算函數(shù)開(kāi)始-------")
return function(*args,**kwargs) #返回調(diào)用函數(shù)結(jié)果
print("----計(jì)算函數(shù)終止-------")
return wrapper
# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
x=float(input("please input x value:"))
y=float(input("please input y value:"))
z=x+y
print(z)
return z
@decoration
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
n=a+b
print(n)
print("this is printer:",calculator())
calculator_1(5,7)

image
為不同函數(shù)提供不同裝飾
# 裝飾器函數(shù)
def choose(way):
def decoration(function):
def wrapper(*args,**kwargs):
if way==1:
print("----計(jì)算函數(shù)開(kāi)始1-------")
return function(*args, **kwargs)
print("----計(jì)算函數(shù)終止1-------")
else:
print("----計(jì)算函數(shù)開(kāi)始2-------")
function(*args, **kwargs)
print("----計(jì)算函數(shù)終止2-------")
return wrapper
return decoration
# 語(yǔ)法糖
@choose(way=1)
# 計(jì)算器函數(shù)1
def calculator():
x=float(input("please input x value:"))
y=float(input("please input y value:"))
z=x+y
print(z)
return z
@choose(way=2)
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
n=a+b
print(n)
print("this is printer:",calculator())
calculator_1(5,7)
運(yùn)行結(jié)果:

choose