迴圈是計算機程式中經常用到的流程。試想一下,如果我們有一萬個資料要處理,每個資料處理的流程都一模一樣,如果我們用順序流程就要把處理流程重複寫一萬遍,是不是很累?而用for迴圈就簡單多了。
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')
猜猜這段程式碼的輸出吧,如果沒有把握就親自執行一下就明白了。
總結
迴圈是程式中另外一種重要的流程控制,在批次處理資料、伺服器程式中大量使用。
練習:
- 寫一段程式碼,實現while中的break和continue。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***