python基础-装饰器、迭代器、生成器
一、装饰器
装饰器:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则: 1.不能修改被装饰的函数的源代码
2.不能修改被装饰的函数的调用方式
实现装饰器知识储备:
1.函数即变量
2.高阶函数
a 把一个函数名当实参传给另外一个函数(在不修改源代码情况下,为其添加功能)
b 返回值中包含函数名(不修改函数的调用方式)
3.嵌套函数
函数内部定义函数,而不是调用
高阶函数+嵌套函数=装饰器
举个例子:
1 import time 2 def timmer(func): 3 def warpper(*args,**kwargs): 4 start_time=time.time() 5 func(*args,**kwargs) 6 stop_time=time.time() 7 print("the func run time:%s"%(stop_time-start_time)) 8 return warpper 9 @timmer # test1=timer(test1) 10 def test1(): 11 time.sleep(1) 12 print("in the test1") 13 test1()
二、迭代器
# 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
# 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterable对象
可以使用isinstance()判断一个对象是否是Iterator对象
三、生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
举例:
b=(i*2 for i in range(100000)) # 生成器 # print(b[10]) # 报错 print(b) print(b.__next__()) print(b.__next__()) print(b.__next__()) print(b.__next__())
生成器只有在调用时才会生成相应的数据
只记录当前位置
只有一个__next__()方法
参考博客:金角大王等唐僧的日子http://www.cnblogs.com/alex3714/
可能你不快乐,可我要你快乐

浙公网安备 33010602011771号