装饰器
装饰器目的:在不改变原函数代码,在函数执行前后自定义功能。
装饰器格式:
def 外层函数(参数):
def 内层函数(*args,**kwargs):
return 参数(*args,**kwargs)
return 内层函数
def x(func):
def y():
ret = func()
return ret
return y
装饰器的应用
@x
def index():
pass
执行函数,自动出阿发装饰器了
v= index()
print(v)
推导式
列表推导式
目的:方便的生成一个列表
格式:v = [i for i in 可迭代对象]
v= [i for i in 可迭代对象 if 条件] 条件为True才进行append
v1 = [i for i in 'zcy'] v1 =['z','c','y']
v2 = [i for i in ['zcy','aaa']] v2 = ['zcy','aaa']
v3 = [i+10 for i in range(10)] v3 = [11,12,13,14,15,16,17,18,19]
v4 = [99 if i > 5 else 66 for i in range(10)]
v5 = [lambda :i for i in range(10)]
res = v5(4)() 全部都是9
v6 = [lambda x:x*i for i in range(10)] 此时i等于9
v6里面是十个内存地址
v6[0](2) 结果是18
def num():
...: return [lambda x:i*x for i in range(4)]
print([m(2) for m in num()]) #求值
筛选
v = [i for i in range(10) if i > 5] 条件成立True append进去,不成立不append
元组推导式
和列表生成式一样,括号变成{},去重
字典推导式
v = {'k'+str(i):i for i in range(10)}
data_list = [
(1,'hahah',19),
(2,'zzz',84),
(3,'ccc',73)
]
info_list = {i[0]:(i[1],i[2]) for i in data_list}
元数据:flask框架
多个装饰器:flask框架
迭代器
自己不会写迭代器,只用
迭代器:帮助你对 某种对象 中的元素进行逐一获取,表象:具有__next__方法且每次调用都获取可迭代对象长得元素
列表转成迭代器: v1 = iter(1,2,3,4) /等价 v1 = (1,2,3,4).__iter__()
迭代器想要获取每个值:反复调用 val = v1.__next__()
直到报错:StopIteration错误,表示已经迭代完毕
如何判断一个对象是否是迭代器:内部是否有__next__方法
可迭代对象
内部具有__iter__方法且返回一个迭代器
可以被for循环
生成器:
函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,
生成器可以被for循环时,生成器函数内部的代码会执行,每次循环都会获得yield返回的值
特殊的可迭代对象
for i in func()
print(i)
也可以使用next从生成器中取值,建议使用for循环
def func():
print(1)
yield 666
val = func()
res = next(val)
print(res) >>>>666
使用next可以推动生成器的执行