iT邦幫忙

3

【Python 超入門】(7) for/while邏輯- 人生苦短,重複的事情就交給程式做吧

大家好,我是「心原一馬」,內心原來一心喜歡打程式碼。
【Python 超入門】(4) 變數型態-list: 能納百物的百寶袋中,我們學到可以用list來存放很多變數。
例如:

students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 

那如果今天想要把全班學生的名單都印出來,
每印一個學生要換一行怎麼辦呢?

一個有點不切實際的寫法

我們當然可以這樣寫,用中括號表示要取第幾個學生:

students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 
print(students[0])  #印出Alice
print(students[1])  #印出Bob
print(students[2])  #印出Cindy
print(students[3])  #印出Daisy
print(students[4])  #印出Eve
print(students[5])  #印出Fairy

可是假設列表裡有一百個學生呢?
難道我們就寫一百次print嗎?
這樣程式篇幅也未免太大了。
還好程式語言中有 for 迴圈可以幫助我們遍歷 列表。
for 有點像是我們口語所說的「對於」,
「對於」列表中所有的元素,我都拜訪過一遍。

for-基礎用法

for迴圈的基礎用法如下:
for 跟 if 語法規則相同,
在for語句後面要加冒號,
並且下一行要空四格,
表示是在 for 迴圈裡面的程式碼。

for 變數名稱 in 列表:
    執行一段敘述

範例1- 印出全班名單

students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 
for student in students:
    print(student)

結果:
Alice
Bob
Cindy
Daisy
Eve
Fairy
for 迴圈會將students裡面的元素按順序走過一遍。
第一次執行的時候,student的值是'Alice',
但這時候students裡還有其它元素還沒走過,就會繼續執行,
直到每個元素都走過一遍。

for-基礎用法2

當我們想讓同一個指令重複做n次時,可以用以下的語法:

for _ in range(n):
    一段程式碼

其中 _ 是底線(按shift+鍵盤上面數字0的右邊的鍵可打出該字)。
我們直接看例子:

範例2: 兔兔的罰寫作業一百遍

話說在可愛動物程式學園中,
兔兔因為上課偷睡覺被馬老師抓到,
馬老師決定讓兔兔罰抄「我以後上課不會打瞌睡」一百遍。
這要是在以前真的用手寫的話,
可是會寫到手非常酸的。
還好現代時代在進步,
既然是程式學園嘛,
馬老師決定罰兔兔在螢幕上顯示一百遍「我以後上課不會打瞌睡」。
用for 迴圈,輕鬆搞定。

for i in range(100):
    print('我以後上課不會打瞌睡')

while-基礎用法

當我們想要做重複做固定次數的事情適合用for迴圈,
那如果想要一直做事直到某個條件才停下來,
那就必須用while迴圈了。
while的口語是「只要某某條件成立,就一直做…」。
while的基礎語法如下:

while 條件運算式:
    只要條件成立時就會一直做這個敘述

與for, if 相同,while語句後面要加冒號,
並且在while裡的程式碼要空四格。

舉個很生活化的例子,
戀人之間天長地久的承諾,
便是一種while邏輯的表現。
例如:

while 地球還在的一天:
    我就會繼續愛著你

類似這樣的感覺。
接著看實際的例子吧:

範例3- 算完1加到1000才可以下課哦

話說有一天,老師覺得班上同學實在太吵了,
就罰全班同學要算出1+2+3+…+1000的值才可以下課,
你不想按慢慢按計算機,
恰巧你平時數學課可能也不夠認真,
絲毫不記得等差級數的公式,
有沒有辦法用程式的while迴圈解呢?
程式如下:

ans=0   #用ans變數記錄最後加總的答案
num=1   #用num變數記錄下一個要加的數字
while num<=1000: #一直增加數字,直到num到達1000
    ans+=num
    num+=1  #每次把要加的數字+1
print(ans)  #迴圈結束後,把答案印出來

結果為500500

一開始我們設置兩個初始值,ans跟num,
ans變數記錄最後加總的答案,
num變數記錄要加的數字,
一開始進入while迴圈時,把ans加上num數字,
,再把num加1 (此時ans變成1,num變成2)
可是這個時候num還是小於等於1000啊,
所以迴圈繼續執行。
到第二次進行迴圈時,
ans再加上num(此時再加上2),再把num加1(num變成3)…

