上一篇博文我們使用Python製作了一個簡單的天氣預報小程序(天氣漸冷,Python小工具讓你隨時掌握氣溫變化,做溫暖的穿衣達人)。今天,需求有變,如果我們想去旅遊,備選方案有北京、上海、廣州、新疆等等很多個城市……我們又不知道該選擇哪個?那就看下這些城市最近的天氣吧!畢竟,為了一段旅程把自己搞生病了也不太值得……
如果使用上一篇文章中的小程序,我們每次只能獲取到一個城市的天氣數據,不好進行對比,而且很浪費時間。有沒有辦法一次性將你方案中的城市天氣預報一次性列印輸出呢?
今天,我們就是用迭代器和可迭代對象的原理來實現這一需求。
迭代器對象和可迭代對象
我們知道,Python中迭代器對象,它實現了__next__()方法,當它調用__next__()方法時,返回其中的下一個元素。它不像列表、元組那樣一旦生成,就會一次性佔用內存空間,它使得我們需要用到迭代器對象裡面的元素時,就調用它,平時它不會佔用太多內存空間。比如,打開一個大文件,我們可以將文件內容定義為一個迭代器對象。我們使用__next__()方法獲取它的下一個迭代內容(Python2.X直接使用next()方法),這樣操作可以提升程序性能。
我們通常使用的列表、字典、元組、字符串等等這些數據結構稱為可迭代對象(Iterable),它內部實現了__iter__()方法,外部使用iter()方法可以將它轉化為一個可迭代對象。但它們不是迭代器(Iterator),只是通過iter()方法可以將這些對象轉化為可迭代對象。
迭代器和可迭代對象的區別在於迭代器是用時訪問數據,不浪費或者很少浪費內存空間,而可迭代對象範圍更加廣泛。本質來講,迭代器就是一種可迭代對象,從編程角度分析可迭代對象就是對象中定義了__iter__()、__getitem__()等魔法方法的對象。我們實例來看一下這兩者的區別在哪裡?如下圖所示。
製作一個天氣預報小程序(使用迭代器和可迭代對象)
通過上面的分析我們知道了迭代器對象和可迭代對象的區別。當我們需要知道很多個城市的天氣情況時,先定義一個迭代器對象MyWeatherIterator,繼承Iterator對象,並自定義它的__next__()方法。然後,我們將該迭代器對象封裝成一個可迭代對象MyWeatherIterable(繼承Iterable對象,並實現它的__iter__()方法)。這樣,我們就可以像列表、元組等數據結構一樣便利地獲取其中的信息,而且這樣的自定義對象在降低內存消耗方面也很有優勢。
首先,定義迭代器對象
具體代碼如下圖所示。
然後,將迭代器對象封裝成一個可迭代對象
這一步相對來說較為簡單,實現它的__iter__()方法,代碼如下所示。
最後,我們獲取想要知道城市的天氣信息
以下面的列表為例:
cities_lst = ['北京', '上海', '廣州', '深圳', '海南', '新疆', '敦煌', '西安']
for item in MyWeatherIterable(cities_lst):
print(item)
我們來看下效果,如下所示。
城市:北京【穿衣建議】:晝夜溫差極大,且風力較強,極易發生感冒,請特別注意增減衣服保暖防寒。
【平均氣溫】:8
城市:上海【穿衣建議】:天涼,晝夜溫差較大,較易發生感冒,請適當增減衣服,體質較弱的朋友請注意適當防護。
【平均氣溫】:15
廣州【穿衣建議】:晝夜溫差較大,較易發生感冒,請適當增減衣服。體質較弱的朋友請注意防護。
【平均氣溫】:22
城市:深圳【穿衣建議】:天氣較涼,較易發生感冒,請適當增加衣服。體質較弱的朋友尤其應該注意防護。
【平均氣溫】:21
城市:海南【穿衣建議】:天氣寒冷,且晝夜溫差很大,極易發生感冒。請特別注意增加衣服保暖防寒。
【平均氣溫】:-1
城市:蘭州【穿衣建議】:晝夜溫差很大,易發生感冒,請注意適當增減衣服,加強自我防護避免感冒。
【平均氣溫】:6
城市:西安【穿衣建議】:晝夜溫差較大,較易發生感冒,請適當增減衣服。體質較弱的朋友請注意防護。
【平均氣溫】:14
嗯嗯,想去暖和一點地方嘛,廣州、深圳是首選。極易發生感冒的地方就先不去了……
好了,今天的內容就到這裡了,怎麼樣?迭代器和可迭代對象的區別你學會了嗎?這可是一個很有Python特點的對象,學會自定義一個迭代器對象和可迭代對象,對於提升程序性能是很有用的,希望大家在使用Python處理大型網絡數據流或者是文件流時,首選這兩個對象。
歡迎大家留言關注,持續會推出更有意思的Python實戰項目。
轉載請註明出處,百家號:Python高手養成