問題8 9 如何實現可迭代物件和迭代器物件

2022-08-10 14:30:12 字數 4267 閱讀 1754

一)通過可迭代物件和python內建函式iter()得到迭代器:即,iter(可迭代物件)  -->  得到乙個迭代器;

例:list_1 = [1, 2, 3, 4, 5]

1、iter(物件),若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列:__iter__()或者__getitm__()

2、迭代器只有乙個介面:next(),呼叫next()時會自動獲得生產此迭代器的物件的乙個值;

t = iter(list_1)

t.next()

#輸出1

二)案例:

問題:如果一次抓取所有城市天氣再顯示,顯示第乙個城市氣溫時,有很高的延時,並且浪費儲存空間;期望從『用時訪問』的策略,並且能把所有城市氣溫裝到乙個物件裡,可用for語句進行迭代。如何實現?

方案:實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市氣溫;

實現乙個可迭代物件weatheriteratble,__iter__方法返回乙個迭代器物件;

#coding:utf8

import requests

from collections import iterable, iterator

# 氣溫迭代器,

class weatheriterator(iterator):

#傳入城市名字的字串列表

def __init__(self, cities):

self.cities = cities

#記錄乙個index,刻畫迭代的位置,初始化為0

self.index = 0

# city是城市名字的字串

def getweather(self, city):

#用requests庫,對一固定**進行get請求,得到乙個json形式資料;

r = requests.get(u'' + city)

# 對json資料解析,得到資料:data

data = r.json()['data']['forecast'][0]

# 返回目標資料:data['low'], data['high']

return '%s: %s, %s' % (city, data['low'], data['high'])

#迭代器物件實現的方法:next;功能:每次返回乙個城市的資訊,最終迭代完後丟擲乙個異常

def __next__(self):

#用if語句刻畫最終迭代完後的狀況;self.index,刻畫迭代的位置

if self.index == len(self.cities):

raise stopiteration

#正常迭代情況,即每次迭代出乙個城市的氣溫資訊;self.cities[self.index],得到需要的城市名字

city = self.cities[self.index]

#每迭代一次,要對index + 1

self.index += 1

#將目標城市名字傳入geweather方法,得到目標城市的氣溫資訊;

return self.getweather(city)

#實現可迭代物件,繼承iterable,則對weatheriterable例項化時,需要傳入乙個可迭代的物件;

class weatheriterable(iterable):

def __init__(self, cities):

#先維護cities,為了後面傳給構造器weatheriterator

self.cities = cities

#可迭代介面,在其內部返回weatheriterator

def __iter__(self):

#報錯:can't instantiate abstract class weatheriterator with abstract methods __next__,

#即:不能用抽象的方法例項化抽象類weatheriterator ———將next方法改為__next__()方法;return weatheriterator(self.cities)

#演示,只想要4個城市的氣溫資訊;

for x in weatheriterable([u'北京', u'上海', u'廣州', u'長春']):

print(x)

一)通過可迭代物件和python內建函式iter()得到迭代器:即,iter(可迭代物件)  -->  得到乙個迭代器;

例:list_1 = [1, 2, 3, 4, 5]

1、iter(物件),若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列:__iter__()或者__getitm__()

2、迭代器只有乙個介面:next(),呼叫next()時會自動獲得生產此迭代器的物件的乙個值;

t = iter(list_1)

t.next()

#輸出1

二)案例:

問題:如果一次抓取所有城市天氣再顯示,顯示第乙個城市氣溫時,有很高的延時,並且浪費儲存空間;期望從『用時訪問』的策略,並且能把所有城市氣溫裝到乙個物件裡,可用for語句進行迭代。如何實現?

方案:實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市氣溫;

實現乙個可迭代物件weatheriteratble,__iter__方法返回乙個迭代器物件;

#coding:utf8

import requests

from collections import iterable, iterator

# 氣溫迭代器,

class weatheriterator(iterator):

#傳入城市名字的字串列表

def __init__(self, cities):

self.cities = cities

#記錄乙個index,刻畫迭代的位置,初始化為0

self.index = 0

# city是城市名字的字串

def getweather(self, city):

#用requests庫,對一固定**進行get請求,得到乙個json形式資料;

r = requests.get(u'' + city)

# 對json資料解析,得到資料:data

data = r.json()['data']['forecast'][0]

# 返回目標資料:data['low'], data['high']

return '%s: %s, %s' % (city, data['low'], data['high'])

#迭代器物件實現的方法:next;功能:每次返回乙個城市的資訊,最終迭代完後丟擲乙個異常

def __next__(self):

#用if語句刻畫最終迭代完後的狀況;self.index,刻畫迭代的位置

if self.index == len(self.cities):

raise stopiteration

#正常迭代情況,即每次迭代出乙個城市的氣溫資訊;self.cities[self.index],得到需要的城市名字

city = self.cities[self.index]

#每迭代一次,要對index + 1

self.index += 1

#將目標城市名字傳入geweather方法,得到目標城市的氣溫資訊;

return self.getweather(city)

#實現可迭代物件,繼承iterable,則對weatheriterable例項化時,需要傳入乙個可迭代的物件;

class weatheriterable(iterable):

def __init__(self, cities):

#先維護cities,為了後面傳給構造器weatheriterator

self.cities = cities

#可迭代介面,在其內部返回weatheriterator

def __iter__(self):

#報錯:can't instantiate abstract class weatheriterator with abstract methods __next__,

#即:不能用抽象的方法例項化抽象類weatheriterator ———將next方法改為__next__()方法;return weatheriterator(self.cities)

#演示,只想要4個城市的氣溫資訊;

for x in weatheriterable([u'北京', u'上海', u'廣州', u'長春']):

print(x)

如何實現可迭代物件和迭代器物件 二

之前我們介紹了可迭代物件和迭代器物件,現在我們就實現這兩個物件,滿足實際案例中的需求,解決方案如下 實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市的氣溫 實現乙個可迭代物件weatheriterable,iter 方法返回乙個迭代器物件。如下 coding utf 8...

python迭代和如何判斷乙個物件是可迭代物件

可以理解為,任意的集合使用for迴圈遍歷 python中,迭代永遠是取出元素本身,而非元素的索引。對於有序集合,有時候會需要取出元素的索引,可以使用python內建的enumerate函式。enumerate函式可以把乙個list變成索引 元素對,這樣就可以在for迴圈中同時迭代索引和元素本身。li...

Python 如何實現可迭代物件和迭代器物件

一 通過可迭代物件和python內建函式iter 得到迭代器 即,iter 可迭代物件 得到乙個迭代器 例 list 1 1,2,3,4,5 1 iter 物件 若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列 iter 或者 getitm 2 迭代器只有乙個介面 next 呼叫next 時會...