iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 5
0

如果今天叫你從0 1 2 3......寫到 9999,你一定不願意吧,無聊死了,那如果是十萬呢? 更不要啦。但是在現今實際的狀況中,我們時常需要處理大量的資料,有時高達百萬或億,如果親自做,天知道要做多久? 這時我們就利用電腦另一個擅長的能力,重複而單一的作業。

剛剛說的零寫到 9999,下面的簡單程式碼就可以完成

for i in range(10000):
    print(i)

https://ithelp.ithome.com.tw/upload/images/20190921/20120282PkYL7mljcE.jpg

For 迴圈

很簡單吧!裡面用的到的語法是 for 迴圈語句,他可以叫電腦重複做迴圈內的事情,直到抵達最大範圍,我們利用 range(INT) 函式來建立一個 0 ~ 9999 的範圍,因此迴圈內部的 print(i) 就會依照指示從0顯示到9999,過程不需超過30秒。

練習5-1

試試看利用 for 迴圈與 range() 寫出一個九九乘法表吧。

for i in range(1,10):
    for j in range(1,10):
        print(i*j,end="\t") #"\t" 相當於 tab
    print("\n") #"\n" 是 Windows 內的換行符

Output:
https://ithelp.ithome.com.tw/upload/images/20190921/201202825cnBs1xeB5.jpg

在這短短四行程式碼中,用了兩個 for 迴圈,我們稱為巢狀迴圈,因為每個迴圈會從1-9,共兩個,所以總共會跑 9^2 次,也就是81次,剛好完成九九乘法表,這樣讓我們不需要寫 81 行程式碼,大幅增加程式的可理解性與方便性,你想要叫他做九九九九乘法表也沒問題,反正電腦不會喊累~ 只要性能不要超過負荷就好。

While 迴圈

電腦裡還有另一種迴圈,他和 if 有點像,裡面包含一個判斷式,電腦若發現判斷式為真,就會執行區塊內的程式碼,不過和 if 不同的地方在於他會一直執行,直到判斷式為假才會離開區塊,所以如果程式設計的過程出現邏輯錯誤,可能會導致程式崩潰,例如下面的例子。

#無限迴圈範例
while(1 == 1):
    print("In while loop...")

他會一直跑到程式當掉為止,因為判斷式 1 == 1 永遠為真,所以不會離開迴圈,除非電腦不堪負荷強迫終止程式。
接著我們來看一個正確的 while 迴圈應用

key = "1"
while(key != "0"):
   key = input("Enter a letter:")
   print("You enter " + key)
print("Exit")

程式一開始初始化 key 內存入 "1",和 "0" 不同,因此 key != "0" 成立,執行迴圈內內容,但是因為我們不知道使用者何時想要結束程式,所以我們告訴使用者說:如果你不想用了,就輸入 0,當使用者輸入 0 後判斷式便不成立,所以不會進入迴圈,直接執行下面的 print("Exit") 安全的離開程式,而不是用當機的方式離開...

應用時機

這樣的迴圈操作可以讓電腦幫你做超級多次無聊的事,也可以拿來處理大量的數據,正因為電腦只需要插電,像是搶課、搶票啦這種煩人的事,若是交給機器人跑,你去睡個覺醒來看看電腦幫你搶到了哪些驚喜,這樣不是很棒嗎~

我放上一段用來將政府 2010-2017 這八年來自動雨量測站的雨量加總,算出雨量再分別用 csv(逗點分隔值) 存入方便 Excel 做進一步統計哪一個測站雨量做多的一個程式,這就是實際的應用,但你應該還看不懂所有的內容,不過沒關係,還是可以複製貼上去玩玩看,體驗一下利用電腦處理數據的感覺。

"""
2014年無屏東資料
2013年前無新屋測站資料
"""
import json
import csv

year_list = ["2010","2011","2012","2013","2014","2015","2016","2017"]
rainFall_yearlist = []
location_list = ['BANQIAO', 'TAMSUI', 'ANBU', 'TAIPEI', 'ZHUZIHU', 'KEELUNG', 'HUALIEN', 'SU-AO', 'YILAN', 'PENGHU', 'TAINAN', 'KAOHSIUNG', 'CHIAYI', 'TAICHUNG', 'ALISHAN', 'DAWU', 'HSINCHU', 'HENGCHUN', 'CHENGGONG', 'SUN MOON LAKE', 'TAITUNG', 'WUQI', 'DONGJIDAO', 'LANYU', 'KINMEN', 'MATSU', 'PENGJIAYU', 'YUSHAN', 'TAOYUAN', 'CHANGHUA', 'MIAOLI', 'YUNLIN']

filepath = r"C:\\User\\python\\data\\"

for year in year_list:

    file = open(filepath + year + ".json", 'r', encoding='UTF-8')
    jdata = file.read()
    file.close()
    
    data = json.loads(jdata)
    
    rainFall_list = []
    
    index = 0
    for item in data["dataset"]["location"]:
        rainFall_total = 0.0
        
        if(item["locationName"] != "PINGTUNG,屏東" and item["locationName"] != "XINWU,新屋"):
            index += 1
            for elem in item["weatherElement"]["time"]:
                it = elem["elementValue"]["value"]
                if(str(it) != "T" and str(it) != "X"):
                    if(float(it) > 0.0):
                        rainFall_total += float(it)
    
            rainFall_list.append(int(rainFall_total)) #數字優化
        
    rainFall_yearlist.append(rainFall_list)
    print("complete " + year + " " + str(index) + "筆")


with open(filepath + r"csv\\output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)

    writer.writerow(location_list)
    
    for item in rainFall_yearlist:
        writer.writerow(item)

程式輸出:
https://ithelp.ithome.com.tw/upload/images/20190921/20120282f3nC9Z0lxL.jpg

csv 檔案輸出:
https://ithelp.ithome.com.tw/upload/images/20190921/20120282lqUgiGctzY.jpg


上一篇
Day4-親和數,用自己找超累的耶
下一篇
Day6-來寫個簡單遊戲吧(1A2B game)
系列文
原來電腦可以這樣用!? 果蠅也懂的程式語言教學30

尚未有邦友留言

立即登入留言