Python的流程控制:迴圈

veelion發表於2019-01-05

迴圈是計算機程式中經常用到的流程。試想一下,如果我們有一萬個資料要處理,每個資料處理的流程都一模一樣,如果我們用順序流程就要把處理流程重複寫一萬遍,是不是很累?而用for迴圈就簡單多了。

python迴圈

for迴圈

for迴圈其實前面講遍歷列表、字典的時候我們就已經遇到了,它的語法很簡單,就是for item in items

下面我們看一下for迴圈:

numbers = [1,2,3,4,5,6]
for n in numbers:
    x = n * n
    print(x)

for迴圈用來遍歷一個序列是最常用的,有時候並沒有給我們一個現成的序列要遍歷,只是我們的程式需要迴圈特定的次數,這時候我們就用到了range()函式。在Python 3.6中,range並不是一個內建函式,而是一個型別,但是在Python 2.7中它是一個內建函式:

In [134]: range?
Init signature: range(self, /, *args, **kwargs)
Docstring:     
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
Type:           type
Subclasses:     

In [135]: type(range)
Out[135]: type

In [136]: len?
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

In [137]: range(4)
Out[137]: range(0, 4)

上面是Python 3.6中從IPython看到的range的說明,它的Type是type,而不像內建函式len的Type是builtin_function_or_method。

雖然range的型別從Python 2中的內建函式變成了3.6中的type,但並不影響我們對它的使用。假如我們想列印 hi 特定次數,
比如3次,下面就是range的經典用法:

for i in range(3):
    print('hi')

這裡的i並沒有在迴圈中被使用,為了不讓程式碼規範檢查程式(如pylint)報錯“有未使用的變數”,我們可以用下劃線_替代

range()引數個數的不同也代表了生成不同的序列:

  • range(5) 生成從0-4共5個整數序列
  • range(1,5) 生成從1開始到5為止但不包含5的整數序列,即1-4
  • range(1,5,2) 從1開始到5為止,每次步長為2的整數序列,即:[1,3]

比如,求10以內偶數的和:

sum = 0

for i in range(0, 10, 2):
    sum += i
print(sum)

while 迴圈

while是另外一種形式的迴圈,它的語法如下所示:


while condition: do something

示例程式碼:

a = 3
while a > 0:
    print(a)
    a -= 1

上面程式碼迴圈3次,每次會對條件變數a減1,當while發現a不大於0時就會終止迴圈。

如果在迴圈裡面,我們不對a進行改變,會發生什麼?沒錯,會出現死迴圈!你的CPU使用率立馬爆滿100%,滿屏不斷重新整理列印3。死迴圈是程式設計中的大忌,一定要小心哦。

break和continue

break是終止(或叫做“跳出”)整個迴圈;continue是跳過本次迴圈後面的程式碼去執行迴圈的下一次。要理解這兄弟倆,還是看程式碼吧:

for i in range(10):
    if i < 3:
        continue
    if i > 7:
        break
    prirnt(i)

這段程式碼的意思是,
如果i<3就continue到下一次的迴圈,continue後面的程式碼不會被執行,所以0,1,2就不會被列印;
如果i>7就break整個迴圈,即跳出迴圈,7後面的8,9也自然不會被列印;
不滿足上面兩個情況的3,4,5,6,7就被列印了。
所以這段程式碼的輸出是:

3
4
5
6
7

以上例子是for迴圈的,但break和continue同樣適用於while迴圈。小猿們可以在本節結束後,練習一下while迴圈中的break和continue

迴圈的else

這應該是Python獨有的特性吧,迴圈也可以有else。當迴圈正常結束(沒有break)後,就會執行else程式碼段:

for i in range(3):
    print(i)
else:
    print('loop ends')

for i in range(3):
    if i > 1:
        break
    print(i)
else:
    print('loop ends')

猜猜這段程式碼的輸出吧,如果沒有把握就親自執行一下就明白了。

總結

迴圈是程式中另外一種重要的流程控制,在批量處理資料、伺服器程式中大量使用。

練習:

  1. 寫一段程式碼,實現while中的break和continue。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章