装饰器(本质:函数)
定义:为其他函数添加附加功能(装饰器对于被装饰函数是“透明的”、“不存在的”);执行过程:调用被装饰函数实际上是调用修饰函数
原则:
不能修改被装饰函数的源代码;
不能修改被装饰函数的调用方式。
实现装饰器的知识补充:
函数即“变量”:
调用前先定义(即要先有内存地址空间、函数的执行顺序)
可赋值给其他函数名
高阶函数
条件一:一个函数名(被装饰的函数)当作实参传给另一个函数(装饰函数);(满足原则一不修改被装饰函数的源代码)
条件二:返回值中包含函数名(装饰函数)。(满足原则二不修改被装饰函数的调用方式)
函数嵌套
举例:
统计运行时间的装饰器
页面登录认证
生成器
创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
而生成器节省大量的空间,因为生成器只有在调用时才会生成相应的数据。
知识补充:
列表生成式(列表解析):
斐波那契数列:
生成器特点:
生成器只有在调用时才会生成相应的数据
只记录当前位置,用到哪记录到哪
只有一个方法__next__(),python2 为next()
生成器的实现:
方法一:列表生成式。
方法二:在函数定义中包含yield关键字。
获取生成器的值:
使用__next__()
for、while循环
应用:
当使用__next__()获取生成器的值的数量超过总的数量时:
在单线程实现并发运算的效果(携程??)
补充:send()用于给yield传值,但是send传值时,要求生成器已执行到yield语句处(就是send前面至少要有一个__next__(),这样才能保证生成器运行到yield处
这时,这个函数就不再是一个普通函数,首次调用__next__()的时候执行生成器函数,遇到yield语句时返回,再次执行(__next__()或send()或for、while等)时将从上次返回的yield语句处继续执行。
迭代器
Iterable对象:可以直接作用于for循环的对象统称为可迭代对象
集合数据类型,如list、tuple、dict、set、str等;
生成器generator,包括带yield的generator function。
内置函数:map()、filter()、zip(a,b)
Iterator对象:可以被next()函数调用并不断返回下一个值的对象称为迭代器对象
生成器generator
内置函数:map()、filter()、zip(a,b)
判断一个对象是否是Iterable对象:
判断一个对象是否是Iterator对象:
把Iterable对象变成Iterator对象:
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
补充:
Python的for循环本质上就是通过不断调用next()函数实现的,例如: