目錄
4.2.5 遺漏了冒號
4.3 創建數值列表
4.3.1 使用函數 range()
4.3.2 使用 range()創建數字列表
結果如下:
4.3.3 對數字列表執行簡單的統計計算
4.3.4 列表解析
4.4 使用列表的一部分
4.4.1 切片
4.4.2 遍歷切片
4.4.3 復制列表
4.2.5 遺漏了冒號
for語句末尾的冒號告訴Python,下一行是循環的第一行
magicians = ['alice', 'david', 'carolina']
1 for magician in magiciansprint(magician)
如果你不小心遺漏了冒號,如1所示,將導致語法錯誤,因為Python不知道你意欲何為。這 種錯誤雖然易于消除,但并不那么容易發現。程序員為找出這樣的單字符錯誤,花費的時間多得 令人驚訝。這樣的錯誤之所以難以發現,是因為通常在我們的意料之外。
4.3 創建數值列表
需要存儲一組數字的原因有很多,例如,在游戲中,需要跟蹤每個角色的位置,還可能需要 跟蹤玩家的幾個最高得分。在數據可視化中,處理的幾乎都是由數字(如溫度、距離、人口數量、 經度和緯度等)組成的集合。
列表非常適合用于存儲數字集合,而Python提供了很多工具,可幫助你高效地處理數字列表。 明白如何有效地使用這些工具后,即便列表包含數百萬個元素,你編寫的代碼也能運行得很好。
4.3.1 使用函數 range()
Python函數range()讓你能夠輕松地生成一系列的數字。例如,可以像下面這樣使用函數 range()來打印一系列的數字:
numbers.py
for value in range(1,5):print(value)
上述代碼好像應該打印數字1~5,但實際上它不會打印數字5:
1
2
3
4
在這個示例中,range()只是打印數字1~4,這是你在編程語言中經常看到的差一行為的結果。 函數range()讓Python從你指定的第一個值開始數,并在到達你指定的第二個值后停止,因此輸出 不包含第二個值(這里為5)。
要打印數字1~5,需要使用range(1,6):
1
2
3
4
5
使用range()時,如果輸出不符合預期,請嘗試將指定的值加1或減1。
4.3.2 使用 range()創建數字列表
要創建數字列表,可使用函數list()將range()的結果直接轉換為列表。如果將range()作為list()的參數,輸出將為一個數字列表。 在前一節的示例中,我們打印了一系列數字。要將這些數字轉換為一個列表,可使用list():
numbers = list(range(1,6))
print(numbers)
結果如下:
[1, 2, 3, 4, 5]
使用函數range()時,還可指定步長。例如,下面的代碼打印1~10內的偶數:
even_numbers.py
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.py
1squares = []
2 for value in range(1,11):
3 square = value**2
4 squares.append(square)
5 print(squares)
首先,我們創建了一個空列表(見1);接下來,使用函數range()讓Python遍歷1~10的值(見 2)。在循環中,計算當前值的平方,并將結果存儲到變量square中(見3)。然后,將新計算得 到的平方值附加到列表squares末尾(見4)。最后,循環結束后,打印列表squares(見5):
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
為讓這些代碼更簡潔,可不使用臨時變量square,而直接將每個計算得到的值附加到列表 末尾:
squares = []
for value in range(1,11):
1 squares.append(value**2)
print(squares)
1處的代碼與squares.py中2處和3處的代碼等效。在循環中,計算每個值的平方,并立即將 結果附加到列表squares的末尾。
創建更復雜的列表時,可使用上述兩種方法中的任何一種。有時候,使用臨時變量會讓代碼 更易讀;而在其他情況下,這樣做只會讓代碼無謂地變長。你首先應該考慮的是,編寫清晰易懂 且能完成所需功能的代碼;等到審核代碼時,再考慮采用更高效的方法。
4.3.3 對數字列表執行簡單的統計計算
有幾個專門用于處理數字列表的Python函數。例如,你可以輕松地找出數字列表的最大值、 最小值和總和:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45
注意 出于版面考慮,本節使用的數字列表都很短,但這里介紹的知識也適用于包含數百萬個 數字的列表。
4.3.4 列表解析
前面介紹的生成列表squares的方式包含三四行代碼,而列表解析讓你只需編寫一行代碼就 能生成這樣的列表。列表解析將for循環和創建新元素的代碼合并成一行,并自動附加新元素。 面向初學者的書籍并非都會介紹列表解析,這里之所以介紹列表解析,是因為等你開始閱讀他人 編寫的代碼時,很可能會遇到它們。
下面的示例使用列表解析創建你在前面看到的平方數列表:
squares.py
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]
要創建自己的列表解析,需要經過一定的練習,但能夠熟練地創建常規列表后,你會發現這 樣做是完全值得的。當你覺得編寫三四行代碼來生成列表有點繁復時,就應考慮創建列表解析了。
4.4 使用列表的一部分
在第3章中,你學習了如何訪問單個列表元素。在本章中,你一直在學習如何處理列表的所 有元素。你還可以處理列表的部分元素——Python稱之為切片。
4.4.1 切片
要創建切片,可指定要使用的第一個元素和最后一個元素的索引。與函數range()一樣,Python 在到達你指定的第二個索引前面的元素后停止。要輸出列表中的前三個元素,需要指定索引0~3, 這將輸出分別為0、1和2的元素。 下面的示例處理的是一個運動隊成員列表:
players.py
players = ['charles', 'martina', 'michael', 'florence', 'eli']
1 print(players[0:3])
1處的代碼打印該列表的一個切片,其中只包含三名隊員。輸出也是一個列表,其中包含前 三名隊員:
['charles', 'martina', 'michael']
你可以生成列表的任何子集,例如,如果你要提取列表的第2~4個元素,可將起始索引指定 為1,并將終止索引指定為4:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
這一次,切片始于'marita',終于'florence':
['martina', 'michael', 'florence']
如果你沒有指定第一個索引,Python將自動從列表開頭開始:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
由于沒有指定起始索引,Python從列表開頭開始提取:
['charles', 'martina', 'michael', 'florence']
要讓切片終止于列表末尾,也可使用類似的語法。例如,如果要提取從第3個元素到列表末 尾的所有元素,可將起始索引指定為2,并省略終止索引:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])
Python將返回從第3個元素到列表末尾的所有元素:
['michael', 'florence', 'eli']
無論列表多長,這種語法都能夠讓你輸出從特定位置到列表末尾的所有元素。本書前面說過, 負數索引返回離列表末尾相應距離的元素,因此你可以輸出列表末尾的任何切片。例如,如果你 要輸出名單上的最后三名隊員,可使用切片players[-3:]:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])
上述代碼打印最后三名隊員的名字,即便隊員名單的長度發生變化,也依然如此。
4.4.2 遍歷切片
如果要遍歷列表的部分元素,可在for循環中使用切片。在下面的示例中,我們遍歷前三名 隊員,并打印他們的名字:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
1 for player in players[:3]:print(player.title())
?處的代碼沒有遍歷整個隊員列表,而只遍歷前三名隊員:
Here are the first three players on my team:
Charles
Martina
Michael
在很多情況下,切片都很有用。例如,編寫游戲時,你可以在玩家退出游戲時將其最終得分 加入到一個列表中。然后,為獲取該玩家的三個最高得分,你可以將該列表按降序排列,再創建 一個只包含前三個得分的切片。處理數據時,可使用切片來進行批量處理;編寫Web應用程序時, 可使用切片來分頁顯示信息,并在每頁顯示數量合適的信息。
4.4.3 復制列表
你經常需要根據既有列表創建全新的列表。下面來介紹復制列表的工作原理,以及復制列表 可提供極大幫助的一種情形。
要復制列表,可創建一個包含整個列表的切片,方法是同時省略起始索引和終止索引([:])。 這讓Python創建一個始于第一個元素,終止于最后一個元素的切片,即復制整個列表。
例如,假設有一個列表,其中包含你最喜歡的四種食品,而你還想創建另一個列表,在其中 包含一位朋友喜歡的所有食品。不過,你喜歡的食品,這位朋友都喜歡,因此你可以通過復制來 創建這個列表:
foods.py
1 my_foods = ['pizza', 'falafel', 'carrot cake']
2 friend_foods = my_foods[:]
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
我們首先創建了一個名為my_foods的食品列表(見1),然后創建了一個名為friend_foods的 新列表(見2)。我們在不指定任何索引的情況下從列表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']
1 friend_foods = my_foods[:]
2 my_foods.append('cannoli')
3 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中(見1)。接下 來,在每個列表中都添加一種食品:在列表my_foods中添加'cannoli'(見2),而在friend_foods 中添加'ice cream'(見3)。最后,打印這兩個列表,核實這兩種食品包含在正確的列表中。
My favorite foods are:
4 ['pizza', 'falafel', 'carrot cake', 'cannoli']
My friend's favorite foods are:
5 ['pizza', 'falafel', 'carrot cake', 'ice cream']
4處的輸出表明,'cannoli'包含在你喜歡的食品列表中,而'ice cream'沒有。5處的輸出 表明,'ice cream'包含在你朋友喜歡的食品列表中,而'cannoli'沒有。倘若我們只是簡單地將 my_foods賦給friend_foods,就不能得到兩個列表。例如,下例演示了在不使用切片的情況下復 制列表的情況:
my_foods = ['pizza', 'falafel', 'carrot cake']
#這行不通
1 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)
Python:核心知識點整理大全1-筆記-CSDN博客
Python:核心知識點整理大全2-筆記-CSDN博客
Python:核心知識點整理大全3-筆記-CSDN博客
Python:核心知識點整理大全4-筆記-CSDN博客
Python:核心知識點整理大全5-筆記-CSDN博客
Python:核心知識點整理大全6-筆記-CSDN博客