本章还有点迷糊,仅限于知道,待慢慢发掘
高阶函数:
1.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
2.返回值中包含函数名(不修改函数的调用方式)
示例:
def add(a,b,func)
return func(a)+func(b)
res = add(3,-6,abs) #把求绝对值函数当做参数传递进add函数
装饰器(decorator):又叫语法糖 本质是函数,功能是装饰其他函数,为其他函数添加附加功能
原则:1.不能修改被装饰的函数的源代码.2.被装饰的函数的调用方式不能修改
实现装饰器的知识储备:
1.函数即"变量"
2.高阶函数
3.嵌套函数
高阶函数+嵌套函数=装饰器
应用:在被装饰的函数定义上面一行加上:@装饰器名字
func()与func的区别
func()是func函数运行后的返回值
func是func这个函数的变量名,也就是内存地址,在装饰器里面通函数变量名传参或者返回函数变量名来应用
装饰器还得再看看
====================================================================
生成器(generator):
g = (i*2 for i in range(10)) #用()加推导式生成的是生成器,g是generator
l = [i*2 for i in range(10)] #用[]加推导式生成的是列表,l是list
生成器跟列表的区别是生成器只有在访问的时候才会生成相应的数据
生成器不支持下标,切片等
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值
生成器可以用循环来生成并遍历
可以把一个函数变一个生成器,只要把函数内部生成值得地方用yield(变量名),就把这个变量添加到生成器里
之后可以用一个变量名接收这个生成器,并用__next__访问
只要函数内部有yield存在,这个函数就不是函数,而是一个生成器.而函数最后的return的值则变成了这个生成器异常的报错信息
通过生成器可以实现单线程并发,有待研究
generator.send(value) #send方法可以唤醒yield,并给yield传送一个值
===============================================
可直接用for循环的数据类型:
1.集合数据类型:list upledictsetstr
2.generater,包括生成器和带yield的generator function
这些可直接用for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是Iterable对象
from collections.abc import Iterable #使用前得导入
isinstance([],Iterable)
迭代器(Iterator)
可以被next()函数调用并不断返回下一个值得对象统称为迭代器(Iterator)
可以使用isinstance()判断一个对象是否是Iterator对象
from collections.abc import Iterator
isinstance((x for x in range(10)),Iterator)
生成器都是Iterator对象,但listdictstr等虽然是Iterable,但不是Iterator
可以使用iter()函数把Iterable变成Iterator
Iterator对象表示的是一个数据流,可以用next()按需计算,甚至可以表示一个无限大的数据流,例如全体自然数,而列表永远不可能存储全体自然数
for循环本质上就是通过不断调用next()函数实现的