python---產生器、迭代器

來源:互聯網
上載者:User

標籤: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---產生器、迭代器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.