亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中對象迭代與反迭代的技巧總結

系統 1536 0

一、如何實現可迭代對象和迭代器對象?

實際案例

某軟件要求從網絡抓取各個城市氣味信息,并其次顯示:

            
北京: 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('access.log') # # 前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('第二次迭代') 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
          

總結

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久综合久久鬼色 | 久热中文字幕在线 | 九九精品在线观看 | 一区二区三区不卡免费视频97 | 五月激情婷婷网 | 男女69式互添在线观看 | 久久国产精品99国产精 | 在线欧美激情 | 无毒不卡在线观看 | 正在播放亚洲 | 99久久免费精品高清特色大片 | 四虎综合 | 国产精品天天影视久久综合网 | 四虎永久 | 日韩欧美色 | 一级一级毛片看看 | 97免费在线观看 | 高清国产精品久久久久 | 欧美日韩国产精品 | 五月婷婷色综合 | 尻逼片| 亚洲一区二区三区网站 | 亚洲性生活视频 | 欧美午夜精品一区二区三区 | 永久黄网站色视频免费 | 天天摸天天草 | 国产欧美日韩在线播放 | 久久精品国产400部免费看 | 青青热久久国产久精品 | 性做久久久久久坡多野结衣 | 97最新网址| 久久一本精品久久精品66 | 亚洲精品久久婷婷爱久久婷婷 | 中文字幕色婷婷在线视频 | 精品国产免费第一区二区三区日韩 | 精品图区| 日日噜噜夜夜狠狠视频buoke | 狠狠狠色丁香婷婷综合久久88 | 中文字幕一区二区三区 精品 | 精品久久久日韩精品成人 | 久久精品久久精品久久精品 |