1. 程式人生 > >生成器&迭代器

生成器&迭代器

#列表生成式
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