闭包函数
闭包:闭是封闭(函数内部函数)包(闭包函数内部的变量) 返回闭包函数内部的函数
def f1():
def f2():
print('from f2')
return f2
f2 = f1()
f2()
闭包函数的应用
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域
def f1(url):
def spider():
print(url)
return spider
taobao = f1('http:\www.taobao.com')
taobao()
装饰器
无参装饰器
什么是装饰器
装饰器指的是为被装饰器对象添加额外功能,因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能
注意
- 装饰器本身其实是可以任意调用的对象
- 被装饰的对象也可以是任意可调用的对象
为什么要用装饰器
装饰器的实现必须遵循两大原则:
1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式
装饰器其实就是在遵循以上两个原则的前提下为装饰对象添加新功能。
语法糖
装饰器必须放在被装饰函数的前面
装饰器模板
def deco(func):
der wrapper(*args,**kwargs):
# 功能
res = func(*args,**kwargs)
return res
return wrapper
三层装饰器
添加额外的判断参数
username_list = []
def sanceng(role):
def login_deco(func):
def wrapper(*args,**kwargs):
if username_list:
print('已经登录,请勿重复登录')
res = func(*args,**kwargs)
return res
username_inp = input('请输入用户名:')
pwd_inp = input('请输入密码:')
with open(f'{role}_info.txt','r',encoding='utf8') as fr:
for user_info in fr:
username.pwd = user_info.strip().split(':')
if username_inp == username and pwd_inp == pwd:
print('登录成功')
username_list.append(username)
res = func(*args,**kwargs)
return res
else:
print('登录失败')
return wrapper
return login_deco
迭代器引入
1.可迭代对象:具有__iter__
方法
除了数字类型和函数外都是可迭代对象
2.迭代器对象:含有__iter__
和__next__
方法
只有文件是迭代器对象
迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象