標籤:send rabl 一個 通過 max als 步驟 nbsp 資料
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,127 while(n<max):28 n += 129 yield b #yield是會返回當前值給函數,執行一次,__next__方法會調用yeild值30 a,b = b,a+b31 return "---done---"32 from collections import Iterator33 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 break43 #send 會喚醒當前產生器,並傳遞一個值給yeild44 45 def consumer(name):46 print("%s 準備開始吃包子了"%name)47 while True:48 baozi = yield49 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)) #True68 print(isinstance({},Iterable)) #True69 print(isinstance((),Iterable)) #True70 print(isinstance("abcd",Iterable)) #True71 print(isinstance((x for x in range(10)),Iterable)) #True72 print(isinstance(100,Iterable)) #False73 74 #迭代器75 #1. 可以被next()函數調用並不斷返回下一個值的對象稱為迭代器76 #2. 可以同isinstance()判斷一個對象是否是Iterator77 #3. 產生器都是迭代器,但列表,字串,字典等不是迭代器,可以使用iter()函數變成迭代器78 from collections import Iterator79 print(isinstance((x for x in range(10)),Iterator)) #True80 print(isinstance([],Iterator)) #False81 print(isinstance(iter([]),Iterator)) #True
python---產生器、迭代器