如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
2019-06-16 深入理解可迭代對象、迭代器
什么是迭代器模式?
當掃描內存中放不下的數據集時,要找到惰性獲取數據項的方式,即按需一次獲取一個數據項,這就是迭代器模式
迭代器構成?
python沒有宏,yield構建生成器(generator)
生成器和迭代器有什么不同?
相同點:
所有生成器都是迭代器,因為生成器完全實現了迭代器接口
不同點:
迭代器用于從集合中取出元素
生成器用于憑空生成元素
生成器的用途?
內置range() 返回的是一個類似生成器的對象,以前返回的是列表
range()返回列表—> list(range())
解決問題: Sentence類,通過索引從文本中提取單詞
import reprlib # reprlib.repr() 用于生成大型數據結構的簡略字符串表示形式 import re import reprlib RE_WORD = re.compile('w+')class Sentence:def __init__(self, text):self.text = text self.words = RE_WORD.findall(text)def __getitem__(self, index):return self.words[index]def __len__(self):return len(self.words)def __repr__(self):return 'Sentence(%s) ' % reprlib.repr(self.text)為什么序列可以迭代?
iter函數
解釋器需要迭代對象x時,會自動調用:iter(x)
內置的iter函數有什么作用?
為什么任何python序列都可迭代?
鴨子類型(duck typing)的極端形式是什么?
不僅要實現__iter__方法,還需要實現__getitem__方法,而且__getitem__方法的參數是從0開始的整數,這樣才認為該對象是可迭代的。
白鵝類型(goose-typing)定義的可迭代對象是什么?
如果實現了__iter__方法就認為對象是可迭代的,此時不需要創建,不需要注冊,因為是abc.Iterable類實現了__subclasshook__方法
判斷對象是否可迭代的方法?
python class Foo: def __iter__(self): pass from collections import abc issubclass(Foo, abc.Iterable) True f = Foo() isinstance(f, abc.Iterable)
什么是可迭代對象?
使用iter內置函數可以獲取迭代器的對象
迭代的幾種情況?
可迭代對象和迭代器的關系是什么?
pyton從可迭代的對象中獲取迭代器
s = '123' it = iter(s) # 使用可迭代的對象構建迭代器itwhile True:try:print(next(it)) # 調用next函數,獲取下一個字符except StopIterator: # 沒有字符了會拋出StopIteration異常del it # 釋放對it的引用,即廢棄迭代器對象break # 退出循環標準的迭代器需要實現哪兩個方法?
__next__
返回下一個可用的元素,沒有元素了,拋出StopIteration異常
__iter__
返回self,以便在應該使用可迭代對象的地方使用迭代器
這個接口在collections.abc.Iterator抽象基類中制定,這個類定義了__next__抽象方法,而且繼承自Iterable類,__iter__抽象方法則在Iterable中定義
Iterable和Iterator抽象基類
具體的Iterable.__iter__方法應該返回一個Iterator實例
具體的Iterator類必須實現__next__方法,Iterator.__iter__方法直接返回實例本身(return self),這樣在需要可迭代對象的地方就可以使用迭代器
迭代器的使用注意事項有哪些?
迭代器只需__next__和__iter__兩個方法,所以除了調用next()方法,以及補貨StopIterator異常之外,沒有辦法檢查是否還有遺留的元素。(注:沒有辦法還原迭代器)
如果還想再次迭代同一對象該如何操作?
想再次迭代,就要調用iter(),傳入之前構建迭代器的可迭代對象。傳入迭代器本省沒用,因為前面說過Iterator.__iter__方法的實現方式是返回實例本身,所以傳入迭代器無法還原已經耗盡的迭代器
迭代器到底是什么?
迭代器是這樣的對象:實現了無參數的__next__方法,返回序列中的下一個元素;如果無元素了,則拋出StopIteration異常。python中的迭代器還實現了__iter__方法,因此迭代器也是可迭代的。
總結
以上是生活随笔為你收集整理的如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曝杭州一哪吒汽车行驶中突然起火!司机:手
- 下一篇: 每小时的数据mysql_荐 mysql查