1. 程式人生 > >python---生成器、叠代器

python---生成器、叠代器

code true top utf iterable 執行 判斷 調用 --

 1 # -*- coding:utf-8 -*-
 2 # LC
 3 # 列表生成式
 4 def func(x):
 5     print(x)
 6     return 2*x
 7 print([ func(i) for i in range(10) ])
 8 
 9 a = [ i*2 for i in range(1000000000000)]        #此列表生成式會占用大量內存空間,在沒有調用的情況下,列表已經存在於內存中
10 len(a)
11 # 生成器
12 b = ( i*2 for i in range(1000000000000))        #生成器,只有在調用b的時候,才會按著規則進行運算,將結果返回給b,使用的時候才占用內存,速度快
13 #生成器不支持切片 14 b[100] #這種無法直接取出來 15 for i in b: 16 print(i) 17 18 #生成器 19 #1.只有在調用的時候,才會生成相應的數據 20 #2.只記錄當前的位置 21 #3.只有一個__next()__方法 22 23 #fibnacci函數 24 #函數生成器,使用yield,用了yield的函數,就不在是一個函數,而是一個生成器 25 def fib(max): 26 n,a,b = 0,0,1 27 while(n<max): 28 n += 1 29 yield
b #yield是會返回當前值給函數,執行一次,__next__方法會調用yeild值 30 a,b = b,a+b 31 return "---done---" 32 from collections import Iterator 33 34 f = fib(1) 35 print("-------",isinstance(f,Iterator)) 36 while True: 37 try: 38 g = f.__next__() 39 print("function generator:"
,g) 40 except StopIteration as e: 41 print("Generator is stop,value is ",e.value) 42 break 43 #send 會喚醒當前生成器,並傳遞一個值給yeild 44 45 def consumer(name): 46 print("%s 準備開始吃包子了"%name) 47 while True: 48 baozi = yield 49 print("包子{%s}來了,{%s}請吃吧!"%(baozi,name)) 50 51 def producer(name): 52 c1 = consumer("A") #此步驟僅是將函數變成生成器,而生成器不會執行,如果要執行則需要調用__next__方法,__next__方法遇到yield則中斷 53 c2 = consumer("B") 54 next(c1) #等於c1.__next__()方法 55 next(c2) 56 print("%s 做包子了"%name) 57 for i in range(6): 58 print("包子[%s]好了,分成兩份"%i) 59 c1.send(i) 60 c2.send(i) 61 62 producer("lvcheng") 63 64 #1. 函數的執行流程是按著順序執行,遇到return和最後一行的時候函數才結束執行,生成器是在每次調用__next__()的時候,在遇到yield語句的時候返回,並在下一次調用的時候,繼續在上一次yield執行的位置繼續 65 #2. 可以通過for循環的對象稱為可叠代對象,可以通過isinstance()判斷一個對象是否為可叠代對象,列表,元組,字典,字符串都是可叠代對象,而整數則不是 66 from collections import Iterable #導入Iterable可以判斷一個對象是否為可叠代對象 67 print(isinstance([],Iterable)) #True 68 print(isinstance({},Iterable)) #True 69 print(isinstance((),Iterable)) #True 70 print(isinstance("abcd",Iterable)) #True 71 print(isinstance((x for x in range(10)),Iterable)) #True 72 print(isinstance(100,Iterable)) #False 73 74 #叠代器 75 #1. 可以被next()函數調用並不斷返回下一個值的對象稱為叠代器 76 #2. 可以同isinstance()判斷一個對象是否是Iterator 77 #3. 生成器都是叠代器,但列表,字符串,字典等不是叠代器,可以使用iter()函數變成叠代器 78 from collections import Iterator 79 print(isinstance((x for x in range(10)),Iterator)) #True 80 print(isinstance([],Iterator)) #False 81 print(isinstance(iter([]),Iterator)) #True

python---生成器、叠代器