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

首頁 > 編程 > Python > 正文

Python中生成器和迭代器的區別詳解

2020-02-22 23:12:45
字體:
來源:轉載
供稿:網友

Python中生成器和迭代器的區別(代碼在Python3.5下測試):

Num01–>迭代器

定義:

對于list、string、tuple、dict等這些容器對象,使用for循環遍歷是很方便的。在后臺for語句對容器對象調用iter()函數。iter()是python內置函數。

iter()函數會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內的元素。next()也是python內置函數。在沒有后續元素時,next()會拋出一個StopIteration異常,通知for語句循環結束。

迭代器是用來幫助我們記錄每次迭代訪問到的位置,當我們對迭代器使用next()函數的時候,迭代器會向我們返回它所記錄位置的下一個位置的數據。實際上,在使用next()函數的時候,調用的就是迭代器對象的_next_方法(Python3中是對象的_next_方法,Python2中是對象的next()方法)。所以,我們要想構造一個迭代器,就要實現它的_next_方法。但這還不夠,python要求迭代器本身也是可迭代的,所以我們還要為迭代器實現_iter_方法,而_iter_方法要返回一個迭代器,迭代器自身正是一個迭代器,所以迭代器的_iter_方法返回自身self即可。

一些術語的解釋:

1,迭代器協議:對象需要提供next()方法,它要么返回迭代中的下一項,要么就引起一個StopIteration異常,以終止迭代。
2,可迭代對象:實現了迭代器協議對象。list、tuple、dict都是Iterable(可迭代對象),但不是Iterator(迭代器對象)。但可以使用內建函數iter() ,把這些都變成Iterable(可迭代器對象)。
3,for item in Iterable 循環的本質就是先通過iter()函數獲取可迭代對象Iterable的迭代器,然后對獲取到的迭代器不斷調用next()方法來獲取下一個值并將其賦值給item,當遇到StopIteration的異常后循環結束

Python自帶容器對象案例:

# 隨便定義一個listlistArray=[1,2,3]# 使用iter()函數iterName=iter(listArray)print(iterName)# 結果如下:是一個列表list的迭代器# <list_iterator object at 0x0000017B0D984278>print(next(iterName))print(next(iterName))print(next(iterName))print(next(iterName))#沒有迭代到下一個元素,直接拋出異常# 1# 2# 3# Traceback (most recent call last):# File "Test07.py", line 32, in <module># StopIteration

Python中一個實現了_iter_方法和_next_方法的類對象,就是迭代器,如下案例是計算菲波那切數列的案例

class Fib(object): def __init__(self, max):  super(Fib, self).__init__()  self.max = max def __iter__(self):  self.a = 0  self.b = 1  return self def __next__(self):  fib = self.a  if fib > self.max:   raise StopIteration  self.a, self.b = self.b, self.a + self.b  return fib# 定義一個main函數,循環遍歷每一個菲波那切數def main(): # 20以內的數 fib = Fib(20) for i in fib:  print(i)# 測試if __name__ == '__main__': main()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙坪坝区| 屯昌县| 都安| 叶城县| 广宗县| 丰原市| 湘潭县| 通山县| 栾川县| 潜江市| 简阳市| 陈巴尔虎旗| 方正县| 新竹县| 保定市| 延庆县| 滨海县| 卢氏县| 衡阳县| 华亭县| 西充县| 兴宁市| 苍山县| 睢宁县| 保亭| 苍南县| 铜川市| 庆云县| 马山县| 靖安县| 西吉县| 济阳县| 独山县| 峨边| 塘沽区| 内黄县| 西安市| 新宾| 乡城县| 洪泽县| 长沙县|