生成器&迭代器

#列表生成式
print([ i*2 for i in range(10)])
print(range(10))

#生成器 generator 只有在调用时才会生成相应的数据
print(( i*2 for i in range(10)))
b=( i*
2 for i in range(10))
#for i in b:
#    print(i)
print(b.__next__())

#斐波那契数列
def fib(max):
    n,a,b =
0,0,1
   
while n<max:
       
print(b)
        a,b=b,a+b
        n=n+
1
   
return 'done'
fib(10)
#a,b=b,a+b a=b=b b=a+b
#t=(b,a+b)
a=t[0] b=t[1]

#generatot
斐波那契生成器
def fib(max):
    n,a,b =
0,0,1
   
while n<max:
       
yield b #生成器 yield返回到外面
       
a,b=b,a+b
        n=n+
1
   
return 'wrong' #异常打印的消息
f = fib(10)
print(fib(10))
g=fib(
10)
while True:
   
try:
        x=
next(g)
       
print('g:',x)
   
except StopIteration as e:
       
print("Generator return value", e.value)
       
break

#try:                        #执行try下面的语句,如果条件到了不满足try下面的语句
#        x=next(g)           
那么看是返回值是否有 except条件的StopIteration 关键字,并赋值e
#        print('g:',x)        
打印 return wrong
#except StopIteration as e:
#        print("Generator return value", e.value)

print(f.__next__())
print("----------")   #可以干点别的事
print(f.__next__())
print(f.__next__())
print("--------start loop----") #继续循环取数
#for i in f:
#    print(i) #
取数超出范围不会抛出异常
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())  #取数超出范围会抛出异常

#
并行
import time
def consumer(name):
   
print("%s准备吃包子了"%name)
   
while True:
        baozi =
yield #保存当前状态返回
       
print("包子[%s]来了,被[%s]吃了!"%(baozi,name))
c = consumer(
"刘德华")
c.
__next__() #唤醒generator
b1 ="韭菜馅"
c.send(b1) #  sendyield传值  唤醒generator并传值
c.__next__()
##########################################

import time
def consumer(name):
   
print("%s准备吃包子了"%name)
   
while True:
        baozi =
yield #保存当前状态返回
       
print("包子[%s]来了,被[%s]吃了!"%(baozi,name))
def producer(name):
    c = consumer(
'A')
    c2 = consumer(
'B')
    c.
__next__()
    c2.
__next__()
   
print("开始吃包子...")
   
for i in range(10):
        time.sleep(
1)
       
print("做了2个包子")
        c.send(i)
        c2.send(i)
producer(
"lei")

#迭代器 可以for循环的数据类型 list tuple dict set str
#
可以for循环的数据结构 generator
#
可用for循环叫可迭代对象:Iterable
#
可以用isinstance()判断是否Iterable
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance('abc',Iterable))
print(isinstance({},Iterable))
print(isinstance((),Iterable))
print(isinstance(100,Iterable))
#可以被next()函数调用并不断返回下一个值的对象叫迭代器:Iterator
#
可以使用isinstance()判断UI个对象是否是Iterator

from collections import Iterator
a=[
1,2,3]
#print(dir(a))  #查看a所能用的方法 没有next方法就不叫迭代器Iterator
print(isinstance((x for x in range(5)),Iterator)) # 生成器就是迭代器
print(isinstance([],Iterator)) #函数 列表 字典 字符串 元组都不是迭代器
print(isinstance({},Iterator))
print(isinstance('abc',Iterator))
#函数 字典 列表 元组 字符串 变成迭代器可以使用iter()函数
b = [1,2,3]
a=
iter(b)
print(a.__next__())
print(a.__next__())
#Iterator是一个数据流,可以被next()调用,并返回下一个数据,是惰性的
#
只有不断调用next()实现计算下一个数据,只要有需要才会计算
#
,可以表示为一个无限大的数据,而list则不行,所以不耗资源来运行,运行速度快
it = iter([1,2,3,4,5])
while True:
   
try:
        x =
next(it)  #相当于迭代器
   
except StopIteration:
       
break

 


猜你喜欢

转载自blog.51cto.com/13707996/2314861