如果今天叫你從0 1 2 3......寫到 9999,你一定不願意吧,無聊死了,那如果是十萬呢? 更不要啦。但是在現今實際的狀況中,我們時常需要處理大量的資料,有時高達百萬或億,如果親自做,天知道要做多久? 這時我們就利用電腦另一個擅長的能力,重複而單一的作業。
剛剛說的零寫到 9999,下面的簡單程式碼就可以完成
for i in range(10000):
print(i)
很簡單吧!裡面用的到的語法是 for 迴圈語句,他可以叫電腦重複做迴圈內的事情,直到抵達最大範圍,我們利用 range(INT) 函式來建立一個 0 ~ 9999 的範圍,因此迴圈內部的 print(i)
就會依照指示從0顯示到9999,過程不需超過30秒。
試試看利用 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:
在這短短四行程式碼中,用了兩個 for 迴圈,我們稱為巢狀迴圈,因為每個迴圈會從1-9,共兩個,所以總共會跑 9^2 次,也就是81次,剛好完成九九乘法表,這樣讓我們不需要寫 81 行程式碼,大幅增加程式的可理解性與方便性,你想要叫他做九九九九乘法表也沒問題,反正電腦不會喊累~ 只要性能不要超過負荷就好。
電腦裡還有另一種迴圈,他和 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)
程式輸出:
csv 檔案輸出: