上面的鴨子,有著重複的模式,這篇就來跟大家談談當你遇到重複的事情,可以用什麼方法來寫程式? Licensed by Adobe Stock
Jason:「Meiko 上次請你回家整理一下這兩週的發票,這次有帶來嗎?」
Meiko:「有唷,其實我後來都下載 APP 載具幫我做記錄了拉,看了一下我的消費,如果不買衣服的話,每天的花費大概就是吃飯、還有買化妝品、另外就是每個月的電話費、水電瓦斯、哩哩摳摳其實加起來也是不少耶!。」
Jason:「那你看一下你的記帳 APP,看一下過去 7 天每天的消費是多少?」
Meiko:「我看一下,205、350、520,因為那天去了糠似渼買了比較多日用品,然後240、330、180、2000。」
Jason:「2000,你真的是好野人耶!好,我把你剛告訴我的消費裝在一個叫做串列 (list) 的資料結構裡面。像這樣。」
spendList=[205,350,520,240,330,180,2000]
Meio:「什麼是資料結構?」
Jason:「就是一種可以讓你把資料排好的方式啊,你現在可以先不知道沒關係,概念上就是我把你過去 7 天的消費,存在一個地方。」
Meiko:「原來是醬。說到消費記錄和發票,以前每個月,我都要對發票實在很蠻煩(心裏OS:想說中個 200 元也開心,不無小補一週的早餐就有著落)。現在設定好 APP 載具,有沒有中獎看 App 就知道。誒,Jason,像對發票這種工作,也能夠用你教我的 Python 寫程式嗎?」
Jason:「當然可以囉,就像你現在買東西,都會把你的手機拿出來,請結帳人員幫你把發票存載具,這就是一種輸入資料的行為,就像我剛才把你的消費記錄裝串列(list)一樣。等到你要對獎的時候,APP 會去國稅局把中獎的號碼找到,然後再把你過去一個月以來消費的紀錄進行比對,就可以知道你有沒有中獎囉!」
Meiko:「哇,聽起來這個方便的功能背後,好像做了蠻多事情的,我有辦法做到嗎?」
Jason:「沒問題,對發票其實就是一種重複的工作,不過我們可以先從簡單的開始,如果我問你,請你把 7 天的消費都印出來,你現在會怎麼做?」
Meiko:「印出來?我記得你之前有跟我講print()
可以印東西出來,那應該是這樣」
print (205)
print (350)
print (520)
print (240)
print (330)
print (180)
print (2000)
Meiko:「誒,怎麼這麼麻煩呀,有沒有快一點的方式?」
Jason:「對啊,你看你就在做重複的事情,我來幫你想個辦法,像這樣」
spendList=[205,350,520,240,330,180,2000]
for i in spendList:
print (i)
Meiko:「哇,你只打3行就做完了耶!但是我不太懂 for 這行代表什麼意思?」
for i in spendList:
print (i)
Jason:「我正要跟你解釋!在這段程式碼中的 i 就是代表一個在 spendList 裡面的變數,就像小學生排隊報數一樣,程式利用for-loop
迴圈把spendList
這個串列之中儲存的資料,一個一個用print()
印出來。」
Meiko:「好像有點理解!不過你直接印這些數字出來沒什麼感覺,你能不能印出星期一到星期日,我每天花了多少錢?」
Jason:「Okay,請你唸星期一到星期日,每一天都唸出來?」
「Jason 你是程式寫太多?星期一到星期日,不就星期一、星期二、星期三、星期四、星期五、星期六、星期日?」Meiko 雖然抱持懷疑的心理,但還是念了出來。
Jason:「答對了,你看你一個個的念出來,如果用數字來表示的話,應該會是 1、2、3、4、5、6、7?」
Meiko:「對啊,然後咧?」
Jason:「我們剛剛不是提到 for-loop,如果我們想用數字來表示的話,可以用list
來呈現。」
dayList=[1,2,3,4,5,6,7]
如果我們不想要怎麼麻煩,其實 Python 程式裡面,也已經有一個預先寫好的函式給我們用了,叫做range()
。range()
你看英文字面上的意思是『範圍』,所以它會有幾個條件限制分別是初始值、終止值、遞增(減)值 」
Jason 繼續說:「像下面這樣的形式,range(初始值(可不填,預設為 0 ), 終止值, 遞增(減)值(可不填,預設為 1 ))
Meiko:「看不懂,一下太多東西了拉,Jason!」
Jason:「歐,那我舉幾個可能型的例子好了,最簡單的話,我們可以只設定終止值,初始值和最後一個遞增(減)值我們不設定,就會只有像這樣range(7)
,
for i in range(7):
print (i)
Meiko:「誒,我沒告訴它初始值從哪個數字開始,它就自動從 0 開始計算,一直算到 6,總共 7 個數字耶。」
Jason:「答對了,跟你講這個是因為當你開始寫程式的時候,要開始習慣從 0 開始計算的特性,還有這種整數序列蠻重要的,幾乎在所有的地方都用得到。」
Jason:「另外,比較常見的寫法,我們會寫初始值和終止值,像這樣range(1,7)
」
for i in range(1,7):
print (i)
Meiko:「喂,Jason,程式怎麼只有印出來1~6,你不是說要像 dayList 一樣,要印出 1~7 嗎?」
Jason:「嘿嘿,我就是想測試看看你有沒有睡著呀!你有發現range(1,7)
其時最後只印出到6 嗎?」
Meiko:「所以這個range(1,7)
的意思,就是從 1 開始,印到 6 的意思嗎?」
Jason:「沒錯!我剛不是提到終止值? range(初始值,終止值,遞增(減)值)
這個函式就會印到終止值的前一個值。」
Meiko:「那我要印 1~7 的話,終止值應該要設成 8 囉?所以要改成range(1,8)
對吧?」
for i in range(1,8):
print (i)
Meiko:「這樣才對麻,那我知道了,像range()
這樣的用法,就會算到終止值的前一個!」
Jason:「還有最後一種 case ,同時有初始值、終止值,以及遞增值,且遞增的值不是1的樣子,range(1,7,2)
for i in range(1,7,2):
print (i)
Meiko:「誒,真的耶,它一次跳 2的方式增加,依序出現 1、3、5,但是因為它最多只能出現到 6,所以就不能印出 7 來,是這樣的意思嗎?」
Jason:「不錯唷,看來你現在知道這個for-loop
的range
要怎麼使用了!但我還沒講完唷...」
我大寶寶~拉,今天還沒把所有的for-loop
內容講完,所以不急著出練習給大家,不過可以請你思考for-loop
是否還有其他的應用?掌握 2 個要點:
歡迎登入留言跟我分享你的成果唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.今天沒有解答~星期天就輕鬆點囉!