python闭包

闭包的概念#

在一些语言中,在函数中可以定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。

1
2
3
4
5
6
7
def (msg):
def printer():
print(msg)
return printer

printer = make_printer('Foo!')
printer()

同一个函数带有不同的外部变量,就实现了不同的功能;

1
2
3
4
5
6
7
8
9
10
def tag(tag_name):
def add_tag(content):
return "<{0}>{1}<{0}>".format(tag_name, content)

content = 'Hello'
add_tag = tag('a')
print(add_tag)

add_tag = tag('b')
print(add_tag) # <b>Hello(b)

何时使用闭包#

Python装饰器函数必须接受一个函数并返回一个函数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def html_tags(tag_name):
def wrapper_(func):
def wrapper(*args, **kwargs):
content = func(*args, **kwargs)
return "<{tag}}>{content}<{tag}".format(tag=tag_name, content=content))
return wrapper
return wrapper_


def hello(name='cz'):
return "Hello {}!".format(name)

print(hello()) # <b>cz<b>
print(hello('python')) # <b>python<b>