Python可以這樣玩(5):程式控制結構

如果想要快速進步,請務必完成文章裡面的習題,如果真的實做了,也別忘了把成果複製到留言板,分享給其他人。

前面的章節,我們都在互動介面環境底下玩指令,其實還沒有開始寫程式,要撰寫一個完整的程式,就必須要了解程式控制的語法,學會這些語法,我們就可以讓電腦按照我們的指示做事。

條件運算式

別著急,一開始我們還是在互動式環境下面練習。我們用中文來詮釋條件運算式,如果這件事是真的,就執行甲方案,若不是,就執行乙方案,用電腦就會寫成(請務必學會如何輸入,輸入:自動縮排,del鍵結束縮排,代表 block 結束)

>>> a = True
>>> if a == True:
    print('甲方案')
else:
    print('乙方案')
   
甲方案
>>> 

重點來了,Python 是如何定義 True False ? 條件運算式的值只要不是 False00.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
>>> 

留言

  1. 巢狀:
    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()

    回覆刪除

張貼留言

這個網誌中的熱門文章

Python可以這樣玩(16):共陰/共陽七段顯示器

Python可以這樣玩(11):數學繪圖

Python可以這樣玩(15):蜂鳴器與音樂