成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 可迭代的對象與迭代器的對比

開發(fā) 后端
什么是迭代?迭代是指按需一次獲取一個數(shù)據(jù)。是否可以迭代,可以通過是否可以使用for循環(huán)取值來進行簡單的判斷。更準(zhǔn)確的判斷是使用iter()函數(shù),這是一個Python內(nèi)置函數(shù)。

[[437056]]

什么是迭代?迭代是指按需一次獲取一個數(shù)據(jù)。是否可以迭代,可以通過是否可以使用for循環(huán)取值來進行簡單的判斷。更準(zhǔn)確的判斷是使用iter()函數(shù),這是一個Python內(nèi)置函數(shù)。

可迭代的對象

iter()函數(shù)的作用如下:

如果對象實現(xiàn)了__iter__方法,那么就調(diào)用它,獲取一個迭代器。比如:

  1. def __iter__(self): 
  2.  
  3. return SentenceIterator(self.words) 

如果對象沒有實現(xiàn)__iter__但是實現(xiàn)了__getitem__方法,那么就創(chuàng)建一個迭代器,嘗試從索引0開始獲取元素。

如果嘗試獲取元素失敗,就會拋出TypeError異常。

可迭代的對象,就是使用iter()函數(shù)判斷,滿足前面2點的對象。

任何Python序列都是可以迭代的,因為它們都實現(xiàn)了__getitem__方法。

迭代器

從前面iter()函數(shù)的作用可以發(fā)現(xiàn),迭代器是從可迭代的對象中獲取的。

如果對象本身是可迭代的,就調(diào)用__iter__方法獲取一個迭代器。

如果對象不可迭代但是實現(xiàn)了__getitem__方法,那么就會創(chuàng)建一個迭代器。

比如可以使用iter()函數(shù)把列表轉(zhuǎn)換為迭代器:

  1. >>> test_list = [1, 2, 3] 
  2. >>> print(type(test_list)) 
  3. <class 'list'
  4.  
  5. >>> test_iter = iter(test_list) 
  6. >>> print(type(test_iter)) 
  7. <class 'list_iterator'

迭代器可以使用for循環(huán)遍歷:

  1. for x in test_iter: 
  2.  
  3. print(x) 

也可以使用while循環(huán)遍歷:

  1. while True
  2.  
  3. try: 
  4.  
  5. print(next(test_iter)) 
  6.  
  7. except StopIteration: 
  8.  
  9. del test_iter 
  10.  
  11. break 
  • next()函數(shù)用于獲取迭代器下一個元素。
  • 沒有元素了,迭代器會拋出StopIteration異常。

標(biāo)準(zhǔn)的迭代器接口有兩個方法:

  • __next__返回下一個元素。
  • __iter__返回self,以便在應(yīng)該使用可迭代對象的地方使用迭代器,比如for循環(huán)中。
  1. def __iter__(self): 
  2.  
  3. return self 

迭代器的準(zhǔn)確定義是:迭代器是這樣的對象,它實現(xiàn)了無參數(shù)的__next__方法,返回序列中的下一個元素;如果沒有元素了,那么拋出StopIteration異常。Python中的迭代器還實現(xiàn)了__iter__方法,因此迭代器也是可以迭代的。

最后,通過對比可以發(fā)現(xiàn),可迭代對象的__iter__返回的是迭代器:

  1. def __iter__(self): 
  2.  
  3. return SentenceIterator(self.words) 

迭代器的__iter__返回的是self:

  1. class SentenceIterator: 
  2.  
  3. def __iter__(self): 
  4.  
  5. return self 

而且迭代器還需要有__next__方法。

從這一點就能清楚看出它們的區(qū)別了。

需要特別注意的是,可迭代的對象一定不能是自身的迭代器,也就是說,可迭代對象必須實現(xiàn)__iter__方法,但是不能實現(xiàn)__next__方法。否則會讓設(shè)計模式變得混亂不堪。

參考資料:

《流暢的Python》第14章 可迭代的對象、迭代器和生成器

 

https://www.runoob.com/python3/python3-iterator-generator.html

 

責(zé)任編輯:武曉燕 來源: dongfanger
相關(guān)推薦

2022-10-26 08:25:06

Python編程迭代器

2020-11-24 08:00:22

JavaScript對象迭代器

2022-10-24 13:02:38

2024-03-25 08:57:49

模塊迭代對象迭代器

2017-06-26 16:26:15

Python迭代對象迭代器

2021-09-03 10:00:00

JavaScript迭代對象

2021-09-14 07:26:25

JavaScript迭代對象

2025-03-26 10:56:54

2024-11-14 13:15:22

JavaScript可迭代數(shù)組

2016-03-28 10:39:05

Python迭代迭代器

2022-01-15 10:01:15

Javascript 高階函數(shù)前端

2024-09-18 13:49:42

2022-10-26 09:27:59

Python編程迭代器協(xié)議

2010-07-20 13:56:26

Python迭代器生成器

2024-11-11 06:10:00

Python生成器迭代器

2013-08-19 16:44:15

.Net

2022-09-14 08:01:36

JoinMySQL迭代器

2009-12-15 14:58:19

Ruby迭代器

2011-07-13 13:56:06

STL迭代器

2018-05-28 09:20:10

Python迭代for循環(huán)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 美女福利网站 | 羞羞网站免费 | 成人午夜精品一区二区三区 | 天天干天天操天天看 | 久久99精品久久久 | 精品国产欧美一区二区三区成人 | 91亚洲视频在线 | 久久久久久久久久久高潮一区二区 | 国产成人a亚洲精品 | 亚洲精品一区在线观看 | 日日爽| 欧美精品中文字幕久久二区 | 亚洲日本欧美日韩高观看 | 久久久久久蜜桃一区二区 | 北条麻妃一区二区三区在线视频 | 久久国产精品一区 | 欧美日韩亚洲国产综合 | 精品美女久久久久久免费 | 国产黄色大片网站 | 天天综合日日夜夜 | 国产午夜久久久 | 欧美一级在线观看 | 三级成人片| 亚洲视频免费 | 国产一区二区三区四区五区加勒比 | 免费观看的av | 久久久久中文字幕 | 九九热最新地址 | 国产精品波多野结衣 | 精品96久久久久久中文字幕无 | 羞羞视频免费观看入口 | 日本午夜一区 | 日韩av在线免费 | 国产99久久精品一区二区300 | 久草在线青青草 | 国产精品日本一区二区在线播放 | 视频一区二区在线观看 | 91视频a | 欧美三级久久久 | 水蜜桃久久夜色精品一区 | 亚洲精品高清视频 |