在平常開發中,咱們常常須要遍歷列表的全部元素,對每一個元素執行相同的操做。例如,在管理商場的蔬菜時候,須要給全部的蔬菜商品都打7折,並從新生成價格。當咱們須要對列表中的每一個元素都執行相同的操做時,可以使用Python中的for
循環。python
假設咱們有一個蔬菜名單,須要將其中每種蔬菜的名字都打印出來。爲此,咱們能夠採用元素下標的方式分別獲取名單中的每一個名字,但這種作法會致使多個問題。例如,若是名單很長,將包含大量重複的代碼。另外,每當名單的長度發生變化時,都必須修改代碼。經過使用for
循環,可以讓Python
去處理這些問題。 下面使用for循環來打印蔬菜單中的全部名字:git
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name) 複製代碼
這行代碼讓Python從列表vegetables
中取出一個名字,並將其存儲在變量name
中。最後,咱們讓Python打印前面存儲的變量name
中的名字。這樣,對於列表中的每一個名字,Python都將重複執行print(name)
代碼。你能夠這樣解讀這些代碼:對於列表vegetables
中的每種蔬菜,都將其名字打印出來。輸出很簡單,就是列表中全部蔬菜的姓名:程序員
potato
tomato
onion
複製代碼
循環這種概念很重要,由於它是讓計算機自動完成重複工做的常見方式之一。例如,在前面的代碼中使用的簡單循環中,Python將首先讀取其中的第一行代碼:編程
for name in vegetables: 複製代碼
這行代碼讓Python獲取列表vegetables
中的第一個值potato
,並將其存儲到變量name
中。接下來,Python讀取下一行代碼:app
print(name)
複製代碼
它讓Python打印vegetables
的值potato
。因爲該列表還包含其餘值,Python返回到循環的第一行:編程語言
for name in vegetables: 複製代碼
Python獲取列表中的下一個名字tomato
,並將其存儲到變量name
中,再執行下面這行代碼:函數
print(name)
複製代碼
Python再次打印變量vegetables
的值tomato
。 接下來,Python再次執行整個循環,對列表中的最後一個值onion
進行處理。 至此,列表中沒有其餘的值了,所以Python接着執行程序的下一行代碼。在這個示例中,for
循環後面沒有其餘的代碼,所以程序就此結束。 剛開始使用循環時須要牢記,對列表中的每一個元素,都將執行循環指定的步驟,而無論列表包含多少個元素。若是列表包含一百萬個元素,Python就重複執行指定的步驟一百萬次,且一般速度很是快。 另外,編寫for
循環時,對於用於存儲列表中每一個值的臨時變量,可指定任何名稱。好比說:學習
for dog in dogs: for cat in cats: for item in item_list: 複製代碼
這些寫法都是能夠的。ui
在for循環中,能夠獲取到每個元素,可對每一個元素執行任何操做。好比說咱們對每一種蔬菜都輸出一句話。spa
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name + ' is good !') 複製代碼
相比於前一個示例,惟一的不一樣是對於每種蔬菜,都打印了一條以其名字爲擡頭的消息。這個循環第一次迭代時,變量name
的值爲potato
,所以Python打印的第一條消息的擡頭爲potato
。第二次迭代時,消息的擡頭爲tomato
,而第三次迭代時,擡頭爲onion
。 下面的輸出代表,對於列表中的每種蔬菜,都打印了一條個性化消息:
potato is good ! tomato is good ! onion is good ! 複製代碼
在for循環中,想包含多少行代碼均可以。在代碼行for name in vegetables
後面,每一個縮進的代碼行都是循環的一部分,且將針對列表中的每一個值都執行一次。所以,可對列表中的每一個值執行任意次數的操做。 下面再添加一行代碼:
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name + ' is good !') print(name + ' is a vegetable!') 複製代碼
因爲兩條print
語句都縮進了,所以它們都將針對列表中的每位蔬菜都執行一次。輸出結果以下:
potato is good ! potato is a vegetable! tomato is good ! tomato is a vegetable! onion is good ! onion is a vegetable! 複製代碼
在for
循環中,想包含多少行代碼均可以。這種方式在開發過程當中頗有用。
Python根據縮進來判斷代碼行與前一個代碼行的關係。在前面的示例中,對每種蔬菜的輸出代碼行是for
循環的一部分,由於它們縮進了。Python經過使用縮進讓代碼更易讀。 簡單地說,它要求你使用縮進讓代碼整潔而結構清晰。在較長的Python程序中,你將看到縮進程度各不相同的代碼塊,這讓你對程序的組織結構有大體的認識。 當你開始使用縮進時,須要注意一些常見的縮進錯誤。 例如,有時候,程序員會將不須要縮進的代碼塊縮進,而對於必須縮進的代碼塊卻忘了縮進。經過查看這些錯誤示例,有助於咱們之後避開它們,以及在它們出如今程序中時進行修復。下面來看一些較爲常見的縮進錯誤。
對於位於for
語句後面且屬於循環組成部分的代碼行,必定要縮進。若是你忘記縮進,運行會直接報錯:
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name) 複製代碼
print
語句應縮進卻沒有縮進。Python沒有找到指望縮進的代碼塊時,會讓你知道哪行代碼有問題。
File "<stdin>", line 2 print(name) ^ IndentationError: expected an indented block 複製代碼
一般,將緊跟在for語句後面的代碼行縮進,可消除這種縮進錯誤。
有時候,循環可以運行而不會報告錯誤,但結果可能會出乎意料。試圖在循環中執行多項任務,卻忘記縮進其中的一些代碼行時,就會出現這種狀況。
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name + ' is good !') print(name + ' is a vegetable!') 複製代碼
第二個print
語句本來須要縮進,但Python發現for
語句後面有一行代碼是縮進的,所以它沒有報告錯誤。最終的結果是,對於列表中的每種蔬菜,都執行了第一條print
語句,由於它縮進了;而第二條print
語句沒有縮進,所以它只在循環結束後執行一次。因爲變量 name
的終值爲onion
,所以只有一條輸出了onion is a vegetable!
:
potato is good ! tomato is good ! onion is good ! onion is a vegetable! 複製代碼
這是一個邏輯錯誤。從語法上看,這些代碼是沒問題的,但因爲存在邏輯錯誤,結果並不符合預期。若是你預期某項操做將針對每一個列表元素都執行一次,但它卻只執行了一次,請肯定是否須要將一行或多行代碼縮進。
若是你不當心縮進了無需縮進的代碼行,一樣運行的時候也會報錯:
message = "Hello Python world!" print(message) 複製代碼
print
語句無需縮進,由於它並不屬於前一行代碼,運行的時候會幫咱們指出這種錯誤:
print(message)
^
IndentationError: unexpected indent
複製代碼
爲避免意外縮進錯誤,請只縮進須要縮進的代碼。在前面編寫的程序中,只有要在for
循環中對每一個元素執行的代碼就須要縮進。
若是咱們不當心縮進了應在循環結束後執行的代碼,這些代碼將針對每一個列表元素重複執行。 在有些狀況下,這可能致使Python報告語法錯誤,但在大多數狀況下,這隻會致使邏輯錯誤。例如:
vegetables = ['potato','tomato','onion'] for name in vegetables: print(name + ' is good !') print(name + ' is a vegetable!') ## 這一行代碼被縮進 print('There are three kinds of vegetables.') 複製代碼
那麼輸出就會變成如下這個樣子:
potato is good ! potato is a vegetable! There are three kinds of vegetables tomato is good ! tomato is a vegetable! There are three kinds of vegetables onion is good ! onion is a vegetable! There are three kinds of vegetables. 複製代碼
這也是一個邏輯錯誤。Python不知道你的本意,只要代碼符合語法,它就會運行。因此咱們應該時刻保持警戒,不要用錯了縮進。
for
語句末尾的冒號告訴Python,下一行是循環的第一行。
vegetables = ['potato','tomato','onion'] for name in vegetables print(name + ' is good !') 複製代碼
for name in vegetables ^ SyntaxError: invalid syntax 複製代碼
若是你不當心遺漏了冒號,如上所示,將致使語法錯誤,由於Python不知道你意欲何爲。這種錯誤雖然易於消除,但並不那麼容易發現。
Python函數range()
讓你可以輕鬆地生成一系列的數字。例如,能夠像下面這樣使用函數range()
來打印一系列的數字:
for value in range(1,5): print(value) 複製代碼
上述代碼好像應該打印數字1~5,但實際上它不會打印數字5:
1 2 3 4 複製代碼
在這個示例中,range()
只是打印數字14,這是你在編程語言中常常看到的差一行爲的結果。函數5,須要使用range()
讓Python從你指定的第一個值開始數,並在到達你指定的第二個值後中止,所以輸出不包含第二個值(這裏爲5)。 要打印數字1range(1,6)
:
for value in range(1,6): print(value) 複製代碼
這樣,輸出將從1開始,到5結束:
1 2 3 4 5 複製代碼
使用range()
時,若是輸出不符合預期,請嘗試將指定的值加1
或減1
。
要建立數字列表,可以使用函數list()
將range()
的結果直接轉換爲列表。若是將range()
做爲list()
的參數,輸出將爲一個數字列表。 在上面的示例中,咱們打印了一系列數字。要將這些數字轉換爲一個列表,可以使用list():
numbers = list(range(1,6)) print(numbers) 複製代碼
結果以下:
[1, 2, 3, 4, 5] 複製代碼
使用函數range()
時,還可指定步長。例如,下面的代碼打印1~10內的偶數:
even_numbers = list(range(2,11,2)) print(even_numbers) 複製代碼
在這個示例中,函數range()
從2開始數,而後不斷地加2,直到達到或超過終值(11),所以 輸出以下:
[2, 4, 6, 8, 10] 複製代碼
使用函數range()
幾乎可以建立任何須要的數字集,例如,如何建立一個列表,其中包含前10個整數(即1~10)的平方呢?在Python中,兩個星號**
表示乘方運算。下面的代碼演示如何將前10個整數的平方加入到一個列表中:
squares = []
for value in range(1,11): square = value**2 squares.append(square) print(squares) 複製代碼
首先,咱們建立了一個空列表;接下來,使用函數range()
讓Python遍歷1~10的值。在循環中,計算當前值的平方,並將結果存儲到變量square中。而後,將新計算獲得的平方值附加到列表squares
末尾。最後,循環結束後,打印列表squares
:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 複製代碼
有幾個專門用於處理數字列表的Python函數。例如,你能夠輕鬆地找出數字列表的最大值、最小值和總和:
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] ### 輸出最小值 print(min(digits)) ### 輸出最大值 print(max(digits)) ### 計算總和 print(sum(digits)) 0 9 45 複製代碼
列表解析將for
循環和建立新元素的代碼合併成一行,並自動附加新元素。下面的示例使用列表解析建立你在前面看到的平方數列表:
squares = [value**2 for value in range(1,11)] print(squares) 複製代碼
要使用這種語法,首先指定一個描述性的列表名,如squares
;而後,指定一個左方括號,並定義一個表達式,用於生成你要存儲到列表中的值。在這個示例中,表達式爲value**2
,它來計算平方值。接下來,編寫一個for循環,用於給表達式提供值,再加上右方括號。在這個示例中,for
循環爲for value in range(1,11)
,它將值1~10提供給表達式value**2
。請注意,這裏的for語句末尾沒有冒號。 結果與你在前面看到的平方數列表相同:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 複製代碼
要建立本身的列表解析,須要通過必定的練習,但可以熟練地建立常規列表後,你會發現這樣作是徹底值得的。當你以爲編寫三四行代碼來生成列表有點繁複時,就應考慮建立列表解析了。
在上面的內容中,咱們學習瞭如何訪問單個列表元素。接下來,咱們將學習如何處理列表的全部元素。咱們還能夠處理列表的部分元素——Python稱之爲切片。
要建立切片,可指定要使用的第一個元素和最後一個元素的索引。與函數range()
同樣,Python 在到達你指定的第二個索引前面的元素後中止。要輸出列表中的前三個元素,須要指定索引0~3, 這將輸出分別爲0、1和2的元素。 咱們仍是以蔬菜列表爲例:
vegetables = ['potato','tomato','onion','leek'] print(vegetables[0:3]) 複製代碼
上面的代碼打印該列表的一個切片,其中只包含三種蔬菜。輸出也是一個列表,其中包含前三種蔬菜:
['potato', 'tomato', 'onion'] 複製代碼
你能夠生成列表的任何子集,例如,若是你要提取列表的第2~4個元素,可將起始索引指定爲1,並將終止索引指定爲4:
vegetables = ['potato','tomato','onion','leek'] print(vegetables[1:4]) 複製代碼
這一次,切片始於tomato
,終於leek
:
['tomato', 'onion', 'leek'] 複製代碼
若是你沒有指定第一個索引,Python將自動從列表開頭開始:
vegetables = ['potato','tomato','onion','leek'] print(vegetables[:4]) 複製代碼
因爲沒有指定起始索引,Python從列表開頭開始提取:
['potato', 'tomato', 'onion', 'leek'] 複製代碼
要讓切片終止於列表末尾,也可以使用相似的語法。例如,若是要提取從第3個元素到列表末 尾的全部元素,可將起始索引指定爲2,並省略終止索引:
vegetables = ['potato','tomato','onion','leek'] print(vegetables[2:]) 複製代碼
Python將返回從第3個元素到列表末尾的全部元素:
['onion', 'leek'] 複製代碼
不管列表多長,這種語法都可以讓你輸出從特定位置到列表末尾的全部元素。前面咱們瞭解過,負數索引返回離列表末尾相應距離的元素,所以你能夠輸出列表末尾的任何切片。例如,若是你要輸出名單上的最後三種蔬菜,可以使用切片vegetables[-3:]
:
vegetables = ['potato','tomato','onion','leek'] print(vegetables[-3:]) ['tomato', 'onion', 'leek'] 複製代碼
若是要遍歷列表的部分元素,可在for循環中使用切片。在下面的示例中,咱們遍歷前三種蔬菜,並打印它們的名字:
vegetables = ['potato','tomato','onion','leek'] print("Here are the first three vegetable:") for name in vegetables[:3]: print(name.title()) 複製代碼
輸出結果:
Here are the first three vegetable:
Potato
Tomato
Onion
複製代碼
在不少狀況下,切片都頗有用。例如,編寫遊戲時,你能夠在玩家退出遊戲時將其最終得分加入到一個列表中。而後,爲獲取該玩家的三個最高得分,你能夠將該列表按降序排列,再建立一個只包含前三個得分的切片。處理數據時,可以使用切片來進行批量處理;編寫Web應用程序時,可以使用切片來分頁顯示信息,並在每頁顯示數量合適的信息。
咱們常常須要根據既有列表建立全新的列表。下面來介紹複製列表的工做原理,以及複製列表可提供極大幫助。 要複製列表,可建立一個包含整個列表的切片,方法是同時省略起始索引和終止索引([:]
)。 這讓Python建立一個始於第一個元素,終止於最後一個元素的切片,即複製整個列表。 例如,假設有一個列表,其中包含你最喜歡的四種食品,而你還想建立另外一個列表,在其中包含一位朋友喜歡的全部食品。不過,你喜歡的食品,這位朋友都喜歡,所以你能夠經過複製來建立這個列表:
my_foods = ['pizza', 'falafel', 'carrot cake'] friend_foods = my_foods[:] print("My favorite foods are:") print(my_foods) print("\nMy friend's favorite foods are:") print(friend_foods) 複製代碼
咱們首先建立了一個名爲my_foods
的食品列表,而後建立了一個名爲friend_foods
的新列表。咱們在不指定任何索引的狀況下從列表my_foods
中提取一個切片,從而建立了這個列表的副本,再將該副本存儲到變量friend_foods
中。打印每一個列表後,咱們發現它們包含的食品相同:
My favorite foods are:
['pizza', 'falafel', 'carrot cake'] My friend's favorite foods are: ['pizza', 'falafel', 'carrot cake'] 複製代碼
爲了覈實咱們確實有兩個列表,下面在每一個列表中都添加一種食品,並覈實每一個列表都記錄了相應人員喜歡的食品:
my_foods = ['pizza', 'falafel', 'carrot cake'] 5 friend_foods = my_foods[:] my_foods.append('cannoli') friend_foods.append('ice cream') print("My favorite foods are:") print(my_foods) print("\nMy friend's favorite foods are:") print(friend_foods) 複製代碼
與前一個示例同樣,咱們首先將my_foods
的元素複製到新列表friend_foods
中。接下來,在每一個列表中都添加一種食品:在列表my_foods
中添加cannoli
,而在friend_foods
中添加ice cream
。最後,打印這兩個列表,覈實這兩種食品包含在正確的列表中。
My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli'] My friend's favorite foods are: ['pizza', 'falafel', 'carrot cake', 'ice cream'] 複製代碼
上面的輸出代表,cannoli
包含在你喜歡的食品列表中,而ice cream
沒有。ice cream
包含在你朋友喜歡的食品列表中,而cannoli
沒有。假若咱們只是簡單地將my_foods
賦給friend_foods
,就不能獲得兩個列表。例如,下例演示了在不使用切片的狀況下複製列表的狀況:
my_foods = ['pizza', 'falafel', 'carrot cake'] #這行不通 friend_foods = my_foods my_foods.append('cannoli') friend_foods.append('ice cream') print("My favorite foods are:") print(my_foods) print("\nMy friend's favorite foods are:") print(friend_foods) 複製代碼
這裏將my_foods
賦給friend_foods
,而不是將my_foods
的副本存儲到friend_foods
。這種語法其實是讓Python將新變量friend_foods
關聯到包含在my_foods
中的列表,所以這兩個變量都指向同一個列表。鑑於此,當咱們將cannoli
添加到my_foods
中時,它也將出如今friend_food
中;一樣,雖然ice cream
好像只被加入到了friend_foods
中,但它也將出如今這兩個列表中。 輸出代表,兩個列表是相同的,這並不是咱們想要的結果:
My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream'] My friend's favorite foods are: ['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream'] 複製代碼
交流基地:6303907338-1 動物:想出至少三種有共同特徵的動物,將這些動物的名稱存儲在一個列表中,再使用for循環將每種動物的名稱都打印出來。修改這個程序,使其針對每種動物都打印一個句子,如"A dog would make a great pet"。在程序末尾添加一行代碼,指出這些動物的共同之處,如打印諸如"Any of these animals would make a great pet!"這樣的句子。 8-2 數到 20:使用一個 for 循環打印數字 1~ 20(含)。 8-3 計算 1~ 1000000 的總和:建立一個列表,其中包含數字1~ 1000000,再使用min()和max()覈實該列表確實是從1開始,到1000000 結束的。另外,對這個列表調用函數sum(),體會一下Python將一百萬個數字相加須要多長時間。 8-4 3的倍數:建立一個列表,其中包含 3~30 內能被3整除的數字;再使用一個for循環將這個列表中的數字都打印出來。 8-5 切片:修改8-1的代碼,在末尾添加幾行代碼,以完成以下任務。 打印消息"The first three items in the list are:",再使用切片來打印列表的前三個元素。打印消息"Three items from the middle of the list are:",再使用切片來打印列表中間的三個元素。打印消息"The last three items in the list are:",再使用切片來打印列表末尾的三個元素。