說明迴圈中發生了什麼:

  • 第一次執行迴圈: ans變成1,nums變成2 (目前加總的答案為1,下一個要加的數字為2)
  • 第二次執行迴圈: ans變成3,nums變成3 (目前加總的答案為1+2=3,下一個要加的數字為3)
  • 第三次執行迴圈: ans變成6,nums變成4 (目前加總的答案為1+2+3=6,下一個要加的數字為4)

    直到第一千次執行迴圈,nums變成1001,此時不滿足條件,迴圈便結束。

以上便是迴圈的介紹啦~ 當我們希望重複做某些事情時,便可以嘗試使用迴圈哦。

課後練習- 跟班上同學打聲招呼吧

又到了課後練習時間啦~
這邊測試大家對程式縮排邏輯是否理解囉。
延續本篇開頭中程式的學生名單,

students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 

假設現在我們想寫一支程式跟班上同學們打招呼,
如下有兩個版本:

# 程式一
students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 
for student in students:
    print('Hello, ' + student + '.')
    print('Nice to meet you.')
# 程式二
students = ['Alice', 'Bob', 'Cindy', 'Daisy', 'Eve', 'Fairy'] 
for student in students:
    print('Hello, ' + student + '.')
print('Nice to meet you.')

那麼在程式一和程式二中,各會出現幾次Nice to meet you.呢?
歡迎在留言區留下你的答案哦~


1
圓頭人
iT邦新手 2 級 ‧ 2019-07-01 14:48:04

哈~~再也不怕老師叫我罰寫了!!

1
瓦力
iT邦新手 5 級 ‧ 2019-07-02 11:14:41

呃~
程式一出現6次

程式二一次都沒有?
因為 第四行沒有縮排..?

看更多先前的回應...收起先前的回應...

Bingo~ 程式一出現6次。
不過既然程式二有print('Nice to meet you.')的話,
還是會印出東西來哦。
有沒有縮排的差別是在於有沒有放進for迴圈裡
(放進for迴圈裡的程式碼會重複執行,在for迴圈外的只會執行一次)
再想一想~ 程式二會出現幾次呢?

也可以直接執行程式試試,看看結果跟你想的是否相同哦~

瓦力 iT邦新手 5 級‧ 2019-07-02 16:50:11 檢舉

我知道了~程式二出現一次~~~ 顆顆/images/emoticon/emoticon25.gif
感謝心原一馬大大詳細的解說~~
期待您後面的教學喔~~! ^^

正確,程式二出現一次,恭喜你答對了~ 敬祝你學習愉快哦~

1
跑得快
iT邦新手 3 級 ‧ 2019-07-05 17:55:10

感謝小馬老師
對Python新手而言好容易漏掉縮排這件事情雖然比較直觀
但習慣
{
}
後碰Python反而覺得好像漏打很多東西XD

哈哈~ 你跟我一樣呢~ 我一開始是先接觸 C,
迴圈都要用
{
}
包起來,
一開始也很不習慣python的縮排,
但是習慣了之後發現還是縮排比較直觀。
如果寫其它語言只用大括號把程式碼區塊包起來但沒有縮排,
反而容易分不清程式碼是放在迴圈「外面」還是「裡面」。
尤其是大括號一多的時候,常常容易漏打一個括號呢~

2
naorosie
iT邦新手 5 級 ‧ 2019-07-22 13:33:00

請問一下以下這段的i

for i in range(100):
print('我以後上課不會打瞌睡')

是不是打i或_都可以呢?謝謝~

您說的沒錯哦,因為for迴圈裡面做的事情與i無關,
所以打i或_都可以的。
以下幾段code都是對的:

for _ in range(100):
    print('我以後上課不會打瞌睡')
for i in range(100):
    print('我以後上課不會打瞌睡')
for j in range(100):
    print('我以後上課不會打瞌睡')

因為在這個例子中,
取什麼變數名稱不是很重要,
因此直接打 _ 最簡單。

但若我們想要把0~99的整數印出來,
就不能只是打 _ 了,
要取變數名稱:

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

結果就會是
0
1
2

99
共100行。
(註: 由於多數程式語言習慣上從0開始,
range(100)表示從0~99的整數區間,
而非1~100哦)

了解!!好清楚的說明,謝謝~
目前正在從您的文章學習/images/emoticon/emoticon37.gif

好的,很高興有幫到您哦~

我要留言

立即登入留言