python-装饰器-迭代器-生成器
装饰器 (框架中用到)
格式:
def outer(func):
def inner(args, **kwargs):
# 在被装饰函数执行之前需要的操作
ret = func(args, **kwargs) func = inner
# 在被装饰函数执行之后需要的操作
return ret
return outer
@outer #装饰器的使用
def index(): # index= inner
pass
return True
使用场景:
1.开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
2.有一个功能,是你知道会用到的,但是你不知道程序员在哪个地方会用到,搞成一个装饰器,把使用权交给程序员,程序员在设计程序的阶段,想往哪儿添加,直接在这个函数上添加装饰器就行了
3.日志模块:输出日志
装饰器使用:
@装饰器
def 被装饰的函数():
pass
迭代器 (节省内存,只能for循环一次,不去取值时数据不存在)
可迭代(iterable)的:dir后有__iter__方法的是可迭代的
或者说:可被for循环的
如果是可迭代,而不是迭代器,那么可以被for循环多次
如:list、dict、tuple
迭代器:dir后有__iter__和__nect__是迭代器
如果是迭代器,那么数据只能被for循环一次
如:文件句柄
可以迭代的对象(可以被for循环)
eg:def func(list) ---> func(l[0],l[1],l[2])
字典
eg:def func(dict)
生成器(本质:一个迭代器,节省空间)
关键字:yield
类似一个暂停键,有return功能,返回一次,暂停一次
场景:
文件句柄、网络操作、数据库操作等
# 《将来所有代码最好都把读文件的操作写成一个生成器》
生成器函数
格式:
def generator():
pass
yield return_value
g = generator()
for i in g:
对i进行操作
eg:
# file_opt函数用于读取file_path文件的内容,在没有被调用时,不会占用内存,节省内存空间。
# 在for循环时,调用file_opt函数,此时因为使用到生成器函数(yield)返回一个list,该作用是没读取一行数据,返回一次结果,当在for中找到结果,则立马break,也起到节省内存的效果。
def file_opt():
with open(r'file_path',encoding='utf-8') as f:
for line in f:
lst = line.strip().split('|')
yield lst
username = input('user:')
password = input('password')
generator = file_opt()
for l in generator:
if l[1] == username and l[2] == password
print('login success')
break
else
print('login failure')
生成器表达式
generator = (i的操作 for i in 可迭代类型 if i的条件) --->执行后,不占内存,使用generator时,才会占用内存
列表推导式
lst = [i的操作 for i in 可迭代类型 if i的条件] --->执行后,数据多大占用多大内存
浙公网安备 33010602011771号