生成器&迭代器
阿新 • • 發佈:2018-11-09
#列表生成式
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) # send給yield傳值 喚醒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