在到目前為止我們所見到的程序中,總是有一系列的語句,Python 忠實(shí)地按照它們的順序執(zhí)行它們。如果你想要改變語句流的執(zhí)行順序,該怎么辦呢?例如,你想要讓程序做一些決定,根據(jù)不同的情況做不同的事情,例如根據(jù)時(shí)間打印“早上好”或者“晚上好”。
你可能已經(jīng)猜到了,這是通過控制流語句實(shí)現(xiàn)的。在 Python 中有三種控制流語句—— if、for 和 while。
if 語句用來檢驗(yàn)一個(gè)條件, 如果 條件為真,我們運(yùn)行一塊語句(稱為 if-塊 ), 否則 我們處理另外一塊語句(稱為 else-塊 )。 else 從句是可選的。
例 6.1 使用 if 語句
#!/usr/bin/python
# Filename: if.py
number = 23
guess = int(raw_input('Enter an integer : '))
if guess == number:
print 'Congratulations, you guessed it.' # New block starts here
print "(but you do not win any prizes!)" # New block ends here
elif guess < number:
print 'No, it is a little higher than that' # Another block
# You can do whatever you want in a block ...
else:
print 'No, it is a little lower than that'
# you must have guess > number to reach here
print 'Done'
# This last statement is always executed, after the if statement is executed
(源文件:code/if.py)
輸出
$ 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
它如何工作
在這個(gè)程序中,我們從用戶處得到猜測(cè)的數(shù),然后檢驗(yàn)這個(gè)數(shù)是否是我們手中的那個(gè)。我們把變量 number 設(shè)置為我們想要的任何整數(shù),在這個(gè)例子中是 23。然后,我們使用 raw_input()函數(shù)取得用戶猜測(cè)的數(shù)字。函數(shù)只是重用的程序段。我們將在下一章學(xué)習(xí)更多關(guān)于函數(shù)的知識(shí)。
我們?yōu)閮?nèi)建的 raw_input 函數(shù)提供一個(gè)字符串,這個(gè)字符串被打印在屏幕上,然后等待用戶的輸入。一旦我們輸入一些東西,然后按回車鍵之后,函數(shù)返回輸入。對(duì)于 raw_input 函數(shù)來說是一個(gè)字符串。我們通過 int 把這個(gè)字符串轉(zhuǎn)換為整數(shù),并把它存儲(chǔ)在變量 guess 中。事實(shí)上,int 是一個(gè)類,不過你想在對(duì)它所需了解的只是它把一個(gè)字符串轉(zhuǎn)換為一個(gè)整數(shù)(假設(shè)這個(gè)字符串含有一個(gè)有效的整數(shù)文本信息)。
接下來,我們將用戶的猜測(cè)與我們選擇的數(shù)做比較。如果他們相等,我們打印一個(gè)成功的消息。注意我們使用了縮進(jìn)層次來告訴 Python 每個(gè)語句分別屬于哪一個(gè)塊。這就是為什么縮進(jìn)在 Python 如此重要的原因。我希望你能夠堅(jiān)持“每個(gè)縮進(jìn)層一個(gè)制表符”的規(guī)則。你是這樣的嗎?
注意 if 語句在結(jié)尾處包含一個(gè)冒號(hào)——我們通過它告訴 Python 下面跟著一個(gè)語句塊。
然后,我們檢驗(yàn)猜測(cè)是否小于我們的數(shù),如果是這樣的,我們告訴用戶它的猜測(cè)大了一點(diǎn)。我們?cè)谶@里使用的是 elif 從句,它事實(shí)上把兩個(gè)相關(guān)聯(lián)的 if else-if else 語句合并為一個(gè) if-elif-else 語句。這使得程序更加簡(jiǎn)單,并且減少了所需的縮進(jìn)數(shù)量。
elif 和 else 從句都必須在邏輯行結(jié)尾處有一個(gè)冒號(hào),下面跟著一個(gè)相應(yīng)的語句塊(當(dāng)然還包括正確的縮進(jìn))。
你也可以在一個(gè) if 塊中使用另外一個(gè) if 語句,等等——這被稱為嵌套的 if 語句。
記住,elif 和 else 部分是可選的。一個(gè)最簡(jiǎn)單的有效 if 語句是:
if True:
print 'Yes, it is true'
在 Python 執(zhí)行完一個(gè)完整的 if 語句以及與它相關(guān)聯(lián)的 elif 和 else 從句之后,它移向 if 語句塊的下一個(gè)語句。在這個(gè)例子中,這個(gè)語句塊是主塊。程序從主塊開始執(zhí)行,而下一個(gè)語句是 print 'Done'語句。在這之后,Python 看到程序的結(jié)尾,簡(jiǎn)單的結(jié)束運(yùn)行。
盡管這是一個(gè)非常簡(jiǎn)單的程序,但是我已經(jīng)在這個(gè)簡(jiǎn)單的程序中指出了許多你應(yīng)該注意的地方。所有這些都是十分直接了當(dāng)?shù)模▽?duì)于那些擁有 C/C++背景的用戶來說是尤為簡(jiǎn)單的)。它們?cè)陂_始時(shí)會(huì)引起你的注意,但是以后你會(huì)對(duì)它們感到熟悉、“自然”。
給C/C++程序員的注釋
在 Python 中沒有 switch 語句。你可以使用 if..elif..else 語句來完成同樣的工作(在某些場(chǎng)合,使用字典會(huì)更加快捷。)
只要在一個(gè)條件為真的情況下,while 語句允許你重復(fù)執(zhí)行一塊語句。while 語句是所謂 循環(huán) 語句的一個(gè)例子。while 語句有一個(gè)可選的 else 從句。
例 6.2 使用 while 語句
#!/usr/bin/python
# Filename: while.py
number = 23
running = True
while running:
guess = int(raw_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'
(源文件:code/while.py)
輸出
$ 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
它如何工作
在這個(gè)程序中,我們?nèi)匀皇褂昧瞬聰?shù)游戲作為例子,但是這個(gè)例子的優(yōu)勢(shì)在于用戶可以不斷的猜數(shù),直到他猜對(duì)為止——這樣就不需要像前面那個(gè)例子那樣為每次猜測(cè)重復(fù)執(zhí)行一遍程序。這個(gè)例子恰當(dāng)?shù)卣f明了 while 語句的使用。
我們把 raw_input 和 if 語句移到了 while 循環(huán)內(nèi),并且在 while 循環(huán)開始前把 running 變量設(shè)置為 True。首先,我們檢驗(yàn)變量 running 是否為 True,然后執(zhí)行后面的 while-塊 。在執(zhí)行了這塊程序之后,再次檢驗(yàn)條件,在這個(gè)例子中,條件是 running 變量。如果它是真的,我們?cè)俅螆?zhí)行 while-塊,否則,我們繼續(xù)執(zhí)行可選的 else-塊,并接著執(zhí)行下一個(gè)語句。
當(dāng) while 循環(huán)條件變?yōu)?False 的時(shí)候,else 塊才被執(zhí)行——這甚至也可能是在條件第一次被檢驗(yàn)的時(shí)候。如果 while 循環(huán)有一個(gè) else 從句,它將始終被執(zhí)行,除非你的 while 循環(huán)將永遠(yuǎn)循環(huán)下去不會(huì)結(jié)束!
True 和 False 被稱為布爾類型。你可以分別把它們等效地理解為值 1 和 0。在檢驗(yàn)重要條件的時(shí)候,布爾類型十分重要,它們并不是真實(shí)的值 1。
else 塊事實(shí)上是多余的,因?yàn)槟憧梢园哑渲械恼Z句放在同一塊(與 while 相同)中,跟在 while 語句之后,這樣可以取得相同的效果。
給 C/C++程序員的注釋
記住,你可以在 while 循環(huán)中使用一個(gè) else 從句。
for..in 是另外一個(gè)循環(huán)語句,它在一序列的對(duì)象上 遞歸 即逐一使用隊(duì)列中的每個(gè)項(xiàng)目。我們會(huì)在后面的章節(jié)中更加詳細(xì)地學(xué)習(xí)序列。
例 6.3 使用 for 語句
#!/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
它如何工作
在這個(gè)程序中,我們打印了一個(gè) 序列 的數(shù)。我們使用內(nèi)建的 range 函數(shù)生成這個(gè)數(shù)的序列。
我們所做的只是提供兩個(gè)數(shù),range 返回一個(gè)序列的數(shù)。這個(gè)序列從第一個(gè)數(shù)開始到第二個(gè)數(shù)為止。例如,range(1,5)給出序列[1, 2, 3, 4]。默認(rèn)地,range 的步長(zhǎng)為 1。如果我們?yōu)閞ange 提供第三個(gè)數(shù),那么它將成為步長(zhǎng)。例如,range(1,5,2)給出[1,3]。記住,range 向上 延伸到第二個(gè)數(shù),即它不包含第二個(gè)數(shù)。
for 循環(huán)在這個(gè)范圍內(nèi)遞歸—— for i in range(1,5)等價(jià)于 for i in [1, 2, 3, 4],這就如同把序列中的每個(gè)數(shù)(或?qū)ο螅┵x值給 i,一次一個(gè),然后以每個(gè) i 的值執(zhí)行這個(gè)程序塊。在這個(gè)例子中,我們只是打印 i 的值。
記住,else 部分是可選的。如果包含 else,它總是在 for 循環(huán)結(jié)束后執(zhí)行一次,除非遇到 break 語句。
記住,for..in 循環(huán)對(duì)于任何序列都適用。這里我們使用的是一個(gè)由內(nèi)建 range 函數(shù)生成的數(shù)的列表,但是廣義說來我們可以使用任何種類的由任何對(duì)象組成的序列!我們會(huì)在后面的章節(jié)中詳細(xì)探索這個(gè)觀點(diǎn)。
給 C/C++/Java/C#程序員的注釋
Python 的 for 循環(huán)從根本上不同于 C/C++的 for 循環(huán)。C#程序員會(huì)注意到 Python 的 for 循環(huán)與 C#中的 foreach 循環(huán)十分類似。Java 程序員會(huì)注意到它與 Java 1.5 中的 for (int i : IntArray)相似。 在 C/C++中,如果你想要寫 for (int i = 0; i < 5; i++),那么用 Python,你寫成 for i in range(0,5)。你會(huì)注意到,Python 的 for 循環(huán)更加簡(jiǎn)單、明白、不易出錯(cuò)。
break 語句是用來 終止 循環(huán)語句的,即哪怕循環(huán)條件沒有稱為 False 或序列還沒有被完全遞歸,也停止執(zhí)行循環(huán)語句。
一個(gè)重要的注釋是,如果你從 for 或 while 循環(huán)中 終止 ,任何對(duì)應(yīng)的循環(huán) else 塊將不執(zhí)行。
例 6.4 使用 break 語句
#!/usr/bin/python
# Filename: break.py
while True:
s = raw_input('Enter something : ')
if s == 'quit':
break
print 'Length of the string is', len(s)
print 'Done'
(源文件:code/break.py)
輸出
$ 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
它如何工作
在這個(gè)程序中,我們反復(fù)地取得用戶地輸入,然后打印每次輸入地長(zhǎng)度。我們提供了一個(gè)特別的條件來停止程序,即檢驗(yàn)用戶的輸入是否是'quit'。通過 終止 循環(huán)到達(dá)程序結(jié)尾來停止程序。
輸入字符串的長(zhǎng)度通過內(nèi)建的 len 函數(shù)取得。
記住,break 語句也可以在 for 循環(huán)中使用。
我在這里輸入的是我所寫的一段小詩,稱為 G2 的 Python 詩:
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
continue 語句被用來告訴 Python 跳過當(dāng)前循環(huán)塊中的剩余語句,然后 繼續(xù) 進(jìn)行下一輪循環(huán)。
例 6.5 使用 continue 語句
#!/usr/bin/python
# Filename: continue.py
while True:
s = raw_input('Enter something : ')
if s == 'quit':
break
if len(s) < 3:
continue
print 'Input is of sufficient length'
# Do other kinds of processing here...
(源文件:code/continue.py)
輸出
$ python continue.py
Enter something : a
Enter something : 12
Enter something : abc
Input is of sufficient length
Enter something : quit
它如何工作
在這個(gè)程序中,我們從用戶處取得輸入,但是我們僅僅當(dāng)它們有至少 3 個(gè)字符長(zhǎng)的時(shí)候才處理它們。所以,我們使用內(nèi)建的 len 函數(shù)來取得長(zhǎng)度。如果長(zhǎng)度小于 3,我們將使用 continue 語句忽略塊中的剩余的語句。否則,這個(gè)循環(huán)中的剩余語句將被執(zhí)行,我們可以在這里做我們希望的任何處理。
注意,continue 語句對(duì)于 for 循環(huán)也有效。
我們已經(jīng)學(xué)習(xí)了如何使用三種控制流語句—— if、while 和 for 以及與它們相關(guān)的 break 和 continue 語句。它們是 Python 中最常用的部分,熟悉這些控制流是應(yīng)當(dāng)掌握的基本技能。
接下來,我們將學(xué)習(xí)如何創(chuàng)建和使用函數(shù)。