簡介
迄今為止我們見到的所有程序總是含有一連串語句並且python忠實的順序執行它們。
那么如何改變它們的執行順序呢?例如你希望程序根據不同情況作出不同反應,按照當前時間分別
打印出’Good Morning’或’Good Evening’?
也許你已經猜到了,這需要使用控制流程語句,python擁有3種此類語句,分別為if,for和while。
if語句
if語句用來檢查一個條件,如果條件為真則執行一個語句塊(被稱作if塊),否則執行另一個語句塊(被稱作else塊)。
其中else分支是可選的。
范例:
#!/usr/bin/python
# Filename: if.py
number = 23
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.') # 新塊開始處
print('(but you do not win any prizes!)') # 新塊結束處
elif guess < number:
print('No, it is a little higher than that') # 另一個塊
# 你可以在一個塊里做任何你想做的。。。
else:
print('No, it is a little lower than that')
# 只有guess > number 才會執行到此處
print('Done')
# if語句執行完畢后,最后這條語句永遠會被執行
輸出:
$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done
$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done
$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done
程序流程:
本程序將用戶猜測的數對比被猜的數(注: 23)。
我們可以將被猜數定為任何整數。然后利用input()函數得到用戶猜測的數。
函數只是可復用的程序片段,下章我們會學到更多關於函數的知識。
我們為內建input函數提供一個字符串,函數會將它打印到屏幕,一但我們輸入了什么並按下回車,
input就會將輸入當作一個字符串返回,之后利用int我們將其轉換為一個整數並存入變量guess中。
實際上int是一個類,現在你只需知道它能將一個字符串轉換為整數(假設字符串包含一個合法的文本
形式的整數)。
接下來我們比較用戶猜測的數與被猜的數,如果它們相等我們就打印一個成功信息。注意我們
使用縮進告訴python語句分別屬於哪些塊,這就是為什么縮進對於python非常重要。
我也希望你能做到前文提到的”縮進一致性”規則,你可以嗎?
同時也要注意到if語句的結尾包含一個分號 – 它指示python分號其后將跟隨一個語句塊。
緊接着我們檢查猜測的數是否小於被猜數,如果是,則告訴用戶猜測的數大了一些。
這里我們使用的是elif分支,事實上它把兩個相關的if else-if else語句組合成一個if-elif-else語句。
這樣做不僅使得程序更加簡潔也降低了縮進數量。
同樣,elif和else語句必須在邏輯行的結尾寫上冒號,其后是與之對應的語句塊(當然還要有相應的縮進)
最后你也可以在if語句中插入另一個if-block塊,這叫做嵌套的if語句。
上面說過elif和else是可選的。一個最簡單合法的if語句如下:
if True:
print('Yes, it is true')
當python執行完if語句及其相關的elif和else分支,控制權會轉移到包含此if語句的語句塊的下一條語句。
本例中,這個塊是主塊,程序從此塊開始執行,下一個條語句為print(‘Done’)。
隨后python看到程序的結尾並簡單的結束運行。
盡管程序非常簡單,我也指出了這個簡單程序中你所有應該注意的地方。
這一切十分易懂(有C/C++背景更是如此),但在最初你還是要引起注意,等到用熟以后就會感到自然,順手了。
C/C++程序員請注意
python沒有switch語句,你可以使用if…elif…else語句達到同樣的目的(有時用字典代替會更加快捷)。
while語句
只要條件為真,while語句允許你不斷的重復執行語句塊。
while語句是所謂循環語句的一個例子,它還可以擁有一個可選的else分支。
范例:
#!/usr/bin/python
# Filename: while.py
number = 23
running = True
while running:
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.')
running = False # this causes the while loop to stop
elif guess < number:
print('No, it is a little higher than that.')
else:
print('No, it is a little lower than that.')
else:
print('The while loop is over.')
# Do anything else you want to do here
print('Done')
輸出:
$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done
工作流程:
本例中我們繼續玩猜數字游戲,不過更先進的是用戶可以不斷的猜直到猜對為止 – 如此就不會象
上一個范例那樣用戶每猜一次都運行一遍程序了。這正好可以恰當的示范while語句的使用。
我們將input和if語句移進while循環內,並在循環開始前將變量running設為True。
最初我們檢查變量running是否為True並進入while塊執行之。while塊執行完畢后繼續檢查條件,即running是否為真。
如果是則再次執行while塊,否則可選的else塊將被執行。完畢后再執行下一條語句。
只有while語句的條件為False時else才會被執行 – 就算條件第一次被檢查時也是如此。
因此除非使用break跳出循環,否則while循環的else分支肯定會被執行。
True和False被稱為Boolean類型,你可以分別把它們看作是值1和0。
(注:只是”看作”而已,不要認為它們完全等於0和1)
寫給C/C++程序員
記住,while循環可以擁有else分支
for循環
for…in是另一種循環語句,用來遍歷序列對象,也就是說遍歷序列中的每個元素。
至於序列對象,你現在只要記住序列只是元素的集合就可以了。
范例:
#!/usr/bin/python
# Filename: for.py
for i in range(1, 5):
print(i)
else:
print('The for loop is over')
輸出:
$ python for.py
1
2
3
4
The for loop is over
執行流程:
在這個程序中,我們打印了一個數字序列。而這個序列由內建range函數產生。
根據我們提供的兩個數字,range返回一個開始於第一個數字而結束於第二個數的序列,例如
range(1, 5)產生序列[1, 2, 3, 4]。默認的range步長為1。如果我們傳給它第三個數字,則相當於設置步長。
例如range(1, 5, 2)產生[1, 3]。記住range函數止步於我們提供的第2個數字,即不包含第2個數。
然后for循環對其進行迭代 – for i in range(1, 5)等價於for I in [1, 2, 3, 4]就象將序列中的每個數
字(或對象)一次一個的賦給i,而每次賦值都會執行一遍for語句塊。本例中我們僅僅打印i的值。
記住,else部分同樣是可選的,除非使用break語句跳出循環否則它總是在循環結束時執行一次。
還應記住,for…in可以工作於任何序列,這里我們使用的是內建函數range產生的數字列表,
但我們也可以使用任何種類的對象組成的任何種類的序列!后面的章節會有具體解釋。
C/C++/Java/C#請注意
python的for循環完全不同於C/C++的for循環。
C#程序員應該已經注意到它類似於C#中的foreach循環。
而Java程序員也應該注意到了Java1.5的for(int i : IntArray)與之很相似。
如果你想實現C/C++中的for(int i = 0; i< 5; i++),python中只需編寫 for i in range(0, 5)。
如你所見,python的for循環更簡單,更富於表達力也更不容易出錯。
break語句
break語句用於跳出循環,即停止循環語句的執行,即使循環條件還沒有變為False或者序列的遍歷尚未完成。
一個需要特別注意的地方是如果你使用break跳出for或while循環,那么相關的else塊不會被執行。
范例
#!/usr/bin/python
# Filename: break.py
while True:
s = (input('Enter something : '))
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')
輸出:
$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 12
Enter something : quit
Done
工作流程:
這個程序不斷的取得用戶輸入,並打印每次輸入的長度。通過一個特殊條件判斷用戶
輸入是否等於’quit’,如果是則使用break跳出循環,隨后來到程序尾則程序終止。
而輸入字符串的長度可以通過內建函數len得到。
記住for循環同樣可以使用break語句。
Swaroop Poetic Python
我在范例中輸入的是一首自賦的小詩,它的名字叫Swaroop's Poetic Python:
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
(注: Swaroop是本文作者,不翻譯了,各位用個人獨有的悠悠情愫”淫”起來吧,啊。。。。啊。。。。)
continue語句
語句continue告訴python跳過當前循環語句塊的剩余部分執行下次迭代。
范例:
#!/usr/bin/python
# Filename: continue.py
while True:
s = input('Enter something : ')
if s == 'quit':
break
if len(s) < 3:
print('Too small')
continue
print('Input is of sufficient length')
# Do other kinds of processing here...
輸出:
$ python test.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit
工作流程:
本例接收用戶輸入,只有當輸入至少為3個字符長時才會進行處理。
因此我們使用內建len函數取得輸入長度,當小於3時利用continue語句跳過程序的余下部分。
否則程序的余下部分會被執行,在這里可以進行我們希望做的任何種類的處理。
注意,continue語句同樣能夠配合for循環使用。
小結
我們已經知道如何使用python中的3個控制流語句了 - if, while, for及其相關的break, continue語句。
它們是python中常用的部分,因此有必要熟練掌握。
接下來,我們會看到如何創建和使用函數

