Python函数高阶之必会知识闭包装饰器
本章所讲内容:
1、装饰器使基础之闭包
2、装饰器之基于开发实现登录验证
1、装饰器使基础之闭包(面试题)
1、闭包定义
1. 闭包函数必须有内嵌函数;
2. 内嵌函数可以引用该嵌套函数上一级namespace中的变量;
3. 闭包函数必须返回内嵌函数;
通过这三点,就可以创建一个闭包;Python装饰器就是使用了闭包。
闭包的好处,使代码变得简洁,提高代码的拓展性。
def outer(num):
def inner(num_in):
print('inner,num_in is %d'%num_in)
return num+num_in
return inner
# a == inner
a = outer(20) # inner
# print(a)
#a(200)==inner(200)
print(a(200))
global 修改全局变量
x = 2
def outer():
x = 0
def inner():
global x
x = x+1
print(x)
return inner
outer()()#inner()
print(x)
装饰器之基于开发实现登录验证(面试题)
装饰器的定义
装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼。
当我们已经写好一个函数时,项目也已经上线了,突然客户想要增添一个需求,让这个函数处理的更加细致,这个就可以用到装饰器了。
执行顺序: 先返回内嵌函数à有参数直接传参给内嵌函数à执行内嵌函数
装饰器快速入门假如现在我们定义了两个函数,分别来打印他们的名字。
def func1():
print('this is xuegod1')
# print('I come from china')
def Dec(func):
def inner():
func()
print('I come form china')
return inner
#f1 == inner
f1 = Dec(func1)
#inner()
func1()
但是上面有个问题,比如func1在别的地方有调用的话,是不是还需要把func1修改为f1,不然调用报错
其次,python认为上面的写法不简洁,所以提出了@语法糖
def Dec(func):
def inner():
func()
print('I come form china')
return inner
@Dec
#func1 = Dec(func1)
def func1():
print('this is xuegod1')
# print('I come from china')
func1()
模拟登录验证
import time
a = ['while','for','django']
def outer(func):
def inner(name):
# name = 'for'
func(name)
print('开始判断你有没有登录')
time.sleep(2)
if name in a:
print('已经登录成功,请尽情访问')
time.sleep(1)
else:
print('你没有登录,没有访问权限')
time.sleep(1)
return inner
@outer
def login(name):
print('我要浏览')
login('fo')
总结:
1、装饰器使基础之闭包
2、装饰器之基于开发实现登录验证