函数闭包
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量引用),闭包指的是:函数内部函数对外部作用域而非全局作用域的引用
import requests
def func(url):
def get_res():
res=requests.get(url)
res.encoding='utf8'
print(res.text)
return get_res
# baidu=func('https://www.baidu.com')
# baidu()
taobao=func('https://www.taobao.com/')
taobao()
两种为函数传参的参数
1、使用参数的形式
def func(x):
print(x)
func(1)
func(1)
func(1)
#1
#1
#1
2、包给函数
def outter(x):
x=1
def inner():
print(x)
return inner
f=outter(1)
f()
f()
f()
#1
#1
#1
装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰对象添加额外功能,因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能
需要注意
装饰器本身其实是可以任意调用的对象
被装饰的对象也可以是任意可调用的对象
装饰器的实现必须遵循两大原则
不修改被装饰对象的源代码
不修改被装饰对象的调用方式
import time
def index():
print('hello, world')
# return index ##再次返回调用一次
# index()
def dice(func): ##装饰器
def f1(): ##装饰的功能
star=time.time()
func()
time.sleep(1)
end=time.time()
print(end-star)
return f1
index=dice(index)
index()
#加强版
import time
def index(x,a=1):
print('x',x)
print('a',a)
print('hello wrold')
return 123
def deco(func):
def f1(*args,**kwargs):
print('args:',args)
print('kwargs:',kwargs)
start=time.time()
res=func(*args,**kwargs)
end=time.time()
return res
return f1
index=deco(index)
res=index(10)
print(res)
##装饰器模板
def login(func):
def inner(*args,**kwargs):
user=input('输入用户名')
pwd=input('输入密码')
if user=='lzs'and pwd=='1234':
print('登陆成功')
res = func(*args, **kwargs)
return res
else:
print('登陆失败')
return inner
@login
def shopping():
print('欢迎购物')
shopping()
##三层装饰器:给双层装饰器加参数
def auth(engine):
def login(func):
def inner(*args, **kwargs):
if engine == 'flie':
user = input('输入用户名')
pwd = input('密码')
if user == 'lzs' and pwd == '1234':
print('登陆成功')
res = func(*args, **kwargs)
return res
else:
print('登陆失败')
elif engine == 'db':
print('账号来自数据库')
return inner
return login
@auth('flie')
def shopping():
print('shopping')
# login=auth('flie')
# shopping=login(shopping)
shopping()