循環結構
應用場景
如果在程序中我們需要重複的執行某條或某些指令,例如用程序控制機器人踢足球,如果機器人持球而且還沒有進入射門範圍,那麼我們就要一直髮出讓機器人向球門方向奔跑的指令。
當然你可能已經注意到了,剛才的描述中不僅僅有需要重複的動作,還需要用到上一章講的分支結構。
再舉一個簡單的例子,我們要實現一個每隔1秒中在屏幕上打印一次"hello, world"並持續打印一個小時的程序,我們肯定不能夠直接把print('hello, world')這句代碼寫3600遍,如果真的要這樣做,那麼編程的工作就太無聊乏味了。
因此,我們還需要了解一下循環結構,有了循環結構我們就可以輕鬆的控制某件事或者某些事重複、重複、再重複的去執行。
在Python中構造循環結構有兩種做法,一種是for-in循環,一種是while循環。
for-in循環
如果明確的知道循環執行的次數或者要對一個容器進行迭代(後面會講到),那麼我們推薦使用for-in循環,例如下面代碼中計算1~100求和的結果。
<code>""" 用for循環實現1~100求和 """
sum =0
for
xin
range(101
): sum += x print(sum) /<code>
需要說明的是上面代碼中的range(101)可以用來構造一個從0到100的取值範圍,這樣就可以構造出一個整數的序列並用於循環中,例如:
- range(101)可以產生一個0到100的整數序列。
- range(1, 100)可以產生一個1到99的整數序列。
- range(1, 100, 2)可以產生一個1到99的奇數序列,其中2是步長,即數值序列的增量。
知道了這一點,我們可以用下面的代碼來實現1~100之間的偶數求和。
<code>""" 用for循環實現1~100之間的偶數求和 """
sum =0
for
xin
range(2
,101
,2
): sum += x print(sum) /<code>
也可以通過在循環中使用分支結構的方式來實現相同的功能,代碼如下所示。
<code>""" 用for循環實現1~100之間的偶數求和 """
sum =0
for
xin
range(1
,101
):if
x %2
==0
: sum += x print(sum) /<code>
while循環
如果要構造不知道具體循環次數的循環結構,我們推薦使用while循環。
while循環通過一個能夠產生或轉換出bool值的表達式來控制循環,表達式的值為True循環繼續,表達式的值為False循環結束。
下面我們通過一個“猜數字”的小遊戲(計算機出一個1~100之間的隨機數,人輸入自己猜的數字,計算機給出對應的提示信息,直到人猜出計算機出的數字)來看看如何使用while循環。
<code>""" 猜數字遊戲 計算機出一個1~100之間的隨機數由人來猜 計算機根據人猜的數字分別給出提示大一點/小一點/猜對了 """
import
random answer = random.randint(1
,100
) counter =0
while
True
: counter +=1
number = int(input('請輸入: '
))if
number < answer: print('大一點'
)elif
number > answer: print('小一點'
)else
: print('恭喜你猜對了!'
)break
print('你總共猜了%d次'
% counter)if
counter >7
: print('你的智商餘額明顯不足'
) /<code>
上面的代碼中使用了break關鍵字來提前終止循環,需要注意的是break只能終止它所在的那個循環,這一點在使用嵌套的循環結構(下面會講到)需要引起注意。
除了break之外,還有另一個關鍵字是continue,它可以用來放棄本次循環後續的代碼直接讓循環進入下一輪。
和分支結構一樣,循環結構也是可以嵌套的,也就是說在循環中還可以構造循環結構。
下面的例子演示瞭如何通過嵌套的循環來輸出一個九九乘法表。
<code>""" 輸出乘法口訣表(九九表) """
for
iin
range(1
,10
):for
jin
range(1
, i +1
): print('%d*%d=%d'
% (i, j, i * j), end='\t'
) print() /<code>
練習
練習1:輸入一個正整數判斷是不是素數。
提示:素數指的是隻能被1和自身整除的大於1的整數。
參考答案:
<code>""" 輸入一個正整數判斷它是不是素數 """
from
mathimport
sqrt num = int(input('請輸入一個正整數: '
)) end = int(sqrt(num)) is_prime =True
for
xin
range(2
, end +1
):if
num % x ==0
: is_prime =False
break
if
is_primeand
num !=1
: print('%d是素數'
% num)else
: print('%d不是素數'
% num) /<code>
練習2:輸入兩個正整數,計算它們的最大公約數和最小公倍數。
參考答案:
<code>""" 輸入兩個正整數計算它們的最大公約數和最小公倍數 """
x = int(input('x = '
)) y = int(input('y = '
))if
x > y: x, y = y, xfor
factorin
range(x,0
,-1
):if
x % factor ==0
and
y % factor ==0
: print('%d和%d的最大公約數是%d'
% (x, y, factor)) print('%d和%d的最小公倍數是%d'
% (x, y, x * y // factor))break
/<code>
練習3:打印如下所示的三角形圖案。
<code>*
*****
***
******
/<code>
<code>*
*****
***
******
/<code>
<code>*
***
*****
*****
*******
***
* /<code>
參考答案:
<code>""" 打印三角形圖案 """
row = int(input('請輸入行數: '
))for
iin
range(row):for
_in
range(i +1
): print('*'
, end=''
) print()for
iin
range(row):for
jin
range(row):if
j < row - i -1
: print(' '
, end=''
)else
: print('*'
, end=''
) print()for
iin
range(row):for
_in
range(row - i -1
): print(' '
, end=''
)for
_in
range(2
* i +1
): print('*'
, end=''
) print()/<code>