描述
根据之前文章《python函数属性和注解》得知,python函数定义时生成函数对象并赋值给了函数名。
调用方式:
(1)直接调用方式为:通过函数名+圆括号()调用函数,比如f1()。
(2)将函数名赋值给一个变量后,通过变量名()进行间接调用。
(3)将函数作为入参传给另一个函数后,在另一个函数内部调用。
示例
>>> def echo(msg):
print(msg)
#直接调用函数
>>> echo('直接调用')
直接调用
#赋值给其他变量,间接调用
>>> c=echo
>>> c('间接调用')
间接调用
>>> def indirect(func,arg):
func(arg)
#作为入参
>>> indirect(echo,'作为函数入参调用')
作为函数入参调用
描述
函数f1内部定义函数f2,这就定义了一个嵌套函数。
通过之前文章《python作用域基础知识》得知,函数外是不可直接访问函数内部的变量的(因为函数执行完后函数内部变量就释放消失了),所以,如果需要调用内部函数f2,则需要将f2返回。
def f1():
def f2():
pass
return f2
示例1
函数外不可访问函数内变量
>>> def f1():
X='梯阅线条'
def f2():
print(X)
>>> f1.f2
Traceback (most recent call last):
File "" , line 1, in <module>
f1.f2
AttributeError: 'function' object has no attribute 'f2'
>>> f1().f2
Traceback (most recent call last):
File "" , line 1, in <module>
f1().f2
AttributeError: 'NoneType' object has no attribute 'f2'
示例2
函数内部调用嵌套的内部函数。
>>> def f1():
X='梯阅线条'
def f2():
print(X)
f2()
>>> f1()
梯阅线条
示例3
返回内部函数后,在外面调用内部函数。
>>> def f1():
X='梯阅线条'
def f2():
print(X)
return f2
>>> f3=f1()
>>> f3()
梯阅线条
用法
# 定义一个嵌套函数(闭包函数)
def my_decorator(func): # 将被装饰的函数作为入参
def my_wrapfunc(*args,**kargs):
pass # 做一些额外逻辑处理进行装饰
func(*args,**kargs) # 调用被装饰的函数
pass # 做一些额外逻辑处理进行装饰
return my_wrapfunc # 返回内部函数供外面继续调用被装饰的函数
def f1(msg):
pass
# 调用
f1=my_decorator(f1)
f1(msg)
描述
函数装饰器也是一个函数,它对被装饰的函数进行调用,并且做一些额外的逻辑处理。不改变被装饰函数的原有逻辑。
函数装饰器是一个嵌套函数,
(1)定义一个入参用于接收被装饰的函数;
(2)定义一个内部函数,并且返回这个内部函数,供外面函数调用;
(3)内部函数实现额外逻辑处理,并且调用被装饰函数的函数;
示例
>>> def my_decorator(func):
def my_wrapfunc(*args,**kargs):
print('装饰器例子')
func(*args,**kargs)
return my_wrapfunc
>>> def f1(msg):
print(msg)
>>> f1=my_decorator(f1)
>>> f1('梯阅线条')
装饰器例子
梯阅线条
用法
# 定义一个嵌套函数(闭包函数)
def my_decorator(func): # 将被装饰的函数作为入参
def my_wrapfunc(*args,**kargs):
pass # 做一些额外逻辑处理进行装饰
func(*args,**kargs) # 调用被装饰的函数
pass # 做一些额外逻辑处理进行装饰
return my_wrapfunc # 返回内部函数供外面继续调用被装饰的函数
@my_decorator # 相当于 f1=my_decorator(f1)
def f1(msg):
pass
# 调用
f1(msg)
描述
直接在函数定义def上面一行用“@装饰器函数名”即可。
比如,
@my_decorator
def f1**(msg):pass**
相当于 f1=my_decorator(f1)
调用时,直接调用被装饰函数名即可。
示例
>>> def my_decorator(func):
def my_wrapfunc(*args,**kargs):
print('装饰器例子')
func(*args,**kargs)
return my_wrapfunc
>>> @my_decorator
def f1(msg):
print(msg)
>>> f1('梯阅线条')
装饰器例子
梯阅线条