funA和funA()是不一样的:
前者funA表示函数申明;
后者funA()表示函数执行,print(funA())即表示打印该函数返回的结果,如果没有申明返回值,那么返回值默认为None。
python中@的用法
@是一个装饰器,针对函数,起调用传参的作用。
有修饰和被修饰的区别,‘@function'作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义)。
代码1
def funA(desA):
print("It's funA")
def funB(desB):
print("It's funB")
@funA
def funC():
print("It's funC")
结果1
It's funA
分析1
@funA 修饰函数定义def funC(),将funC赋值给funA()的形参。
执行的时候由上而下,先定义funA、funB,然后运行funA(funC)。
此时desA=funC,然后funA()输出‘It's funA'。
代码2
def funA(desA):
print("It's funA")
def funB(desB):
print("It's funB")
@funB
@funA
def funC():
print("It's funC")
结果2
It's funA
It's funB
分析2
@funB 修饰装饰器@funA,@funA 修饰函数定义def funC(),将funC赋值给funA()的形参,再将funA(funC)赋值给funB()。
执行的时候由上而下,先定义funA、funB,然后运行funB(funA(funC))。
此时desA=funC,然后funA()输出‘It's funA';desB=funA(funC),然后funB()输出‘It's funB'。
代码3
def funA(desA):
print("It's funA")
print('---')
print(desA)
desA()
print('---')
def funB(desB):
print("It's funB")
@funB
@funA
def funC():
print("It's funC")
结果3
It's funA
---
<function funC at 0x0000028CD8ABE558>
It's funC
---
It's funB
分析3
同上,为了更直观地看参数传递,打印desA,其传的是funC函数,funC函数并没有被执行。
执行desA()即执行funC(),desA=funC,desA()=funC()。
代码4
def funA(desA):
print("It's funA")
def funB(desB):
print("It's funB")
print('---')
print(desB)
@funB
@funA
def funC():
print("It's funC")
结果4
It's funA
It's funB
---
None
分析4
上面将funC作为参数传给funA,那么funA(funC)传给funB()。
因此这里就可以理解为funC传给funA,然后funA被执行,然后funA(funC)传给了funB,funB被激活执行,此时funA(funC)就为desB,不难看出funA(funC)没有返回值,所以funA(funC)为None,即desB就为None。
代码5
def funA(desA):
print("It's funA")
return 3
def funB(desB):
print("It's funB")
print('---')
print(desB)
@funB
@funA
def funC():
print("It's funC")
结果5
It's funA
It's funB
---
3
解析5
上面将funC作为参数传给funA,这时构成了funA(func),再将funA(func)又传给funB(),这时desB为funA(func)。
所以执行顺序为,funA先执行,然后返回了一个参数,这时funA(func)的返回值即为3,所以desB就为3。