生成器和迭代器

列表生成式

[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)

 

 

 

 

 

 

posted @ 2019-07-09 16:00  远处是风景  阅读(5)  评论(0)    收藏  举报