控制流
我們之前接觸到的Python程序都是自上向下運行的。如何改變這種自上向下的運行流呢?比如,你想讓程序看情況選擇功能,就像在早晨打印早晨好
,在中午打印中午好
。
你可能已經猜到了,控制流可以。在Python中有三種控制流- if、for和while。
if語句
if語句用于選擇分支。如果條件為真,那么運行if下面的語句塊,否則運行else下面的語句塊。
栗子(保存至if.py
):
number = 23
guess = int(input('輸入一個整數:'))
if guess == number:
#猜中數字的語句塊
print('祝賀,你猜對了')
elif guess < number:
#猜的數字太小的語句塊
print('哎,數字太小了')
else:
#猜的數字太大的語句塊
print('哎,數字太大了')
輸出:
$ python if.py
輸入一個整數:10
哎,數字太小了
它是怎么運作的呢?
在這個程序中,用戶輸入猜的數字,然后檢查分支的條件,如果條件為真,那么下面的語句塊將會被執行。
內置函數input()接收字符串參數輸入一個整數:
,然后等待用戶的輸入。如果用戶輸入了某些東西,并按下了Enter
鍵,那么input()函數將會返回用戶輸入的內容(字符串)。如果想要得到整數,那么就需要將字符串轉換成整數,這就是int()的作用了。
接下來,我們比較用戶猜的數字與謎底。如果相等,會打印成功的信息。注意,要使用縮進 - Python通過縮進可以知道代碼塊歸屬的語句。所以在Python中,縮進尤為重要。保持縮進的一致是Python的金條玉律。
語句后面有一個冒號 - 用來告知Python,下面有一個代碼塊屬于該條語句。
然后,檢查猜的數是否小于謎底,如果是真,告知用戶他輸入的數太小了。下一次他在輸入的時候,就會選擇大一點的數字。elif是else if的縮寫。當然elif后面也需要有個冒號,并且下面有屬于它的代碼塊。
你也可以在if語句里嵌套if語句。記住,elif
和else
是可選的,也就是說如果不需要,你可以不寫。一個簡短的if語句如下:
if True:
print('Yes, it\'s true!')
while語句
while語句在條件為真的時候,會重復執行一段代碼塊。while語句屬于循環語句的一種。while語句可以有else分支。
栗子(保存至while.py
):
number = 23
running = True
while running:
guess = int(input('輸入一個整數:'))
if guess == number:
print('祝賀,你猜對了,謎底就是它')
running = False
elif guess < number:
print('嗯,你猜的數有點小了')
else:
print('嗯,你猜的數有點大了')
else:
print('猜數游戲結束。')
輸出:
$ python while.py
輸入一個整數: 10
嗯,你猜的數有點小了
輸入一個整數: 23
祝賀,你猜對了,謎底就是它
猜數游戲結束
它是怎么運作的?
這個程序依然是個猜數的游戲,但是有個改進:用戶可以不停地猜數,直到他猜中為止。所以,不需要像上個章節一樣重復地運行程序。
我們把條件語句放進while循環里,并初始化running
變量為真。首先發現條件running
為真,然后處理while語句的代碼塊。執行代碼塊完后,再查看條件running
,如果為真,再次執行while代碼塊,否之,將會執行else語句的代碼塊。
else代碼塊在while條件為假的時候執行,有可能剛進入循環,while條件時它就為假。如果有else分支,除非用break
語句跳出循環,否則它肯定會執行。
True
和False
是布爾值。
給C/C++程序猿的提示:
記得while循環有else分支。
for循環
for...in
語句也是一種循環語句 - 對一個序列對象進行迭代,也就是循環從序列中取元素。在后面的章節中會詳細介紹序列。你現在只要把序列當作一系列元素的集合就可以了。
栗子(保存至for.py
):
for i in range(1, 5):
print(i)
else:
print('for循環結束。')
輸出:
1
2
3
4
for循環結束
它是怎么運作的呢?
上面的程序,先是打印一個數字序列 - 用內置的range()
函數生成一個數字序列。
向range()
傳入兩個整數參數n、m,然后range()
返回一個從n開始,直到m結束(不包括m)的數字序列。如果我們向range()
傳入第三個整數參數(叫做步長),會返回一個等差序列,舉個栗子range(1,5,2)
, 返回[1,3]。
注意:
range()
每次只會生成一個數字,如果你需要一個數字鏈表。調用list()
接收range()
對象。比如說,list(range(5))會生成一個[0, 1, 2, 3, 4]的鏈表。鏈表會在章節《數據結構》中闡述。
for循環在序列上迭代 -for i in range(1, 5)
與for i in [1, 2, 3, 4]
等同,每次取出一個數賦值給i,然后執行for語句的代碼塊,本例中,代碼塊就是打印i的值。
記住,else分支是可選的,當for循環執行完畢后,會執行它。但是出現break語句時,else分支不會被執行,因為break語句會跳出循環結構。
記住,for ...in
循環能夠迭代任意的序列。本例中,我們循環迭代了用內置函數range()
生成的一個數字序列,一般情況下,任何序列,或序列對象都可以被迭代。
對C/C++程序猿的提示:
Python的for循環與C/C++的for循環有很多不一樣的地方。注意,Python中的for循環與C#的foreach類似。Python中的for循環更簡單,更容易記住不是嗎?當然減少了犯錯誤的概率。
break語句
break語句用于跳出循環語句,即使循環條件為真或沒有迭代完一個序列,也會停止循環語句的執行。
記住,如果跳出循環語句,那么循環語句的else分支也不會被執行。
栗子(保存至break.py
):
while True:
s = input('隨便敲點啥:')
if s == '退出':
break
print('你輸入的字數:', len(s))
print('程序結束。')
輸出:
$ python break.py
隨便敲點啥:繞冰涼
你輸入的字數:3
隨便敲點啥:退出
程序結束。
它是怎么運作的呢?
上面的程序循環讓用戶輸入,然后打印用戶輸入的字數。如果用戶輸入了退出
,將會執行break語句跳出循環。
內置的len()
函數可以返回字符串的長度。
記住,break語句也可以用在for循環里。
continue語句
continue語句用來跳過循環里下面的代碼塊,然后進入下一次循環。
栗子(保存至continue.py
):
while True:
s = input('隨便敲點啥:')
if s == '退出':
break
if len(s) < 3:
continue
print('你輸入的字數夠多。')
輸出:
$ python continue.py
隨便敲點啥:所以
隨便敲點啥:就你事多
你輸入的字數夠多。
隨便敲點啥:退出
它是怎么運作的呢?
上面的程序,先是接收用戶的輸入,但是只有在字數大于或等于3個的時候,才進行處理。這里我們用內置函數len()
獲取長度,如果長度小于3,用continue語句跳過下面的代碼塊;否則執行下面的代碼塊,也就是打印你輸入的字數夠多。
的信息。
注意,continue語句同樣可以用在for循環里。
總結
我們學習了控制流的三種結構語句 - if語句、while語句、for語句和配合循環使用的break、continue語句。它們經常被用到,因此盡量熟悉它們吧。
下面我們將學習創建、使用函數。