生成器和迭代器
列表生成式
[i*2 for i in range(10)]
生成器
特征:1.只有在调用时才生成新数据
2.只记录当前位置
3.只有__next__()方法 #send可以调用并给yield传值
生成器示例:
def fib(max):
a, b, n = 0, 1, 0
while n<max:
yield b #yield实现生成器
a, b = b, a + b #斐波那契
n=n+1
return 'done'
f=fib(10)
while True: #错误纠正(next调用超出fib循环数量max时,会提示错误,此方法为纠正StopIteration报错)
try:
x=next(f) #x=f.__next__()
print('f:',x)
except StopIteration as e:
print('generator return value:',e.value)
break
生成器用途:单线程实现协成处理
import time
def consumer(name):
print("%s 准备吃饺子了"%name)
while True:
baozi=yield
print("%s包子来了,%s正在吃饺子"%(baozi,name))
def producer(name):
c=consumer("小明")
c2=consumer("大明")
c.__next__() #唤醒准备,打印“准备吃饺子”那句话,因为前面定义大明小明只是将consumer函数变成了生成器,不执行其内容。此句在baozi=yield执行后终止
c2.__next__()
print("开始做饺子")
for i in range(10):
time.sleep(1)
print("做了两个饺子")
c.send(i)
c2.send(i)
producer("隔壁老王")
迭代器
定义:可以被 next()函数调用并不断返回下一个值的对象成为迭代器 :Iterator
可直接作用于for循环的对象成为可迭代对象
*通可过dir确认是否有next方法
判断是否可迭代:
from collections import Iterable
isinstance([],Iterable) #判断列表是否可迭代,返回Ture
生成迭代器方法
Iter() #列表,字典,字符串,(文件:for line in f)

浙公网安备 33010602011771号