python基础知识之嵌套闭包和装饰器

python中嵌套、闭包和装饰器

函数嵌套

我们可以在函数里定义函数,也就是函数的嵌套,形如下面这段代码:

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的你

Guess you like

Origin blog.csdn.net/baidu_41797613/article/details/120234079