函数嵌套
我们可以在函数里定义函数,也就是函数的嵌套,形如下面这段代码:
def func(message):
def get_message(message):
print("Got a message:{}".format(message))
return get_message(message)
func('hello world')
#output
Got a message:hello world
这段代码中,我们在函数func()内又定义了新的函数get_message(),调用后作为func()的返回值返回。
闭包
要知道,函数的返回值也可以是函数对象,也就是闭包。形如:
def func_closure():
def get_message(message):
print("Got a message:{}".format(message))
return get_message
send_message = func_closure()
send_message('hello world')
#output
Got a message:hello world
从上面代码块可以看到,函数func_closure()的返回值是函数对象get_message本身。之后我们将其赋予变量send_message,再调用send_message('hello world')。最后便可得到其结果
装饰器
先看下面一段代码:
def my_decorator(func):
def wrapper():
print('wrapper of decorator')
func()
return wrapper
@my_decorator
def greet():
print('hello world')
greet()
上述代码便是装饰器的一个小小示例,其中greet()函数作为参数传到my_decorator()函数中,内部函数wrapper()又会调用原函数greet(),
因此最后调用greet(),函数输出就会先打印'wrapper of decorator',然后输出'hello world'
如果是带有参数的装饰器,则上述代码变为:
def my_decorator(func):
def wrapper(message):
print('wrapper of decorator')
func(message)
return wrapper
@my_decorator
def greet(message):
print(message)
greet(message)
不过新的问题来了,如果我另外有个函数,也需要·使用my_decorator()装饰器,但是这个新的函数有两个参数,那又该怎么办呢???
通常情况下,我们会把*args,**kwargs,作为装饰器内部函数wrapper()的参数。他们表示可以接受任意数量和类型的参数,因此装饰器就可以写成下面的形式:
def my_decorator(func):
def wrapper(*args,**kwargs):
print('wrapper of decorator')
func(*args,**kwargs)
return wrapper
此外为了保留函数的元信息,我们通常使用内置的装饰器@functools.wrap,它会帮助保留原函数的元信息(也就是将原函数的元信息,拷贝到对应的装饰器函数里)
def my_decorator(func):
@functools.wrap(func)
def wrapper(*args,**kwargs):
print('wrapper of decorator')
func(*args,**kwargs)
return wrapper
@my_decorator
def greet(message):
print(message)
print(greet.__name__)
#输出
'greet'
为此,关于函数嵌套、闭包和装饰器的基础内容就先讲到这里了,在帮助自己加强记忆的同时希望能够帮助到正在学习python的你