闭包函数及装饰器
一、函数对象,主要是讲函数都可以怎么用
在面对对象编程中 一切皆对象
具体体现
1、函数可以被引用
2、函数可以作为函数的参数
3、函数可以作为函数的返回值
4、可以被存储到容器类型中
例:写一个购物车 举办登陆和注册,购物
def funcl():
print('run')
a=funcl()
a=funcl
def func2(func):
func()
func2(func1)
def func3():
return func1
f=func3()
print(f)
print(func1)
二、函数嵌套
1、嵌套调用 在一个函数中调用了另一个函数
def max(x,y):
return x if x>y else y
def max4(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
return res3
print(max4(1,2,3,4))
2、嵌套定义 在一个函数中定义了另一个函数
定义在函数内的函数 只能在函数中使用 外界不能访问
def a():
def b():
def c():
def d()
print('from f3')
d()
c()
b()
f1()
三、名称空间
定义:存储名称的空间
名称空间的分类
内置名称空间 存储解释器自带的一些名称与值的对应关系
(python解释器启动创建 所有代码全部执行完毕,关闭解释器时销毁)
全局名称空间 文件级别的名称
除了内置的和函数内的其他都在全局名称空间内
局部名称空间,只要是函数内的名称就在局部名称空间内
名称空间的加载顺序
内置的==》全局的》局部的
名称查找顺序
局部==》全局的=》内置的
四、作用域(作用范围)
域 指的是区域 范围的意思
全局名称空间和内置的名称空间在使用上没什么区别
局部的定义就只能在局部使用
全局和内置可以划分为同一范围
global表示全局范围 就是全局作用域
局部的单独划分为一个范围
local局部作用域
查看作用域
glibals()
locals()
五、闭包函数
1、什么是闭函数
闭函数:该函数一点是定义在函数内的函数
包函数:该内部函数包含对外层函数作用域名字的引用
def outter():
x=111
def inner():
print(x)
return inner
f=outter()
x=22222
f(
为函数体传值的方案一:直接以参数的形式传入
def f(x):
print(x)
f(10)
f(11)
为函数体传值方案二:直接以参数的形式传入
def outter(x):
def f():
print(x)
return f
fff=outter
fff()
fff1=outter(11)
fff1()
def outter(x):
x=10
def f():
print(x)
return f
xx=outter(11)
yy=outter(12)
print(xxx)
六、装饰器
1、什么是装饰器
装饰器指的是为被装饰对象添加新功能
装饰器本身可以是任意可调用对象
被装饰对象本身也可以是任意可调用对象
2、为何要用装饰器
开发封闭原则:对修改封闭,对扩展开发
装饰器的实现原则:
1、不能修改被装饰对象的源代码
2、不能修改被装饰对象的调用方式
装饰器的目的
就是在遵守原则1和2的前提为被装饰对象添加新功能
3、如何用
1\
import time
def index():
time.sleep(2)
print('welcome to index page')
def wrapper():
start=time.time
func()
stop=time.time()
print('run time is %s'%(stop-start))
wrapper()
2\
import time
def outter(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*rargs,**kwargs)
stop=time.time()
print('run time is %s'%(stop-start))
return res
return wapper
@outter#home=otter(home)
def home(name):
time sleep(2)
print('welcome %s to homepage' %name)
home('egon')
七、叠加多个装饰器
1、加载顺序(outter函数的调用顺序):自下而上
2、执行顺序(wrapper函数的执行顺序)自下而上
form functools import wraps#使其更像源代码的模块
import time
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print(stop-start)
return res
return wrapper
@outter
def index():
'''
这是index函数。。。。
return
'''
print('from index')
def outterl(func1)#func1=wrapper2的内存地址
print('加载了outter1')
def wrapper1(*args,**kwargs):
print('执行了wrapper1')、
res1=func(*args,**kwargs)
return res1
return wrapper1
def outter2 (func2):#func2=wrapper3的内存地址
print('加载了outter2')
def wrapper2(*args,**kwargs):
print('执行了wrapper')
res2=func2(*args,**kwargs)
return res2
return wrapper2
def outter3(func3):#func3=最原始的那个index的内存地址
print('加载了outter3')
def wrapper3(*args,**kwargs):
print('执行了wapper3')
res3=func3('*args,**kwargs')
return res3
return wrapper3
@outter1#outter1(wrapper2 的内存地址)========》index=wrapper的内存地址
@outter2#outter2(wrapper3 的内存地址)========》wrapper2的内存地址
@outter3#outter3(最原始的index的内存地址)=======》wrapper3的内存地址
def index():
print('from index')
有参函数
import time
current_user={'user':None}
def outter(func):
def wrapper(*args,**kwargs):
if current__user['user']is not None:
res=func(*args,**kwargs):
return res
user=input('username>>>>:').strip()
pwd=input('password>>>:').strip()
if user=='egon'and pwd=='123':
print('login successfull')
current_user['user']=user
res=func(*args,**keargs)
return res
else:
print('user or password error')
return wrapper
@outter
def index():
time.sleep(1)
print('from index')
@outter
def home(name):
print('welcome %s'%name)
index()
home('egon')
import time
current_user={'user':None}
def auth(engine='file')
def outter(func):
def wrapper(*args,**kwargs):
if current_user['user']is not None:
res=func(*args,**kwargs)
return res
user=input('username>>>:').strip()
pwd=input('password>>>>:').strip()
if engine=='file':#基于文件认证
if user=='egon'and pwd=='123'
print('login successfull')
current_user['user']=user
res=func(*args,**kwargs)
return res
else:
print('user or password error')
elif engine=='mysql':
#基于mysql的认证
print('基于myql的认证')
elif engine=='ldap':
#基于ldap的认证
print('基于ldap的认证')
else:
print('不知道engine')
return wrapper
return outter
@auth('ldap')
def index():
time.sleep(1)
print('from index')
@auth('mysql')
def home(name):
print('welcome %s'%name)
index()
home('egon')