參考:python
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/函數
http://blog.csdn.net/alvine008/article/details/43410079工具
在函數fun實現中,若是使用yield,那麼函數返回值就是一個generator,用於迭代。迭代的next隱含在for 循環中,每次next,fun就相似產生一箇中斷,返回yield後面的語句。spa
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b 不是很好,若是返回值要使用,就不行了 # 若是用list保存,浪費資源 a, b = b, a + b n = n + 1 if __name__ == '__main__': for n in fab(5): print n
說明:.net
(1)含有yield的函數A的返回值,能夠做爲入參傳遞給函數B中for循環處理,函數B中同時也能夠含有yield,返回值繼續做爲參數給函數C處理……………….。例如:開發一個工具,讀pcap報文,對長度超過1000的報文分片,那麼,讀報文函數read_pkt中可用yield,分片處理frag_pkt中也可使用yield,最後的寫結果 write_ret可使用 fag_pkt的返回直接寫結果,整個流程就是:read_pkt---frag_pkt---write_ret的順序調用,很簡介!!!設計
(2)好處,一系列含有yield的函數,在前後順序的流水線上處理,前一函數的輸出(yield),不須要定義對象來保存輸出結果,使用yield後的返回值,能夠繼續傳遞給下一個函數,總體設計更加簡潔高效。code
(3)對有 yield函數的返回值,for循環變量完成後,不能再進行for循環遍歷!!!!!對象