首頁  >  文章  >  後端開發  >  Python中物件迭代與反迭代的技巧總結

Python中物件迭代與反迭代的技巧總結

高洛峰
高洛峰原創
2017-02-22 17:10:261091瀏覽

一、如何實作可迭代物件、迭代器物件?

實際案例

某軟體要求從網路抓取各個城市氣味訊息,並其次顯示:

#
北京: 15 ~ 20 天津: 17 ~ 22 长春: 12 ~ 18 ......

如果一次抓取所有城市天氣再顯示,顯示第一個城市氣溫時,有很高的延時,並且浪費存儲空間,我們期望以用時訪問的策略,並且把所有城市氣溫封裝到一個物件裡,可用for語句進行迭代,如何解決?

解決方案

實作一個迭代器物件Weatherlterator,next方法每次回傳一個城市氣溫,實作一個可迭代物件Weatherlterable,————iter__方法傳回一個迭代器物件

#
import requests from 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 x in WeatherIterable(['北京', '上海', '广州', '深圳']): print(x)

執行結果如下:

C:\Python\Python35\python.exe E:/python-intensive-training/s2.py 北京:低温 21℃ , 高温 30℃ 上海:低温 23℃ , 高温 26℃ 广州:低温 26℃ , 高温 34℃ 深圳:低温 27℃ , 高温 33℃ Process finished with exit code 0

二、如何使用生成器函數實作可迭代物件?

實際案例

實作一個可迭代物件的類,它能迭代出給定範圍內所有素數:

python pn = PrimeNumbers(1, 30) for k in pn: print(k) `` 输出结果text
2 3 5 7 11 13 17 19 23 29
“`

解決方案

#-將該類別的__iter__方法實作產生器函數,每次yield傳回一個質數

class PrimeNumbers: def __init__(self, start, stop): self.start = start self.stop = stop def isPrimeNum(self, k): if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.stop + 1): if self.isPrimeNum(k): yield k for x in PrimeNumbers(1, 20): print(x)

#運行結果

##

C:\Python\Python35\python.exe E:/python-intensive-training/s3.py 2 3 5 7 11 13 17 19 Process finished with exit code 0

三、如何進行反向迭代、如何實現反向迭代?

實際案例

實作一個連續浮點數產生器

FloatRange(和rrange類似),根據給定範圍(start, stop)和步進值(step)產生一些列連續浮點數,如迭代FloatRange(3.0,4.0,0.2)可產生序列:

正向:3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 反向:4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0

##解

#實現反向迭代協定的

__reversed__

方法,它傳回一個反向迭代器

#
class FloatRange: def __init__(self, start, stop, step=0.1): self.start = start self.stop = stop self.step = step def __iter__(self): t = self.start while t <= self.stop: yield t t += self.step def __reversed__(self): t = self.stop while t >= self.start: yield t t -= self.step print("正相迭代-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("反迭代-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)

##輸出結果

C:\Python\Python35\python.exe E:/python-intensive-training/s4.py 正相迭代----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 反迭代----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Process finished with exit code 0

四、如何對迭代器做切片運算?

實際案例


有某個文字文件,我們想都去其中某一範圍的內容,如100~300行之間的內容,python中文本文件是可迭代對象,我們是否可以使用類似列表切片的方式得到一個100~300行文件內容的生成器?

解決方案

使用標準函式庫中的itertools.islice

,它能傳回一個迭代器物件切片的產生器


from itertools import islice f = open(&#39;access.log&#39;) # # 前500行 # islice(f, 500) # # 100行以后的 # islice(f, 100, None) for line in islice(f,100,300): print(line)

islice每次訓練話語都會消耗先前的迭代物件

l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print(&#39;第二次迭代&#39;) for x in t: print(x)

輸出結果

C:\Python\Python35\python.exe E:/python-intensive-training/s5.py 5 6 7 8 9 第二次迭代 10 11 12 13 14 15 16 17 18 19 Process finished with exit code 0

#五、如何在一個for語句中迭代多個可迭代物件?

實際案例

1、某班學生期末考成績,語文、數學、英文分別儲存再3個清單中,同時迭代三個列表,計算每個學生的總分(並行)

2、某年紀有四個班,某次考試沒班英語成績分別儲存在四個列表中,依序迭代每個列表,統計全學年成績高於90分人數(串列)


#解

並行:使用內建函數 zip

,它能將多個可迭代物件合併,每次迭代傳回一個元組


#

from random import randint # 申城语文成绩,# 40人,分数再60-100之间 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # 数学 english = [randint(60, 100) for _ in range(40)] # 英语 total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)

執行結果如下:

C:\Python\Python35\python.exe E:/python-intensive-training/s6.py [232, 234, 259, 248, 241, 236, 245, 253, 275, 238, 240, 239, 283, 256, 232, 224, 201, 255, 206, 239, 254, 216, 287, 268, 235, 223, 289, 221, 266, 222, 231, 240, 226, 235, 255, 232, 235, 250, 241, 225] Process finished with exit code 0

序列:使用標準函式庫中的

itertools.chain

,它能將多個可迭代物件連接


from random import randint from itertools import chain # 生成四个班的随机成绩 e1 = [randint(60, 100) for _ in range(40)] e2 = [randint(60, 100) for _ in range(42)] e3 = [randint(60, 100) for _ in range(45)] e4 = [randint(60, 100) for _ in range(50)] # 默认人数=1 count = 0 for s in chain(e1, e2, e3, e4): # 如果当前分数大于90,就让count+1 if s > 90: count += 1 print(count)

輸出結果

C:\Python\Python35\python.exe E:/python-intensive-training/s6.py 48 Process finished with exit code 0

總結

以上就是這篇文章的全部內容,希望對大家的學習或工作帶來一定的幫助,如果有疑問大家可以留言交流。

更多Python中物件迭代與反迭代的技巧總結相關文章請專注於PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn