生成器&迭代器

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

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章