day13_闭包函数、装饰器、迭代器、表达式
闭包函数
意义:将函数和函数需要用到的参数包裹到一起,这样当调用函数时,该参数的第一查找作用域为被包在一起参数
def func1(x):
print(x)
def outer(x):
def inner():
print(x)
return inder
func = outer(x)
func() # 此时不需要再传参数,以后调用直接使用即可
装饰器
用闭包的思想,将被装饰的函数与装饰的功能包在一起
要求:
1、不能使得被装饰函数的源代码改变
2、不得更改被装饰函数的调用方式
无参装饰器
即被装饰的函数无参
def index():
print('A')
def deco(func):
def wrapper():
# 在wrapper中对真正的func函数做功能添加
res = func() # 调用被装饰函数
return res
return wrapper
# 调用
index = deco(index) # 参数为函数对象,重命名装饰之后的wrapper 为原来的函数名,左到以假乱真,实现不改变调用方式的作用
index()
有参装饰器
即被装饰的函数有参
def index(x):
print(x)
def deco(func):
# 无论原来的func有多少参数,都能接收
def wrapper(*args,**kwargs):
# 在wrapper中对真正的func函数做功能添加
res = func(*args,**kwargs) # 调用被装饰函数
return res
return wrapper
# 调用
index = deco(func)
index(x)
多层装饰器
当内层装饰器需要参数时,仍然使用闭包思想,将装饰器函数与参数包在一起
def index(x):
print(x)
def sanceng(x):
def deco(func):
def wrapper(*args,**kwargs):
# 在wrapper中对真正的func函数做功能添加
res = func(*args,**kwargs) # 调用被装饰函数
return res
return wrapper
return deco
# 调用
index = sanceng(x)(func)
index()
装饰器语法糖
在定义被装饰函数时,在它的上面一行使用格式@装饰器名字
@deco
def index(x):
print(x)
如果是多层装饰器,则使用格式@装饰器名字(x),注意传参(实参)
@sanceng(19)
def index(x):
print(x)
迭代器
迭代的工具,基于上一次的结果,重复进行某种操作
可迭代对象
python中一切为对象(数据类型)
其中含有__iter__内置方法的,叫做可迭代对象
如str,list,tuple,dict,set,file都是可迭代对象
调用__iter__方法后得到的返回值,拥有__next__方法,即为迭代器对象
迭代器对象
其中含有__iter__和__next__内置方法的,叫做迭代器对象
目前所学,只有file是同时含有__iter__和__next__方法,是迭代器对象
迭代器的用法
调用一次__next__方法,遍历一个元素
for循环原理
lt = [1,2,3]
lt_iter = lt.__iter__
while True:
try:
print(lt.iter.__next__)
except Expection:
break
生成器
使用定义函数的方式,自定义一个迭代器,即为生成器
def g():
yield 1
yield 2
yield 3
print(g)
g = g()
print(g)
'''
<function g at 0x00000248B8872F78>
<generator object g at 0x00000248BFACBA48>
'''
# 迭代循环
for i in g:
print(i)
'''
1
2
3'''
定义一个range()方法
'''
1、参数可能是关键字实参
2、可能有位置实参和关键字实参组合
'''
起始结束全部为位置实参,步长默认1,起始默认0
def range(stop,start=0,end=2):
i = 0
while True:
if i < start:
i += 1
continue
if i >= stop:
break
yield i
i += end
for i in range(1,5):
print(i)
起始结束不全是位置实参,步长默认1(大于等于三参数版本,小于三参数的未写)
def range(*args, **kwargs):
start = 0
stop = 1
end = 1
if len(args) + len(kwargs) > 3:
return
if len(args) == 0:
for k, v in kwargs.items():
if k not in ['start', 'stop', 'end']:
break
if k == 'start':
start = v
if k == 'stop':
stop = v
if k == 'end':
end = v
# 拿到start,stop,end之后
i = 0
while True:
if i < start:
i += 1
continue
if i >= stop:
break
yield i
i += end
elif len(args) == 1:
start = args[0]
for k, v in kwargs.items():
if k not in ['stop', 'end']:
break
if k == 'stop':
stop = v
if k == 'end':
end = v
# 拿到start,stop,end
i = 0
while True:
if i < start:
i += 1
continue
if i >= stop:
break
yield i
i += end
elif len(args) == 2:
if 'end' not in kwargs:
return
end = kwargs['end']
start, stop = args
# 拿到start,stop,end
i = 0
while True:
if i < start:
i += 1
continue
if i >= stop:
break
yield i
i += end
elif len(args) == 3:
start, stop, end = args
i = 0
while True:
if i < start:
i += 1
continue
if i >= stop:
break
yield i
i += end
花里胡哨表达式
三元表达式
条件成立时的返回值 if 条件 else 条件不成立时的返回值
# 函数版
def (x,y):
if x > y:
return x
return y
# 表达式版
res = x if x > y else y
列表推导式
按照某种规律生成一个列表
lis = [i**2 for i in range(10)]
print(lis)
'''
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
'''
字典生成式
按照某种规律生成一个字典
dic = {'a'*i:i**2 for i in range(10)}
print(dic)
'''
{'': 0, 'a': 1, 'aa': 4, 'aaa': 9, 'aaaa': 16, 'aaaaa': 25, 'aaaaaa': 36, 'aaaaaaa': 49, 'aaaaaaaa': 64, 'aaaaaaaaa': 81}'''

浙公网安备 33010602011771号