day13
1.今日内容
今日内容:
0、有参装饰器
1、迭代器
2、生成器
3、面向过程编程
4、表达式
三表达式
列表生成式
生成器表达式
2.有参装饰器
import time
current_user={
'username':None,
# 'login_time':None
}
# 装饰器最多套三层
def auth(engine):
# engine='file'
def auth2(func):
# func=index
def wrapper(*args,**kwargs):
if engine == 'file':
if current_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res
uname=input('用户名>>: ').strip()
pwd=input('密码>>: ').strip()
if uname == 'egon' and pwd == '123':
print('登陆成功')
current_user['username']=uname
res=func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
elif engine == 'mysql':
print('基于MyQL的认证')
elif engine == 'ldap':
print('基于LDAP的认证')
return wrapper
return auth2
@auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
def index():
time.sleep(1)
print('welcome to index page')
return 122
index() # wrapper()
3.装饰器修复技术
from functools import wraps
def outer(func_name):
@wraps(func_name) # 添加这个功能,就能暴露被装饰对象的注释
def inner(*args, **kwargs):
"""我是inner 我擅长让人蒙蔽"""
res = func_name(*args, **kwargs)
return res
return inner
@outer
def func():
"""我是真正的func 我很强大 我很牛 我很聪明"""
pass
help(func)
# print(func)
func()
4.总结装饰器模版
无参装饰器
# 总结:有参装饰器模板
# 1、无参装饰器
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
@outter
def index():
pass
有参装饰器
# 总结:有参装饰器模板
# 1、无参装饰器
# 2、有参装饰器
def outter2(xxx):
def outter(func):
def wrapper(*args, **kwargs):
print(xxx)
res = func(*args, **kwargs)
return res
return wrapper
return outter
@outter2(xxx=111)
def index():
pass
index()
5.可迭代对象与迭代器对象
可迭代对象
1.可迭代对象
对象内置有__iter__方法的都称为可迭代对象
"""
1.内置方法 通过点的方式能够调用的方法
2.__iter__ 双下iter方法
"""
2.可迭代对象的范围
不是可迭代对象
int float bool 函数对象
是可迭代对象
str list dict tuple set 文件对象
3.可迭代的含义
"""
迭代:更新换代(每次更新都必须依赖上一次的结果)
eg:手机app更新
"""
可迭代在python中可以理解为是否支持for循环
迭代器对象
1.迭代器对象
是由可迭代对象调用__iter__方法产生的
迭代器对象判断的本质是看是否内置有__iter__和__next__
2.迭代器对象的作用
提供了一种不依赖于索引取值的方式
正因为有迭代器的存在 我们的字典 集合才能够被for循环
3.迭代器对象实操
"""
s1 = 'hello' # 可迭代对象
res = s1.__iter__() # 迭代器对象
print(res.__next__()) # 迭代取值 for循环的本质
print(res.__next__())
一旦__next__取不到值 会直接报错
"""
4.注意事项
可迭代对象调用__iter__会成为迭代器对象 迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身
实例.py
d = {'name': 'jason', 'age': 123}
res = d.__iter__() # res是迭代器对象
print(res)
print(res.__next__())
print(res.__next__())
6.for循环的本质
for 变量名 in 可迭代对象:
循环体代码
"""
1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
"""