欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中對象迭代與反迭代的技巧總結(jié)

 更新時(shí)間:2016年09月17日 09:37:20   投稿:daisy  
這篇文章將通過實(shí)例給大家分享Python中對象迭代與反迭代的技巧,對大家學(xué)習(xí)或者使用python具有一定的參考借鑒價(jià)值。有需要的下面來一起看看吧。

一、如何實(shí)現(xiàn)可迭代對象和迭代器對象?

實(shí)際案例

某軟件要求從網(wǎng)絡(luò)抓取各個(gè)城市氣味信息,并其次顯示:

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

如果一次抓取所有城市天氣再顯示,顯示第一個(gè)城市氣溫時(shí),有很高的延時(shí),并且浪費(fèi)存儲空間,我們期望以用時(shí)訪問的策略,并且把所有城市氣溫封裝到一個(gè)對象里,可用for語句進(jìn)行迭代,如何解決?

解決方案

實(shí)現(xiàn)一個(gè)迭代器對象Weatherlterator,next方法每次返回一個(gè)城市氣溫,實(shí)現(xiàn)一個(gè)可迭代對象Weatherlterable,————iter__方法返回一個(gè)迭代器對象

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)

執(zhí)行結(jié)果如下:

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

二、如何使用生成器函數(shù)實(shí)現(xiàn)可迭代對象?

實(shí)際案例

實(shí)現(xiàn)一個(gè)可迭代對象的類,它能迭代出給定范圍內(nèi)所有素?cái)?shù):

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

解決方案

-將該類的__iter__方法實(shí)現(xiàn)生成器函數(shù),每次yield返回一個(gè)素?cái)?shù)

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)

運(yùn)行結(jié)果

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

三、如何進(jìn)行反向迭代以及如何實(shí)現(xiàn)反向迭代?

實(shí)際案例

實(shí)現(xiàn)一個(gè)連續(xù)浮點(diǎn)數(shù)生成器FloatRange(和rrange類似),根據(jù)給定范圍(start, stop)和步進(jìn)值(step)產(chǎn)生一些列連續(xù)浮點(diǎn)數(shù),如迭代FloatRange(3.0,4.0,0.2)可產(chǎn)生序列:

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

解決方案

實(shí)現(xiàn)反向迭代協(xié)議的__reversed__方法,它返回一個(gè)反向迭代器

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)

輸出結(jié)果

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

四、如何對迭代器做切片操作?

實(shí)際案例

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

解決方案

使用標(biāo)準(zhǔn)庫中的itertools.islice,它能返回一個(gè)迭代器對象切片的生成器

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每次訓(xùn)話都會消耗之前的迭代對象

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

輸出結(jié)果

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

五、如何在一個(gè)for語句中迭代多個(gè)可迭代對象?

實(shí)際案例

1、某班學(xué)生期末考試成績,語文、數(shù)學(xué)、英語分別存儲再3個(gè)列表中,同時(shí)迭代三個(gè)列表,計(jì)算每個(gè)學(xué)生的總分(并行)

2、某年紀(jì)有四個(gè)班,某次考試沒班英語成績分別存儲在四個(gè)列表中,依次迭代每個(gè)列表,統(tǒng)計(jì)全學(xué)年成績高于90分人數(shù)(串行)

解決方案

并行:使用內(nèi)置函數(shù)zip,它能將多個(gè)可迭代對象合并,每次迭代返回一個(gè)元組

from random import randint # 申城語文成績,# 40人,分?jǐn)?shù)再60-100之間 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # 數(shù)學(xué) 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)

執(zhí)行結(jié)果如下:

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

串行:使用標(biāo)準(zhǔn)庫中的itertools.chain,它能將多個(gè)可迭代對象連接

from random import randint from itertools import chain # 生成四個(gè)班的隨機(jī)成績 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)] # 默認(rèn)人數(shù)=1 count = 0 for s in chain(e1, e2, e3, e4): # 如果當(dāng)前分?jǐn)?shù)大于90,就讓count+1 if s > 90: count += 1 print(count)

輸出結(jié)果

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

總結(jié)

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

相關(guān)文章

  • Python基于鏈接表實(shí)現(xiàn)無向圖最短路徑搜索

    Python基于鏈接表實(shí)現(xiàn)無向圖最短路徑搜索

    鏈接表的存儲相比較鄰接炬陣,使用起來更方便,對于空間的使用是剛好夠用原則,不會產(chǎn)生太多空間浪費(fèi)。所以本文將以鏈接表方式實(shí)現(xiàn)無向圖最短路徑搜索,需要的可以參考一下
    2022-04-04
  • Python自動化xpath實(shí)現(xiàn)自動搶票搶貨

    Python自動化xpath實(shí)現(xiàn)自動搶票搶貨

    這篇文章主要介紹了Python自動化xpath實(shí)現(xiàn)自動搶票搶貨,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 本地部署Python?Flask并搭建web問答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問的操作方法

    本地部署Python?Flask并搭建web問答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問的操作方法

    Flask是一個(gè)Python編寫的Web微框架,使用Python語言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或Web服務(wù),本期教程我們使用Python Flask搭建一個(gè)web問答應(yīng)用程序框架,并結(jié)合cpolar內(nèi)網(wǎng)穿透工具將我們的應(yīng)用程序發(fā)布到公共網(wǎng)絡(luò)上,實(shí)現(xiàn)可多人遠(yuǎn)程進(jìn)入到該web應(yīng)用程序訪問,需要的朋友可以參考下
    2023-12-12
  • Python內(nèi)建序列通用操作6種實(shí)現(xiàn)方法

    Python內(nèi)建序列通用操作6種實(shí)現(xiàn)方法

    這篇文章主要介紹了Python內(nèi)建序列通用操作6種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python3中的指針你了解嗎

    Python3中的指針你了解嗎

    Python這個(gè)編程語言雖然沒有指針類型,但是Python中的可變參量也可以像指針一樣,改變一個(gè)數(shù)值之后,所有指向該數(shù)值的可變參量都會隨之而改變,這篇文章主要介紹了Python3中的“指針”,需要的朋友可以參考下
    2024-02-02
  • Python實(shí)現(xiàn)平行坐標(biāo)圖的兩種方法小結(jié)

    Python實(shí)現(xiàn)平行坐標(biāo)圖的兩種方法小結(jié)

    今天小編就為大家分享一篇Python實(shí)現(xiàn)平行坐標(biāo)圖的兩種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python安裝和配置uWSGI的詳細(xì)過程

    Python安裝和配置uWSGI的詳細(xì)過程

    這篇文章主要介紹了Python uWSGI 安裝配置,本文主要介紹如何部署簡單的 WSGI 應(yīng)用和常見的 Web 框架,以 Ubuntu/Debian 為例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別

    淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別

    這篇文章主要介紹了淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別介紹,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • PyQt5 實(shí)現(xiàn)百度圖片下載器GUI界面

    PyQt5 實(shí)現(xiàn)百度圖片下載器GUI界面

    本文主要介紹了通過 Pyqt5 實(shí)現(xiàn)一個(gè)界面化的下載器,在通過網(wǎng)絡(luò)請求實(shí)現(xiàn)各種類型的圖片的下載。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2021-12-12
  • anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案

    anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案

    這篇文章主要介紹了anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論