【Python基礎】可迭代對象&迭代器對象及其實現

2021-03-02 圖靈編程俱樂部


可迭代對象

首選確保for循環的in後面是一個可迭代對象,這樣就能通過python內置函數iter()得到一個迭代器對象(iterator)

我們分別把列表list_test和字符串str_test分別得到一個迭代器 我們嘗試傳入數字看看

這裡拋出了異常,因為數字不是一個可迭代對象

那麼問題來了, 為什麼列表和字符串是可迭代對象? 因為這些對象滿足了特殊的接口:

迭代列表時候,我們看看了列表下__開頭的方法,其中的__iter__()就是迭代協議的接口。我們在使用iter(list_test)時候實際內部調用了這個__iter__()函數 我們再看迭代字符串時候,我們發現沒有找到__iter__() , 但是有__getIterm__()這個接口

我們再看看迭代的籤名, 要麼傳入的參數(對象)本身有迭代器,要麼是一個序列。 我們這裡list__test本身就有迭代器,而str_test是有__getItem__這種序列的接口。

迭代器對象

for n in list_test:     print(n)

所以我們就搞清楚了,for循環中先由iter(list_test)得到一個迭代器t,然後不停的調用next next next 直到捕獲到一個StopIteration 異常,跳出循環。這就是for循環的工作流程

案例實現我們從天氣應用抓取各個城市溫度:北京: 10~18 南京:18~23 上海: 14~22 .... 如果一次性抓取所有天氣再顯示,顯示一個城市氣溫時,會有很多延遲。並且浪費存儲空間。 我們希望以「用時訪問」的策略,能把所有城市氣溫封裝到一個對象裡面,需要時候再顯示。提示, 可用for語句進行迭代。 代碼怎麼實現?

解決思路

實現一個迭代器對象Weatherlterator, next方法每次返回一個城市氣溫.(迭代完畢時候要拋出停止迭代異常)

實現一個可迭代對象Weatherlterable, __iter__方法返回一個迭代器對象。

def getWeather(city):    r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city)    data = r.json()['data']['forecast'][0]        return '%s: %s, %s'%(city, data['low'], data['high'])
print(getWeather(u'南京'))print(getWeather(u'上海'))

以上是獲取城市氣溫數據方法,下面我們實現迭代器對象和可迭代對象,在python標準庫中對他們的接口已經有定義。

在collections包下有

我們可以直接繼承這兩個抽象類

import requestsfrom collections import Iterable, Iterator

class WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0
def getWeather(self, city): r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city) data = r.json()['data']['forecast'][0] return '%s: %s, %s' % (city, data['low'], data['high'])
def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.getWeather(city)

class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities
def __iter__(self): return WeatherIterator(self.cities)

for city in WeatherIterable([u'南京', u'上海', u'北京', u'深圳']): print(city)

這裡我們就實現了一個可迭代對象和迭代器對象,並且用示例感受了某些需要惰性訪問場景使用他們的優勢。

查看倉庫可直接獲取源碼:

 https://github.com/AlexZ33/Python_basic/blob/main/%E5%8F%AF%E8%BF%AD%E4%BB%A3%E5%AF%B9%E8%B1%A1%26%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%AF%B9%E8%B1%A1/getWeather.py

❤️愛心三連擊

1.看到這裡了就點個在看支持下吧,你的「點讚,在看是我們創作的動力。

2.關注公眾號圖靈編程俱樂部

回復「沙龍」參加線上線下技術沙龍; 回復「python」參加python訓練營; 回復「java」參加2020版企業實戰Java精英線下課程; 回復「圖靈編程」了解圖靈IT青年俱樂部;

3.也可添加微信【17612567626】,一起成長。

