日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...

發布時間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何定义一个类对象并用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函數有什么作用?

  • 檢查對象是否實現了__iter__方法,如果實現了就調用它,獲取一個迭代器
  • 如果沒有實現__iter__方法,但實現了__getitem__方法,python會創建一個迭代器,嘗試按順序(從0開始)獲取元素
  • 如果嘗試失敗,python拋出TypeError異常。("C is not iterable", C是目標對象所屬的類)
  • 為什么任何python序列都可迭代?

  • 都實現了__getitem__方法
  • 標準序列也都實現了__iter__方法
  • 鴨子類型(duck typing)的極端形式是什么?

    不僅要實現__iter__方法,還需要實現__getitem__方法,而且__getitem__方法的參數是從0開始的整數,這樣才認為該對象是可迭代的。

    白鵝類型(goose-typing)定義的可迭代對象是什么?

    如果實現了__iter__方法就認為對象是可迭代的,此時不需要創建,不需要注冊,因為是abc.Iterable類實現了__subclasshook__方法

    判斷對象是否可迭代的方法?

  • 最準確的方法:調用iter(x)函數,如果不可迭代,拋出TypeError異常(iter兼容遺留的__getitem__方法)
  • 使用abc.Iterable進行判斷(不兼容__getitem__方法)
  • python class Foo: def __iter__(self): pass from collections import abc issubclass(Foo, abc.Iterable) True f = Foo() isinstance(f, abc.Iterable)

    什么是可迭代對象?

    使用iter內置函數可以獲取迭代器的對象

    迭代的幾種情況?

  • 如果對象實現了能返回迭代器的__iter__方法,那么對象是可迭代的
  • 序列都可以迭代
  • 實現了__getitem__方法,而且其參數是從0開始的索引,這種對象也可迭代
  • 可迭代對象和迭代器的關系是什么?

    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个为什么)...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。