python装饰器事例
输出0-99的所有数
def decorator(fn):
def wrapper():
return fn() #与下面的对比,格式实际上是一样的。这是无参,下面是有参。
return wrapper
@decorator
def print_4_list():
for i in range(100):
yield i
if __name__=='__main__':
for x in print_4_list():
print (x)
assert isinstance(x,int)
0-99,输出4个为一组
def decorator(func):
def wrapper(*args, **kw):
i = 0
for j in func(*args, **kw):
if (j + 1) % 4 == 0:
yield list(func(*args, **kw))[i:j+1]
i = j + 1
return wrapper
@decorator
def print_4_list():
for i in range(100):
yield i
if __name__ == '__main__':
for x in print_4_list():
print(x)
assert isinstance(x, list)
(1)def wrapper(*args, **kw):一般的装饰器都可以这样写,我们可以认为装饰器在调用函数前先调用了一个装饰器函数。要对变量操作的代码就可以写在这个装饰器函数里。
(2)for j in func(*args, **kw):这个就是装饰器调用这个装饰器函数作为范围进行对变量的基本运算。
(3)yield list(func(*args, **kw))[i:j+1]:yield相当于return;func就是要装饰的函数;list就是列表,把func函数返回值转为列表类型;[i:j+1]就是列表切片。因为是从0开始的,所以截止到j+1;*args是可变参数,可以传入多个参数,把多个参数变成一个元组,传入函数中;**kw是关键字参数,调用参数是可以不为他传值;*args,**kw可以概括所有函数的参数情况。
(4)if name == ‘main’:就是主函数
print(x):x就已经是装饰器整理好的list了,每个list里4个元素
assert isinstance(x, list):assert语句是插入调试断点到程序的一种便捷方式;isinstance(x, list)就是检测x的类型是不是list类型。返回true和false。
不用装饰器
a=[i for i in range(100)]
n=4
print([a[i:i + n] for i in range(0, len(a), n)])