• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            為生存而奔跑

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

            留言簿(5)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 330187
            • 排名 - 74

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            轉(zhuǎn)自 http://lukejin.javaeye.com/blog/587051


            前段時(shí)間在讀trac 中wiki模塊的源碼的時(shí)候,發(fā)現(xiàn)了很多地方都使用了yiled這一關(guān)鍵詞,

            感覺是在需要返回某個(gè)值的地方通過yield來代替return,

            不是很明白其用法,所以仔細(xì)研究下。

             

            一個(gè)使用了yiled關(guān)鍵字的函數(shù)就不再是一個(gè)普通的函數(shù)了,而是一個(gè)生成器函數(shù)(generator function),

            當(dāng)函數(shù)被調(diào)用的時(shí)候?qū)⒎祷匾粋€(gè)迭代器(iterator)。

             

            所以下面將分別講解迭代器和生成器這兩個(gè)概念。

             

            一. 迭代器(Iterator)

             

             寫道
            迭代器是一個(gè)對(duì)象,它實(shí)現(xiàn)了迭代器協(xié)議,
            一般需要實(shí)現(xiàn)如下兩個(gè)方法
            1)next方法
            返回容器的下一個(gè)元素
            2)__iter__方法
            返回迭代器自身
             

             

            對(duì)于for語言大家可能都不陌生,我們很多時(shí)候需要對(duì)一些容器對(duì)象進(jìn)行遍歷就會(huì)使用到for循環(huán):

             

            Python代碼  收藏代碼
            1. l=[0,1,2,3,4,5,6]  
            2. for i in l:  
            3.     print i  
             

            l是一個(gè)type為list的對(duì)象,這段for-in代碼在運(yùn)行的時(shí)候其實(shí)是調(diào)用了l的__iter__()函數(shù),返回了一個(gè)實(shí)現(xiàn)了__next__()或next()(各個(gè)版本的python可能不一樣,我試驗(yàn)的時(shí)候所使用的版本為2.6.2)的迭代器對(duì)象,每循環(huán)一次就會(huì)通過next取下一個(gè)元素。

             

            當(dāng)然我們完全沒有必要先把所有的元素都算出來放到一個(gè)list里或者其他容器類里進(jìn)行循環(huán),這樣比較浪費(fèi)空間。

            我們可以直接創(chuàng)建自己的一個(gè)迭代器。

             

            Python代碼  收藏代碼
            1. # -*- coding: utf-8 -*-  
            2.   
            3. '''''Fibonacci iterator'''  
            4.   
            5. class Fib:  
            6.     '''''一個(gè)可以生成Fibonacci 數(shù)列的迭代器'''  
            7.   
            8.     def __init__(self, max):  
            9.         self.max = max  
            10.   
            11.     def __iter__(self):  
            12.         self.a = 0  
            13.         self.b = 1  
            14.         return self  
            15.   
            16.     def next(self):  
            17.         fib = self.a  
            18.         if fib > self.max:  
            19.             raise StopIteration  
            20.         self.a, self.b = self.b, self.a + self.b  
            21.         return fib  
             

             

            定義好了這個(gè)Fibonacci迭代器,我們就可以來使用它了。

             

             

            Python代碼  收藏代碼
            1. from fibonacci2 import Fib  
            2. for n in Fib(1000):  
            3.     print n  
             

            當(dāng)調(diào)用Fib(1000)的時(shí)候,將生成一個(gè)迭代器對(duì)象,每一次循環(huán)都將調(diào)用一次next取到下一個(gè)值。

            所以我們可以看出迭代器有一個(gè)很核心的東西就是在循環(huán)中,迭代器可以記住之前的狀態(tài)。

             

             

            二.生成器

             

            前面我們說了,任何使用了yield關(guān)鍵字的函數(shù)都不再是普通的函數(shù)了,我們還是來看實(shí)例吧,這樣比較容易理解

             

             

            Python代碼  收藏代碼
            1. def fib(max):  
            2.     a, b = 01            
            3.     while a < max:  
            4.         yield a            
            5.         a, b = b, a + b    

               這里簡(jiǎn)單的幾行代碼就實(shí)現(xiàn)了上面的迭代器類那么一大堆代碼所實(shí)現(xiàn)的功能

             

               使用的時(shí)候和上面很類似:

             

             

            Python代碼  收藏代碼
            1. from fibonacci import fib  
            2. for n in fib(1000):  
            3.     print n  

             

            引文fib函數(shù)使用了yield所以它是一個(gè)生成器函數(shù),當(dāng)我們調(diào)用fib(1000)的時(shí)候它其實(shí)是返回了一個(gè)迭代器,且這個(gè)迭代器可以控制生成器函數(shù)的運(yùn)行。

            我們通過這個(gè)返回的迭代器的動(dòng)作控制fib這個(gè)生成器函數(shù)的運(yùn)行。

            每當(dāng)調(diào)用一次迭代器的next函數(shù),生成器函數(shù)運(yùn)行到y(tǒng)ield之處,返回yield后面的值且在這個(gè)地方暫停,所有的狀態(tài)都會(huì)被保持住,直到下次next函數(shù)被調(diào)用,或者碰到異常循環(huán)退出。

             

            所以生成器的概念還是很簡(jiǎn)單的。

             

            三.總結(jié)

             

            1.for-in語句在底層都是對(duì)一個(gè)迭代器對(duì)象進(jìn)行操作的

            2.使用了yield關(guān)鍵字的函數(shù)就是一個(gè)生成器函數(shù),被調(diào)用的時(shí)候生成一個(gè)可以控制自己運(yùn)行的迭代器




            實(shí)驗(yàn):

            生成器并不是事先生成所有的結(jié)果,而是需要時(shí)生成



            def fib(max):
                a, b 
            = 0, 1
                
            while a < max:
                    
            yield a
                    
            print 'yield'
                    a, b 
            = b, a+b

            for n in fib(10):
                
            print 'for'
                
            print n

            運(yùn)行結(jié)果

            for
            0
            yield
            for
            1
            yield
            for
            1
            yield
            for
            2
            yield
            for
            3
            yield
            for
            5
            yield
            for
            8
            yield


            posted on 2011-03-15 23:11 baby-fly 閱讀(2024) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Python

            Feedback

            # re: 從python的yield說起[未登錄] 2011-08-17 22:34 哈哈
            很清楚,謝謝  回復(fù)  更多評(píng)論
              

            国产成人综合久久综合| 精品久久久久久国产潘金莲| 久久精品国产只有精品66| 国产成人精品久久一区二区三区av | 久久青青草原精品国产| 久久亚洲综合色一区二区三区| 久久精品国产99久久丝袜| 无码人妻精品一区二区三区久久 | 久久久一本精品99久久精品66| 亚洲午夜精品久久久久久人妖| 亚洲欧美国产日韩综合久久| 精品久久久久久久无码| 亚洲国产视频久久| 91精品日韩人妻无码久久不卡| 久久午夜夜伦鲁鲁片免费无码影视| 久久99精品综合国产首页| 亚洲中文字幕无码久久综合网| 国产精品久久久天天影视香蕉| 亚洲国产精品无码久久久秋霞2 | 久久青青草原精品影院| 奇米综合四色77777久久| 无夜精品久久久久久| 久久精品一区二区三区中文字幕| 国内精品九九久久久精品| 精品国产日韩久久亚洲| 色偷偷88欧美精品久久久| 人人狠狠综合久久亚洲88| 97久久精品无码一区二区| 久久国产免费观看精品3| 亚洲中文久久精品无码ww16| 一本一道久久a久久精品综合 | 国产精品久久99| 91精品国产高清久久久久久io| 久久九九久精品国产| 久久影院午夜理论片无码| 久久精品国产亚洲AV影院| 久久福利资源国产精品999| 国产精品久久久久免费a∨| 亚洲国产成人久久综合区| 欧美久久亚洲精品| 中文字幕无码av激情不卡久久|