相關焦點

  • Python中可迭代對象、迭代器以及iter函數的兩個用法詳解
    第一個是可迭代對象(Iterable),第二個是迭代器(Iterator),第三個是生成器(Generator),這裡暫且不談生成器。 可迭代對象 列表、元組、字符串、字典等都是可迭代對象,可以使用for循環遍歷出所有元素的都可以稱為可迭代對象(Iterable)。
  • 面試題-python 什麼是迭代器?
    在了解迭代器之前,需弄清楚2個概念:1.什麼是迭代2.什麼是可迭代對象迭代如果給定一個list或tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)在Python中,迭代是通過for … in來完成的。
  • 一文搞懂Python迭代器和生成器
    這篇文章就是要用最簡單的方式讓你理解Python迭代器和生成器!在Python中,迭代器是遵循迭代協議的對象。使用iter()從任何序列對象中得到迭代器(如list, tuple, dictionary, set等)。另一種形式的輸入迭代器是generator(生成器)。
  • 什麼是Python的迭代器和生成器?(附代碼)
    utm_source=blog&utm_medium=python-iterators-and-generators這是我們要介紹的內容:什麼是可迭代對象?什麼是Python迭代器?在Python中創建一個迭代器熟悉Python中的生成器實現Python中的生成器表達式為什麼你應該使用迭代器?
  • 迭代協議:Loops在Python中如何工作
    字典、集合和許多其它的可迭代對象不是序列。我們按照指示實現一個適用於所有可迭代對象而不只是序列的循環結構。可迭代對象是什麼?在Python的世界,一個可迭代對象是你可以使用一個for循環來進行循環的任何對象。
  • Python 拓展之迭代器
    「迭代」相信對你來說已經不陌生了,我前面曾經專門用一篇文章來講,如果你已經沒有什麼印象的話,就再點進去看看(零基礎學習 Python 之初識迭代)。__iter__() 是一個特殊方法,它是迭代規則的基礎,有了它,就說明對象是可迭代的。
  • 傳智播客鄭州校區Python學習之迭代器與生成器
    迭代器協議:對象必須提供一個_next_()方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個StopIteration異常(只能往後走不能往前退)。可迭代對象:實現了迭代協議的對象(如何實現?對象內部定義一個_iter_()方法)。
  • Python 迭代器和 C++ 迭代器,最大的不同竟然是……
    無論是 Python 的基礎內置函數,還是各類高級話題,都處處可見迭代器的身影。那麼,迭代器究竟是怎樣的一個概念?其又為什麼會廣泛存在於各種程式語言中?本文將基於 C++ 與 Python,深入討論這一系列問題。什麼是迭代器?我們為什麼要使用迭代器?什麼是迭代器?
  • python中的yield和return—迭代器和生成器
    文章目錄很多人學習python,不知道從何學起。很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
  • 可以迭代大部分數據類型的 for…of 為什麼不能遍歷普通對象?
    實際上,任何具有 Symbol.iterator 屬性的元素都是可迭代的。我們可以簡單查看幾個可被for of迭代的對象,看看和普通對象有何不同:可以看到,這些可被for of迭代的對象,都實現了一個Symbol(Symbol.iterator)方法,而普通對象沒有這個方法。
  • Python中迭代器和生成器的區別?
    小猿會從最基礎的面試題開始,每天一題。如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。廢話不多說,開始今天的題目:問:說說Python中迭代器和生成器的區別?
  • 雲計算開發學習筆記:Python3迭代器與生成器
    迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法:iter() 和 next()。字符串,列表或元組對象都可用於創建迭代器:迭代器對象可以使用常規for語句進行遍歷:執行以上程序,輸出結果如下:也可以使用 next() 函數:執行以上程序,輸出結果如下:
  • Python生成器next方法和send方法區別詳解
    實現隨機加減法生成器本文實例為大家分享了python實現隨機加減法生成器的具體代碼,供大家參考,具體內容如下 為了讓外甥女練習算術,用python給她寫了個自動出加減法的小程序.在python中有兩種方式創建生成器:生成淺談Python中的可迭代對象、迭代器、For循環工作機制、生成器1.iterable iterator區別 要了解兩者區別,先要了解一下迭代器協議: 迭代器協議是指:對象需要提供__next__()方法,它返回迭代中的元素,在沒有更多元素後,拋出StopIteration異常,終止迭代. 可迭代對象就是:實現了迭代器協議的對象.
  • Python從小白進階到大神的三大利器之迭代器
    迭代,顧名思義就是將某一個序列的元素挨著排的一一取出來或者獨立出來做一些操作。那麼什麼樣的對象能夠被迭代呢?能夠被迭代的對象一定具有這樣的特點,它是有序的,也就是說迭代要知道從哪個元素開始,從哪個元素結束,或者要知道誰是下一個。
  • 有了它,出門旅遊再也不怕感冒了,Python使用迭代器進行天氣預報
    如何實現這一需求?今天,我們就是用迭代器和可迭代對象的原理來實現這一需求。迭代器對象和可迭代對象我們知道,Python中迭代器對象,它實現了__next__()方法,當它調用__next__()方法時,返回其中的下一個元素。它不像列表、元組那樣一旦生成,就會一次性佔用內存空間,它使得我們需要用到迭代器對象裡面的元素時,就調用它,平時它不會佔用太多內存空間。
  • Python小白教程:生成器 (generator) 和迭代器 (iterator)
    在介紹迭代器 (Iterator) 之前,先介紹可迭代對象 (Iterable)。任何只要可以循環的東西就可稱之可迭代對象 (iterable)。容器類型數據 (str, tuple, list, dict, set) 都可以被 for 循環,因此它們都是可迭代對象。在 Python 裡萬物皆對象,如果真要判斷一個對象是否是可迭代對象,我們可以用 isinstance(x, Iterable)。
  • Python切片高級特性完全解讀
    迭代器是 Python 中獨特的一種高級對象,它本身不具備切片功能,然而若能將它用於切片,這便仿佛是錦上添花,能達到如虎添翼的效果。所以,本節將隆重地介紹迭代器如何實現切片功能。4.1、迭代與迭代器首先,有幾個基本概念要澄清:迭代、可迭代對象、迭代器。
  • Python的Iterable和Iterator
    Python部落組織翻譯,禁止轉載,歡迎轉發Iterable: 可迭代的Iterator:  迭代器
  • Python基礎資料
    基礎知識點:1.dir(__ builtins __) 查詢python的所有內置函數
  • 迭代器與生成器 (一)
    可迭代的(iterable)對象有一個對象,當我們可以對它的每一項進行訪問時,這個對象就是可迭代的。  迭代器(iterator)有了前面的概念,就可以探討迭代器了。 重點來了,我們要用計算機術語來說話了: 小黑屋那摞磚頭,因為可以一塊一塊取走,當然就是可迭代對象了,那塊發光紙,則是存取可迭代對象的工具,就是大名鼎鼎的迭代器!至於搬磚的過程就是迭代。