>>defspam():yield"first"yield"second"yield"third">>>spam

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python中的生成器(generator)

系統 1864 0

生成器是python中一個非常酷的特性,python 2.2中引入后在2.3變成了標準的一部分。它能夠讓你在許多情況下以一種優雅而又更低內存消耗的方式簡化無界(無限)序列相關的操作。

生成器是可以當做iterator使用的特殊函數,它功能的實現依賴于關鍵字yield,下面是它如何運作一個簡單的演示:

>>> def spam():
yield " first "
yield " second "
yield " third "


>>> spam
< function spam at 0x011F32B0 >
>>> for x in spam():
print x


first
second
third
>>> gen = spam()
>>> gen
< generator object spam at 0x01220B20 >
>>> gen.next()
' first '
>>> gen.next()
' second '
>>> gen.next()
' third '

在函數spam()內定義了一個生成器,但是對spam()的調用永遠只能獲得一個單獨的生成器對象,而不是執行函數里面的語句,這個對象(generator object)包含了函數的原始代碼和函數調用的狀態,這狀態包括函數中變量值以及當前的執行點——函數在yield語句處暫停(suspended),返回當前的值并儲存函數的調用狀態,當需要下一個條目(item)時,可以再次調用next,從函數上次停止的狀態繼續執行,知道下一個yield語句。

生成器和函數的主要區別在于函數 return a value,生成器 yield a value同時標記或記憶 point of the?yield 以便于在下次調用時從標記點恢復執行。? yield ?使函數轉換成生成器,而生成器反過來又返回迭代器。

有三種方式告訴循環生成器中沒有更多的內容:

  1. 執行到函數的末尾("fall off the end")
  2. 用一個return語句(它可能不會返回任何值)
  3. 拋出StopIteration異常

一個 經典的例子 是和C語言中的static語句相比較:在Python沒有明確支持的所謂static變量,但是在函數之間相互調用時,生成器能讓你能以一個更優雅的方式實現類似的效果:

在C語言中 ?fibonacci 函數的實現:

#include < stdio.h >

int main() {
printf(
" 0\n " );
printf(
" 1\n " );
while ( 1 )
printf(
" %d\n " ,fib());
/* for test use */
// int i=0;
// while(i<20){
// i++;
// printf("%d\n", fib());}
}

int fib() {
static unsigned first = 0 ,second = 1 ,next,retval;

next
= first + second;
retval
= next;
first
= second;
second
= next;

return retval;

}

python實現:

# !/usr/bin/env python
#
-*- coding: utf-8 -*-
#
filename: fib.py

def fib():
first
= 0
second
= 1
yield first
yield second

while 1 :
next
= first + second
yield next
first
= second
second
= next

運行:

>>> from fib import fib
>>> fib()
< generator object fib at 0xb76fcfcc >
>>> import itertools
>>> list(itertools.islice(fib(), 10 ))
[0,
1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 ]

也可以用如下方式截取一部分輸出(但建議使用 itemtools 模塊):

>>> for (i, num) in zip(range( 10 ),fib()):
...
print num

上述 fibonacci 函數的實現看起來較為繁瑣,更加簡捷優雅的實現如下:

# !/usr/bin/env python
#
-*- coding: utf-8 -*-
#
filename: fib.py

def fib():
first, second
= 0, 1
while 1 :
yield second
first, second
= second, first + second

注意:但是在C語言中由于static的特性,在一個函數體內當需要產生多組 fibonacci 數列時可能就需要定義相同的諸如fib1() fib2() fib3()的函數。python中可以利用上述函數構造任意多個獨立的生成器對象。

至于生成器(generator)應該使用在哪些方面以便更好地節省內存——你可以使用在需要計算列表的值但是每次只需要訪問一個item的地方,和預先計算好將其存儲在一個列表里相比,生成器在運行中逐個計算其值(computes the values on the fly)。

python中的生成器(generator)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲人体视频 | 国产精品青草久久久久婷婷 | 欧美成人手机在线视频 | 97影院九七影院理论片 | 亚洲国产第一区二区香蕉 | 九九香蕉 | 国内精品久久久久久久久蜜桃 | 成人毛片免费视频播放 | 国产成人精品日本 | 特黄未满14周岁毛片 | 一区二区中文字幕在线观看 | 免费一级a毛片夜夜看 | 五月婷婷在线免费观看 | 成人99国产精品一级毛片 | 免费福利在线 | 久久影视一区 | 亚洲成人在线视频观看 | 亚洲免费一区二区 | 亚洲欧美日韩成人网 | 97婷婷狠狠成人免费视频 | 96国产xxxx | 在线久综合色手机在线播放 | 99热精品免费 | 精品外国呦系列在线观看 | 99中文字幕 | 91精品国产综合久久欧美 | 日本毛片网 | 亚洲黄色在线观看视频 | 日韩欧美中 | 欧美 亚洲 一区 | 久久久男女野外野战 | 亚洲性免费 | 成人四虎影院 | 久久综合九色综合97欧美 | 国产精品久久久 | 亚洲视频在线a视频 | 久久91精品国产一区二区 | 四虎免费永久网站入口 | 日韩一区二区在线观看 | 色婷婷激婷婷深爱五月小蛇 | 欧美91精品久久久久网免费 |