python3生成器与迭代器
1 迭代器
定义:迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素访问结束。迭代器只能往前不能后退。
特点:1)访问者不需要关心迭代器的内部结构,仅需要通过next()方法不断去获取下一个内容。
2)不能随机访问集合中的某个值,只能从头到尾依次访问,便于循环比较大的数据集合,节省内存。
下面使用斐波那契数列为例,说明为何使用迭代器: 示例代码1
def fab(max):
n,a,b,=0,0,1
while n<max:
print(b)
a,b = b,a+b
n= n+1
fab(2)
直接在函数fab(max)中用print打印会导致函数的可复用性变差,因为fab返回None。其他函数无法获得fab函数返回的数列。 示例代码2:
def fab(max):
li = []
n,a,b=0,0,1
while n < max:
li.append(b)
a,b=b,a+b
n=n+1
return li
fab(2)
代码2满足了可复用性的需求,但是占用了内存空间,最好不要。 示例代码3
li = [x * x for x in range(10)]
print(li)
l = (x * x for x in range(10))
print(type(l))
print(l.__next__())
print(l.__next__())
print(l.__next__())
## 生成器generator ## 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。 def abc(tmp): while tmp>0: tmp -= 1 yield 1 print("wo")
aa = abc(10)
print(aa.__next__())
print(aa.__next__())
print(aa.__next__())
print(aa.__next__())
作用:这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。另外,还可通过yield实现在单线程的情况下实现并发运算的效果。
import time
def consumer(name):
print("%s 准备尺包子!" %name)
while True:
baozi = yield
print("包子[%s]来了,呗[%s]吃了!" %(baozi,name))
def producer(name):
aa = input("put your name")
bb = input("your name")
c = consumer(aa)
c2 = consumer(bb)
c.__next__()
if 1 ==1:
c2.__next__()
else:
print('b')
c2.__next__()
print("make baozi")
for i in range(10):
time.sleep(2)
print("做了2个包子")
c.send(i) #返回给生成器consumer函数
c2.send(i)
producer('lixingli')
总结: generator是用来产生一系列值得
yield则像是generator函数的返回结果
yeild唯一所做的另一件事就是保存一个generator函数的状态
generator就是一个特殊类型的迭代器(iterator)
和迭代器类似,我们可以通过使用next()来从generator中获取下一个值
通过隐式地调用next()来忽略一些值
更多内容请访问 李兴利博客