今天的知识散记讲三个器,哪三个器呢?装饰器、迭代器、生成器。还有列表生成式、字典生成式。
装饰器:
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
使用闭包完成的装饰器原理:
当执行test(test)时,func已经指向test()函数。所以func()相当于test()。这就是装饰器的原理。但是实际不是这样写的,请看下图:
使用装饰器对有参数的函数装饰:
对不定长参数的装饰:
装饰器对有返回值的函数装饰:
带参数的装饰器
用类做装饰器:
装饰器的一个关键特性:函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。
装饰器完了,自己慢慢悟吧。
迭代器
迭代器只能前进不能后退。使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。
Python中迭代器的本质上每次调用__next__()方法都返回下一个元素或抛出StopIteration的容器对象
由于Python中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:
1、有__next__()方法,返回容器的下一个元素或抛出StopIteration异常
2、有__iter__()方法,返回迭代器本身
all(iterable):如果迭代器里面的所有元素都为True时,返回True;否则返回False
any(iterable):如果迭代器里面的所有元素为False,返回False;否则返回True.
生成器
一个个的生成数据,但占用内存更少,生成器是特殊的迭代器。
当yield存在函数时,函数就变成一个生成器。yield不像return那样返回值,而是每次产生多个值。每次使用yield产生一个值,函数就会被冻结。
用aim.__next__()得出结果:
aim.send()得出结果: