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/

posted @ 2017-10-17 17:12  可乐c  阅读(167)  评论(0)    收藏  举报