Python可以這樣玩(5):程式控制結構
如果想要快速進步,請務必完成文章裡面的習題,如果真的實做了,也別忘了把成果複製到留言板,分享給其他人。
前面的章節,我們都在互動介面環境底下玩指令,其實還沒有開始寫程式,要撰寫一個完整的程式,就必須要了解程式控制的語法,學會這些語法,我們就可以讓電腦按照我們的指示做事。
條件運算式
單分支選擇結構
多分支選擇結構
巢狀選擇結構
迴圈結構
break 和
continue 語句
前面的章節,我們都在互動介面環境底下玩指令,其實還沒有開始寫程式,要撰寫一個完整的程式,就必須要了解程式控制的語法,學會這些語法,我們就可以讓電腦按照我們的指示做事。
條件運算式
別著急,一開始我們還是在互動式環境下面練習。我們用中文來詮釋條件運算式,如果這件事是真的,就執行甲方案,若不是,就執行乙方案,用電腦就會寫成(請務必學會如何輸入,輸入:自動縮排,del鍵結束縮排,代表 block 結束):
>>>
a = True
>>>
if a == True:
print('甲方案')
else:
print('乙方案')
甲方案
>>>
重點來了,Python 是如何定義 True 跟 False 呢? 條件運算式的值只要不是 False、0、0.0、空值None、空列表、空元組、空集合、空字典、空字串等,Python 均認為是 True 的等價。所以,下面的例子都被當成 True (最後的例子是 False)。
>>>
if 3:
print('True')
True
>>>
a = [1,2,3]
>>>
if a:
print(a)
[1, 2,
3]
>>>
a = []
>>>
if a:
print(a)
else:
print('Empty')
Empty
>>>
搭配前面講過的關係運算子與邏輯運算子,我們就可以寫有判斷能力的程式了。
條件運算式有幾種形式:
單分支選擇結構
if 運算式:
語句區塊
當運算式為 True 的時候,就執行語句區塊。範例如下:
>>>
x = input('Input two numbers: ')
Input
two numbers: 12 31
>>>
a, b = map(int, x.split())
>>>
if a < b:
a, b = b, a
>>>
print(a,b)
31 12
>>>
我們現在練習把上面在互動環境寫的程式碼,存成真正的程式檔,這樣我們才能清楚地學會程式的架構。
主程式名稱是 main(),冒號下面是整個 def main(): 的 block,注意縮排,縮排結束代表 def main(): 定義結束,然後最後面的 main() 是執行此程式。
同樣的 if a < b: 的下一行也要縮排,代表如果為 True 的話要執行的 block,最然後執行
print(a, b)。
隨堂練習
請完成上面的程式,並存成 swap.py 檔,且可以正確執行
在 Python 中,縮排很重要,同一個程式碼區塊(block)必須保證相同的內縮量,如果程式碼很短,也可以選擇在同一排,如下:
>>>
if 3>2: print('ok')
ok
>>>
if True: print(3); print(5)
3
5
>>>
雙分支選擇結構
if 運算式:
語句區塊1
else:
語句區塊2
實機操作
>>> num =
[1,2,3,4,5]
>>> ch =
list(___(___, num))
>>> ch
['1', '2', '3',
'4', '5']
>>> if ch:
print(ch)
else:
print('empty')
[___, ___, ___, ___,
___]
>>>
Python 還提供三元運算子,其實語法跟英文語法一樣,格式為:
Value1
if condition else Value2
來幾個練習:
實機操作
>>> 'true'
if False else 'false'
'______'
>>> 'true'
if True else 'false'
'______'
>>> a = 5
>>>
print(6) if a>3 else print(5)
___
>>>
print(6 if a>5 else 5)
___
>>> b = 6
if a>13 else 9
>>> b
___
>>>
多分支選擇結構
if 運算式1:
語句區塊1
elif 運算式2:
語句區塊2
elif 運算式3:
語句區塊3
……
else:
語句區塊n
實機操作
>>> def
func(score):
if score > 100:
return 'wrong score. must <= 100'
elif score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
elif score >= 0:
return 'E'
else:
return 'wrong score. must > 0'
>>>
func(120)
'_________________________'
>>>
func(99)
'____________'
>>>
func(62)
'____________'
>>>
func(49)
'____________'
>>>
巢狀選擇結構
結構中還有結構,只要記得 Python 的縮排原則即可,有待後面實際寫程式的時候再說明。
作業 (完成後可以在留言板分享)
一、
撰寫程式 SayHello.py:
執行之後會詢問性別(male or female),然後電腦回答:
先生您好,或是 小姐您好
二、
撰寫程式 Interview.py
這是一個工作面試程式,執行之後電腦會詢問:
1.
年紀
2.
畢業成績
然後按照年齡判斷,如果 <18 則輸出:抱歉,您未滿18歲
如果 > 30,則輸出:抱歉,您超出年齡限制
年齡沒問題之後再判斷畢業成績
如果 < 80 則輸出:抱歉,您的成績未達標
最後通過則輸出:恭喜您錄取了
迴圈結構
現在開始,我們進入程式語言最有趣的部份,專門用來處理重複性的動作。Python 主要有兩種形式的迴圈結構:for loop and while loop。
while 條件運算式:
循環區塊
[else:
else子句程式區塊]
和
for 取值 in 序列或反覆運算物件:
循環區塊
[else:
else子句程式區塊]
首先,我們來計算 1+2+3+…+100 的結果:
>>>
s = 0
>>>
for i in range(1,101):
s += i
else:
print(s)
5050
>>>
>>>
相同的,我們可以使用 while 迴圈達成同樣的事情:
>>>
s = i = 0
>>>
while i <= 100:
s += i
i += 1
else:
print(s)
5050
>>>
程式設計時,一般優先考慮 for loop,接下來的程式巧妙的運用 range() 函數控制迴圈的次數,並輸出由 * 組成的菱形圖案(請自行輸入並存為 diamond.py):
結果如下:
作業
一、
使用 for loop 在螢幕上輸出:
1 2 3 4 5 6 7 8 9
>>>
二、
使用兩層 for loop 在螢幕上輸出九九乘法表的值:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16
18
3 6 9 12 15 18 21
24 27
…
…
…
9 18 27 36 45 54 63
72 81
>>>
三、
請完成一九九乘法表的程式 multiple.py
1x1=1 1x2=2 1x3=3 …
9x9=81
四、
請完成1加到 100 的程式 add100.py
輸出結果為:
1+2+3+4+…(全部要顯示出來)…+100=5050
break 和
continue 語句
while 和 for 迴圈都可以使用 break 和 continue 語句,一旦執行 break
語句,將使的迴圈提前結束。Continue 語句的作用是提前結束本次迴圈,進入下一次迴圈。
下面程式用來計算小於100 的最大質數:
>>>
for n in range(100,1,-1):
for i in range(2,n):
if n%i == 0:
break
else:
print(n)
break
97
>>>
刪除最後一個 break 並略加修改之後,便能輸出100以內的所有值數:
>>>
for n in range(100,1,-1):
for i in range(2,n):
if n%i == 0:
break
else:
print(n, end=' ')
97 89 83
79 73 71 67 61 59 53 47 43 41 37 31 29 23 19 17 13 11 7 5 3 2
>>>
隋棠練習
將上面的程式碼稍加修改成為程式,PrimeNumber.py
執行之後先問一個數目字,然後列出這個數字內的所有質數
>>>
下面的例子可以輸出列表中的元素:
>>>
a_list = ['a','b','cat','x','example']
>>>
for i, v in enumerate(a_list):
print('列表的第', i+1, '個元素是:', v)
列表的第 1 個元素是: a
列表的第 2 個元素是: b
列表的第 3 個元素是: cat
列表的第 4 個元素是: x
列表的第 5 個元素是: example
>>>
習題
完成程式: NarcissisticNumber.py
找出所有三位數的水仙花數
說明:在數論中,水仙花數(Narcissistic number),也被稱為超完全數字不變數(pluperfect digital
invariant, PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong
number),用來描述一個N位非負整數,其各位數字的N次方和等於該數本身。
以三位數為例,153就是一個三位超完全數字不變數,其各個數之立方和等於該數:
153 = 13 + 53 + 33。
很多數學題目,也都可以用 for loop 來解題,人類在解題的時候,會使用代數,但是電腦的運算速度很快,可以用嘗試錯誤法逐個檢查。例如雞兔同籠的問題,假設共有雞、兔30隻,腳有90隻、求雞兔各多少隻?
>>>
for chi in range(0,31):
if 2 * chi + (30-chi) * 4 == 90:
print('雞:',chi,' 兔:',30-chi)
雞: 15
兔: 15
>>>
巢狀:
回覆刪除def SayHello():
sex = input('male or female?/n')
print('先生您好' if sex=='male' else '小姐您好')
def Interview():
db = input('請提供年紀與畢業成績')
year,grade = map(int,db.split())
if year < 18:print('您未滿18歲')
elif year >30:print('抱歉,您超出年齡限制')
else:
if grade <80:print('抱歉,您的成績未達標')
else:print('恭喜您錄取了')
Interview()
迴圈
一、
def main():
for i in range(1,10):print('%d'%(i),end='\r')
main()
二、
def main():
for i in range(1,10):
for j in range(1,10):
print('%d'%(i*j),end='\r')
print('\n')
main()
三、
def multiple():
for i in range(1,10):
for j in range(1,10):
print('%dx%d=%d'%(i,j,i*j),end='\r')
print('\n')
multiple()
四、
def add100():
sum=0;
for i in range(1,101):
if(i<100):print('%d'%(i),end='+')
else:print('%d'%(i),end='=')
sum+=i
print(sum)
add100()