有了它,出門旅遊再也不怕感冒了,Python使用迭代器進行天氣預報

2020-12-15 python高手養成

上一篇博文我們使用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高手養成

相關焦點

  • Python生成器的使用
    試想,如果我們在對字符串拼接之前,要將所有的數字進行平方運算,對字符串進行二次拼接(比如『a』變為『aa』)之後,再對列表進行拼接呢?這樣的話,我們就對列表largeL進行了兩次遍歷操作,耗費時間會更長。這種耗時就不只是cost()函數列印時間的兩倍這麼多了……而且,這樣的操作產生了一個tmp臨時列表(存儲有1000000個數據的列表空間),相當浪費內存,當第二次進行func()操作,如果仍有臨時列表數據生成或者需要遍歷該tmp列表,這樣就更容易拖慢程序執行。有沒有更好的方案呢?
  • 【Python基礎】可迭代對象&迭代器對象及其實現
    我們在使用iter(list_test)時候實際內部調用了這個__iter__()函數 我們再看迭代字符串時候,我們發現沒有找到__iter__() , 但是有__getIterm__()這個接口我們再看看迭代的籤名, 要麼傳入的參數(對象)本身有迭代器,要麼是一個序列。 我們這裡list__test本身就有迭代器,而str_test是有__getItem__這種序列的接口。
  • 一文搞懂Python迭代器和生成器
    很多童鞋搞不懂python迭代器和生成器到底是什麼?它們之間又有什麼樣的關係?
  • Python實現一個類似range函數的浮點數生成器 - python高手養成
    今天,帶大家做一個浮點數生成器,主要用到的知識點有:1.實現自定義類的__iter__()和__reversed()__方法2.Decimal對於十進位數據的精度控制Python實現浮點數生成器通常,我們使用range()函數來生成一個整形數列表,函數中我們可以自定義起始值、結束值和步進範圍。
  • 天氣預報說連續下雨5天,果斷出門旅遊,回來欲哭無淚
    這不,就有一個朋友,看了天氣預報說未來5天都會下雨,所以就果斷出去旅遊。出門之前,還特意把繡球花搬到室外去,讓它們盡情的享受雨水的沐浴。看上去非常的完美,又能旅遊,又不怕繡球花被乾死。然後,風雲突變,人算不如天算啊。
  • 面試題-python 什麼是迭代器?
    前言python 裡面有 3 大神器:迭代器,生成器,裝飾器。
  • 什麼是Python的迭代器和生成器?(附代碼)
    在處理大量數據時,計算機內存可能不足,我們可以通過生成器和迭代器來解決該問題。迭代器:一次一個!Python 是一種美麗的程式語言。我喜歡它提供的靈活性和難以置信的功能。我喜歡深入研究Python的各種細微差別,並了解它如何應對不同的情況。在使用Python的過程中,我了解到了一些功能,這些功能的使用與其簡化的複雜度不相稱。
  • python中的yield和return—迭代器和生成器
    文章目錄很多人學習python,不知道從何學起。很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
  • 傳智播客鄭州校區Python學習之迭代器與生成器
    相對路徑假如:在當前路徑下有一個files文件,files文件下有一個「尼古拉斯趙四」這個程序文件,我如果想要打開這個文件,就需要使用相對文件路徑來打開它。當相對路逕行不通時,可以使用絕對路徑。絕對路徑通常比相對路徑更長,在Linux系統中類似於這樣:/home/dir/files/1.txt;在Windows系統中類似於這樣:C:\Users\dir\files\1.txt通過使用絕對路徑,可讀取系統中的任何地方的文件。
  • Python 拓展之迭代器
    3.如果有很多值的話,列表會佔用太多的內存,而迭代器則佔用的更少,它從第一個元素開始訪問,直到所有的元素被訪問完結束,只能向前衝,不能後退。114我們在上面重複兩次調用列表 list1 進行循環,都是能正常進行的,這個列表相當於一個可以長久使用的東西,可以重複使用。
  • 忽冷忽熱愛感冒,今天聊聊天氣預報背後故事
    霜降,是二十四節氣中的第十八個節氣,也是秋季的最後一個節氣,標誌著氣溫變化:從霜降開始,天氣會快速變冷,意味著即將進入冬天,也意味著我們要開始穿秋褲了。隨著天氣漸漸變冷,晝夜溫差變化大,「感冒季」也隨之而來,無論身處大江南北,你周圍總會出現打噴嚏、流鼻涕、咳嗽乃至發燒的「病友」。
  • 韓國天氣預報中經常使用的韓語表達
    ----點擊上方藍字關注我們----大家好,我是DUDU現在馬上就要到陽春三月啦~換季的時候大家要注意預防感冒
  • python定時獲取天氣數據並自動發送到郵箱
    接口,這有次數限制,一般每天調用1000次,但對於個人使用是完全夠的。另一種是通過python爬取相關天氣預報網頁的內容,從裡面提取相關的信息。由於之前沒有給大家介紹過相關爬蟲的知識,所以這裡採用第一種方法。以後再陸續介紹爬蟲怎麼去獲取天氣預報信息。
  • 天氣預報15天查詢
    版本: 20 *使用豌豆莢官方商店能下載目標軟體,安裝更安全
  • 4選3不重複問題,用1句話搞定,潘石屹微博沒有的Python編程案例
    有沒有更加pythonic的方法呢?一句話的事這個g就是我們生成的迭代器咯,對於迭代器的用法,我們之前也討論過,並且通過一個案例展示了它的用法:有了它,出門旅遊再也不怕感冒了,Python使用迭代器進行天氣預報
  • Python 迭代器和 C++ 迭代器,最大的不同竟然是……
    綜上所述,迭代器存在的意義,不是為了空間換時間,也不是為了時間換空間,而是一種適配器(Adapter)。迭代器的存在,使得我們可以使用同樣的 for 語句去遍歷各種容器,或是像 C++ 的 algorithm 模塊所示的那樣,使用同樣的接口去處理各種容器。
  • 氣象臺發布最新天氣預報
    最近太陽一直出門旅遊內江市未來5天天氣預報請查收!!!二、下周天氣趨勢預計未來一周(12月19日~12月25日)以陰間多雲天氣為主,其中20日和21日早晨有霧,25日陰有小雨。周內最高氣溫11到12度,最低氣溫2到4度。晝夜溫差較大,請注意及時增減衣物,預防感冒等疾病發生。
  • ES6的生成器和迭代器
    其中兩個特性,生成器和迭代器,極大地改變了我們在更複雜的前端代碼中編寫特定函數的方式。雖然他們之間的關係很好,但他們實際上做的事情可能有點令人困惑,所以讓我們來看看他們。迭代器迭代在編程中是一種常見的做法,通常用於循環一組值,要麼轉換每個值,要麼使用或以某種方式保存它。
  • 天氣預報通
    天氣預報通 生活工具 大小: 21.69MB
  • python教程:3個非常有用的內置函數
    這三個內置函數還是非常有用的,在工作中用的還不少,順手,下面一一進行介紹另外在python2.,如下所示: 多個迭代器的時候,是對後面所有的迭代器進行處理(lambda函數的參數個數必須和後面迭代器的個數一致