python中的装饰器、生成器和迭代器

一、装饰器

作用:为原函数添加新功能

示例:

 1 import time
 2 #为function1添加计时功能
 3 def show_tine(func):
 4     def inner():
 5         start = time.time()
 6         func()
 7         end = time.time()
 8         print('spend %s' % end-start)
 9     return inner
10 
11 @show_time    #等同于function1 = show_time(function1)
12 def function1():
13     print('operating----')

 

二、列表生成式(相当于直接做出n道菜,并摆出来;执行操作,并为所有结果都开辟内存空间)

功能:把所有计算出的结果,以列表的形式返回

示例:

[对x的操作式(可放函数) for x in 可迭代对象]

 

三、生成器(可以理解为会做n道菜的厨师,并且是特殊的迭代器)

1 功能:将多次的数据处理,分成一次次进行,或者将不同的代码块依次执行

2 生成示例:

1 #生成器类型1
2 (对x的操作式(可放函数) for x in 可迭代对象)
3 
4 #生成器类型2
5 def generator_obj():
6     代码块1
7     yield 返回值1
8     代码块2
9     yield 返回值2

3 调用取值

方法:

next(generator_obj) 

generator_obj.__next__() 

generator_obj.next()(in python2.x )

示例:

#取值方法1
ret1 = next(generator_obj)    #执行代码快1,并取得返回值1
ret1 = next(generator_obj)    #执行代码快2,并取得返回值2
#注意:一次只能执行一个代码块,并且只能按顺序执行

#取值方法2
#依次执行代码块,并打印返回值
for i in generator_obj():
    print(i)    

 4 往生成器传值

方法:

generator_obj.send()

功能:为yield前面的变量赋值,然后执行后面的代码块

示例:

 1 #生成器
 2 def generator_obj():
 3     代码块1
 4     name = yield 返回值1
 5     代码块2
 6     age = yield 返回值2
 7 
 8 g = generator_obj()
 9 next(g)    #或者g.send(None)
10 g.send("xiaokai")

注意:每次执行完毕,生成器会停留在yield语句上,下次进入也会先进去yield语句。只用从yield语句进入,才可进行传值,所以第一次进入应为generator_obj.send(None)

 

四、迭代器

1.可迭代对象:内部有iter方法的对象

2.迭代器的作用:以时间换空间,以极少的内存换取无限多的需被处理的数据

3.迭代器的生成

1 #in python 3.x
2 iter(iterable_obj)
3 iterable_obj.__iter__()
4 
5 #in python 2.x
6 iterable_obj.iter()

4.迭代器协议

4.1 内部需有next()方法

4.2 内部需有iter()方法

 

五、for循环的内部实现机制

1 while True:
2     try:
3         i=next(iter(iterable))
4     except StopIteration as e:
5         print("Generator return value ", e.value")
6         break

 

posted @ 2021-02-13 18:16  notesForKai  阅读(182)  评论(0)    收藏  举报