[15] Python循環語句(二)
1. 概述
今天我們繼續來看循環語句,主要介紹賦值運算符、無限循環和for循環語句。
- 計算機編程的原理簡要介紹
- 集成開發環境PyCharm
- 變數名、數字、字元串、列表
- 句式、注釋
- 輸入和輸出
- 條件判斷語句
- 循環語句
- 各類數據結構
- 函數
- 模塊和引入
2. 賦值運算符
我們都知道賦值運算符,也就是單個等號,比如,
c = a + bn
意思是把a和b相加後得到的值賦給c。在循環中,特別是while裡面,我們需要常常更新控制變數,比如最基本的,
i = i + 1n
將變數i增加1,並且賦值給自己以更新該變數所存儲的值,其實在大部分語言中,包括Python,我們有其他的賦值運算符能讓代碼更簡潔:
i += 1n
這行代碼和i = i + 1是等價的、沒有區別的,「+=」號可以直接讓代碼中少寫一個變數,變得更簡潔,同理,
m -= 3 相當於 m = m - 3nn *= y 相當於 n = n * ynw /= x + y 相當於 w = w / (x + y)np %= 7 相當於 p = p % 7nq //= p 相當於 q = q // pnt **= -1 相當於 t = t ** (-1)n
如果賦值運算符後面是個公式,那麼就像第三行「w /= x + y「一樣,我們先計算右邊的x+y,把其作為一個整體,算出值後,再用w除以計算出來的和,最後賦值回w以更新w的值。
3. 無限循環
如果代碼很長,你的循環裡面邏輯演算法十分複雜,我們很可能會忘記更新控制變數,這時候就會產生無限循環。來看下面的代碼:
i = 0nwhile i < 5:n print("In the loop...")nprint("Goodbye!")n
我們可以看到,這裡的控制變數「i」用於等於0,也就是說while後面的條件永遠為True,這個循環將會永遠進行下去,你的屏幕上會不停地顯示一行又一行的「In the loop...」,根本停不下來,而最後的Goodbye永遠也不會被輸出。唯一能終止程序的方法就是手動了,點擊PyCharm的停止按鈕或者control+C來外力終止程序。
無限循環有時候會有用處但是有用的場所很少,一般來說,我們在寫程序時,必須要避免無限循環的產生,記住要更新循環的控制變數。
4. for循環語句
循環的另一大語法魔王則是for循環語句。Python的循環比較特殊,通常比如在C語言中,for依舊遵循while的基本三原則,控制變數初始化、條件判斷和變數更新,如下:
#include <stdio.h>nint main(){n int ind, loop_num;n for(ind = 0; ind < 10; ind++){n loop_num = ind + 1;n printf("This is loop number %d.n", loop_num);n }n}n
大家只需要看for這一欄,大部分語言的for和C的for長得很像,可以說for是一個簡化版的while循環,但是Python很有趣,其for循環必須長這樣:
for <variable> in <sequence>:n #code heren
Python的for是直接對序列中每一個元素進行讀取處理,並不需要控制變數或者條件判斷(可以這麼理解,但是深層次地編譯還是有的,只是在表面上我們並不需要想那麼多),如果一個序列到頭了,循環也就自動結束了。我們來先看一個例子:
student_list = [Alice, Bob, Cat, David, Evan, Frank, Gary, ]nnfor student in student_list:n print(We are now looking at + student)n
最後結果為:
We are now looking at AlicenWe are now looking at BobnWe are now looking at CatnWe are now looking at DavidnWe are now looking at EvannWe are now looking at FranknWe are now looking at Garyn
在這個簡短的循環中,我們可以看到這for循環會從列表第一個元素開始,每次循環前進一個,比如第一次我們看Alice,第二次我們就看Bob,第三次是Cat,以此類推,直到列表到頭,循環也跟著結束。而在每一次循環的時候,該循環所指向的元素會被賦給student這個變數(也就是緊跟在for後面那個單詞),我們可以直接拿來用,不需要再和while一樣用下標到列表裡去找。由此也可見,用for可以很有效地避免無限循環的出現。
5. range函數
簡單介紹一下range函數,range是一個內置函數,可以直接拿來用,range產生的結果是一個特殊的序列,所屬一個獨特類型叫range,可以轉換為列表,但是一般沒有必要。
range(10) #從0開始一個一個數到9nrange(3, 10) #從3開始一個一個數到9nrange(10, 20, 2) #從10開始每隔2個數到20前一個,也就是18nrange(20, 10, -2) #從20開始每隔2個倒著數到10前一個,也就是12n
可以看到range和我們之前講的切片很像,如果寫著從a到b,range就會從a開始一個一個數,最後停在b-1這裡;如果只有一個數字,就像range(10)一樣,就是默認從0開始數,數到括弧裡面那個數字減1,也就是9;如果是三個數字range(a, b, n),則可以進行跳躍我們可以每隔n個數字數,數到比b小的最大的一個數為止。
如果我們要看結果,我們必須要進行一點小操作,range產生的結果雖然是一個序列但是並不能直觀地輸出,我們需要把其轉換為列表:
print(list(range(10))) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]nprint(list(range(3, 10))) #[3, 4, 5, 6, 7, 8, 9]nprint(list(range(10, 20, 2))) #[10, 12, 14, 16, 18]nprint(list(range(20, 10, -2))) #[20, 18, 16, 14, 12]n
最後注意,range是數整數的,默認是一個一個順序數,除非有第三個參數在裡面,range不能細分成小數,比如range(0, 2, 0.1)這樣的操作是不行的。
有時候我們在for循環里會使用下標,但是for...in...這種結構經常讓想使用下標的人抓狂,我們有兩種方法,第一種是手動添加:
student_list = [Alice, Bob, Cat, David, Evan, Frank, Gary, ]nnind = 0nfor student in student_list:n print(-- Student ID: {} --.format(ind))n print(We are now looking at + student)n ind += 1n
或者我們可以用len函數來數處有幾個學生,結合range:
student_list = [Alice, Bob, Cat, David, Evan, Frank, Gary, ]nnfor ind in range(len(student_list)):n print(-- Student ID: {} --.format(ind))n print(We are now looking at + student_list[ind])n
我們可以看出用range後,ind就會跟著for自動增加。range產生的是一個序列,從0數到學生數-1,也就是0到6,正好照顧到了列表所有7個學生的下標,而ind其實是在走range序列,由於range自己幫我們列好了行走路線,我們就不用像第一段代碼一樣手動初始化加更新變數了。
不過用了range,我們有了下標數字卻不像之前一樣直接能拿元素來用了,我們需要跟while一樣到列表裡去找元素,也就是「student_list[ind]」,有得也有失。
range函數的意義在於,for循環太方便了,我們都用不著數下標了,但是就怕有時候我們需要這些數字,我們就不得不稍微退一步。
6. while和for的選擇與互換
單單說選擇while還是for的話,簡要來說,如果循環條件是一些不穩定的、奇奇怪怪的條件的,那還是用while比較直接;如果循環有一個序列,則for比較簡便。
不過如果我們有一個穩定的序列、判斷條件也不奇怪,很多情況下while和for是能互換的,也就是我們想不想把控制變數單獨拎出來,這有時候還是很看程序員自己的口味。
來看一個互換的例子,
# Given a list of students namenstudent_list = [Alice, Bob, Cat, David, Evan, Frank, Gary, ]nn# Initialize the counter which indicates indexnind = 0nn# Length of the list indicates the number of studentsntotal = len(student_list)nn# Loop through the listnwhile ind < total:n # Get the current students namen # We will look at this specific student at this loopn student = student_list[ind]n n # Determine if the student passes the coursen if int(input("Please type the score for {}: ".format(student))) >= 90:n print("PASSED: {}.".format(student))n else:n print("FAILED: {}.".format(student))n n # Increase the counter by 1 and prepare for the next studentn ind += 1n
這是我們之前講的一個例子,換成for之後就長這樣:
# Given a list of students namenstudent_list = [Alice, Bob, Cat, David, Evan, Frank, Gary, ]nn# Loop through the list with the each studentnfor student in student_list:n # Determine if the student passes the coursen if int(input("Please type the score for {}: ".format(student))) >= 90:n print("PASSED: {}.".format(student))n else:n print("FAILED: {}.".format(student))n
由於我們不需要下標,而for又能自動走列表,我們把很多關於下標、長度(數數有關的)代碼及注釋都刪了,整個代碼就簡潔了不少。如果我們想使用下標,for加上range也非常簡潔。
最後聲明一下,這兩天實在太忙了,來不及更新,不過貌似雜事都處理完了,應該可以回到正常的更新頻率了,下一篇我們介紹break和continue以及如何在Python中實現do...while語句。
推薦閱讀:
※odoo10 開發學習筆記2—簡單的請假模塊
※Scrapy爬蟲框架教程(二)-- 爬取豆瓣電影TOP250
※9、續7--文章的編寫頁面(略)