国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

解析Python中的生成器及其與迭代器的差異

2019-11-25 16:42:45
字體:
來源:轉載
供稿:網友

生成器
生成器是一種迭代器,是一種特殊的函數,使用yield操作將函數構造成迭代器。普通的函數有一個入口,有一個返回值;當函數被調用時,從入口開始執行,結束時返回相應的返回值。生成器定義的函數,有多個入口和多個返回值;對生成器執行next()操作,進行生成器的入口開始執行代碼,yield操作向調用者返回一個值,并將函數掛起;掛起時,函數執行的環境和參數被保存下來;對生成器執行另一個next()操作時,參數從掛起狀態被重新調用,進入上次掛起的執行環境繼續下面的操作,到下一個yield操作時重復上面的過程。Python的循環操作與C語言的實現不同,如果使用List等數據結構需要耗費大量的內容;循環操作中使用生成器只需要在內存中實例化一個對象,可以減少內存占用,提高循環操作的執行速度。

>>>def myG():...  yield 1...  yield 2...  yield 3...>>>g=myG()>>>next(g)1>>>next(g)2>>>next(g)3>>>next(g)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration>>>g2=myG()>>>for i in g2:...  print(i)123

生成器表達式
for...[if]...語句可以簡潔的構建一個List,同時也可以用來構建生成器。

>>>a=[7,8,9]>>>b=[i**2 for i in a]>>>b[49, 64, 81]>>>ib=(i**2 for i in a)>>>ib<generator object <genexpr> at 0x7f72291217e0>>>>next(ib)49>>>next(ib)64>>>next(ib)81>>>next(ib)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration

迭代器(Iterator)與生成器(Generator)的區別
迭代器是一個更抽象的概念,任何對象,如果它的類有next方法(next python3)和iter方法返回自己本身。

每個生成器都是一個迭代器,但是反過來不行。通常生成器是通過調用一個或多個yield表達式構成的函數s生成的。同時滿足迭代器的定義。

當你需要一個類除了有生成器的特性之外還要有一些自定義的方法時,可以使用自定義的迭代器,一般來說生成器更方便,更簡單。

def squares(start, stop):  for i in xrange(start, stop):    yield i*i

等同于生成器表達式:

(i*i for i in xrange(start, stop))

列表推倒式是:

[i*i for i in xrange(start, stop)]

如果是構建一個自定義的迭代器:

class Squares(object):  def __init__(self, start, stop):    self.start = start    self.stop = stop  def __iter__(self):    return self  def next(self):    if self.start >= self.stop:      raise StopIteration    current = self.start * self.start    self.start += 1    return current

此時,你還可以定義自己的方法如:

def current(self):  return self.start

兩者的相同點:對象迭代完后就不能重寫迭代了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湟中县| 楚雄市| 丽江市| 历史| 冷水江市| 易门县| 桃园市| 通辽市| 钦州市| 洛阳市| 林周县| 和静县| 西藏| 阿坝县| 宝应县| 黔西| 阳春市| 扬州市| 普格县| 武清区| 浦县| 高清| 固镇县| 蒙自县| 湘西| 前郭尔| 安平县| 孝义市| 东乌珠穆沁旗| 杭锦后旗| 肇源县| 宝应县| 屏边| 荣成市| 辽阳市| 威远县| 满城县| 龙江县| 郧西县| 宝应县| 平乡县|