文章目錄
- 遍歷列表
- 深入的了解循環
- 在for循環中執行更多的操作
- 在for循環后結束執行一些操作
- 避免縮進錯誤
- 忘記縮進
- 忘記縮進額外的代碼行
- 不必要的縮進
- 循環后不必要的縮進
- 遺漏了冒號
- 小插曲
- 創建數值列表
- 使用函數range()
- 使用range()創建數字列表
- 對數字列表執行簡單的統計計算
- 列表解析
- 小插曲
- 使用列表的一部分
- 切片
- 遍歷切片
- 復制列表
- 小插曲
- 元組
- 定義元組
- 遍歷元組中的所有值
- 修改元組變量
- 小插曲
- 設置代碼格式
- 格式指南
- 縮進
- 行長
- 空行
- 小插曲
遍歷列表
通俗易懂地來說,遍歷列表就是把你列表中的每個元素循環一遍。
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
)
運行程序得:
alice
david
carolina
深入的了解循環
下面我們來深入了解一下這些代碼
for
magician
in
magicians
:
這行代碼讓Python獲取列表magicians中的第一個值(‘alice’),并將其存儲到變量magician中。接下來,Python讀取下一行代碼:
print
(
magician
)
它讓Python打印magician的值——依然是’alice’。鑒于該列表還包含其他值,Python返回到循環的第一行:
for
magician
in
magicians
:
Python獲取列表中的下一個名字——‘david’,并將其存儲到變量magician中,再執行下面這行代碼:
print
(
magician
)
Python再次打印變量magician的值——當前為’david’。接下來,Python再次執行整個循環,對列表中的最后一個值——'carolina’進行處理。至此,列表中沒有其他的值了,因此Python接著執行程序的下一行代碼。在這個示例中,for循環后面沒有其他的代碼,因此程序就此結束。
編寫for循環時,對于用于存儲列表中每個值的臨時變量,可指定任何名稱。然而,選擇描述單個列表元素的有意義的名稱大有幫助
例如:
for
cat
in
cats
:
for
dog
in
dogs
:
for
item
in
listofitems
:
在for循環中執行更多的操作
用上面的循環語句來操作,對每一個元素都說一句話
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
.
title
(
)
+
", that was a great trick!"
)
運行結果得:
Alice
,
that was a great trick!
David
,
that was a great trick!
Carolina
,
that was a great trick!
其實在后面我們還可以添加自己想說的話
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
.
title
(
)
+
", that was a great trick!"
)
print
(
"I can't wait to see your next trick, "
+
magician
.
title
(
)
+
".\n"
)
運行結果得:
Alice
,
that was a great trick!
I can't wait to see your
next
trick
,
Alice
.
David
,
that was a great trick!
I can't wait to see your
next
trick
,
David
.
Carolina
,
that was a great trick!
I can't wait to see your
next
trick
,
Carolina
.
在for循環中,其實我們想包含多少行代碼都可以
在for循環后結束執行一些操作
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
.
title
(
)
+
", that was a great trick!"
)
print
(
"I can't wait to see your next trick, "
+
magician
.
title
(
)
+
".\n"
)
print
(
"Thank you, everyone. That was a great magic show!"
)
此處在第6列,沒有縮進,那么我們來看看結果怎么樣
運行結果:
Alice
,
that was a great trick!
I can't wait to see your
next
trick
,
Alice
.
David
,
that was a great trick!
I can't wait to see your
next
trick
,
David
.
Carolina
,
that was a great trick!
I can't wait to see your
next
trick
,
Carolina
.
Thank you
,
everyone
.
That was a great magic show!
結果很顯然,沒有縮進的話就只執行了一遍
使用for循環處理數據是一種對數據集執行整體操作的不錯的方式。例如,你可能使用for循環來初始化游戲——遍歷角色列表,將每個角色都顯示到屏幕上;再在循環后面添加一個不縮進的代碼塊,在屏幕上繪制所有角色后顯示一個Play Now按鈕。
避免縮進錯誤
- Python通過使用縮進讓代碼更易讀;簡單地說,它要求你使用縮進讓代碼整潔而結構清晰。
- 當你開始編寫必須正確縮進的代碼時,需要注意一些常見的縮進錯誤。
忘記縮進
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
)
運行結果顯示報錯
print
(
magician
)
^
IndentationError
:
expected an indented block
通常將緊跟在for語句后面的代碼行縮進可消除這種縮進
忘記縮進額外的代碼行
有時候,循環能夠運行而不會報告錯誤,但結果可能會出乎意料。試圖在循環中執行多項任務,卻忘記縮進其中的一些代碼行時,就會出現這種情況。
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
.
title
(
)
+
", that was a great trick!"
)
print
(
"I can't wait to see your next trick, "
+
magician
.
title
(
)
+
".\n"
)
第4行原本要縮進的代碼沒有縮進,但是python不會這么覺得,python只發現for語句后面有一行代碼是縮進的,因此它沒有報告錯誤,只是你的代碼沒有縮進而已,所以執行效果如下:
Alice
,
that was a great trick!
David
,
that was a great trick!
Carolina
,
that was a great trick!
I can't wait to see your
next
trick
,
Carolina
.
不必要的縮進
message
=
"Hello Python world!"
print
(
message
)
運行結果顯示報錯
File
"hello_world.py"
,
line
2
print
(
message
)
^
IndentationError
:
unexpected indent
在這里我們要注意:print語句無需縮進,因為它并不屬于前一行代碼,只有在for循環中對每個元素執行的代碼需要縮進。
循環后不必要的縮進
如果你不小心縮進了應在循環結束后執行的代碼,這些代碼將針對每個列表元素重復執行。
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
:
print
(
magician
.
title
(
)
+
", that was a great trick!"
)
print
(
"I can't wait to see your next trick, "
+
magician
.
title
(
)
+
".\n"
)
print
(
"Thank you everyone, that was a great magic show!"
)
運行結果:
Alice
,
that was a great trick!
I can't wait to see your
next
trick
,
Alice
.
Thank you everyone
,
that was a great magic show!
David
,
that was a great trick!
I can't wait to see your
next
trick
,
David
.
Thank you everyone
,
that was a great magic show!
Carolina
,
that was a great trick!
I can't wait to see your
next
trick
,
Carolina
.
Thank you everyone
,
that was a great magic show!
由于最后一行代碼行被縮進,所以它執行了3遍
Python不知道你的本意,只要代碼符合語法,它就會運行。如果原本只應執行一次的操作執行了多次,請確定你是否不應該縮進執行該操作的代碼。
遺漏了冒號
magicians
=
[
'alice'
,
'david'
,
'carolina'
]
for
magician
in
magicians
print
(
magician
)
在這里,for語句后面遺漏了冒號,導致報錯
如果你不小心遺漏了冒號,將導致語法錯誤,因為Python不知道你意欲何為。這種錯誤雖然易于消除,但并不那么容易發現。程序員為找出這樣的單字符錯誤,花費的時間多得令人驚訝。這樣的錯誤之所以難以發現,是因為通常在我們的意料之外。
小插曲
現在我們來動手試試吧,練習一下剛才所學的東西
1.想出至少三種你喜歡的比薩,將其名稱存儲在一個列表中,再使用 for循環將每種比薩的名稱都打印出來。
- 修改這個 for 循環,使其打印包含比薩名稱的句子,而不僅僅是比薩的名稱。對于每種比薩,都顯示一行輸出,如“I like pepperoni pizza”。
- 在程序末尾添加一行代碼,它不在 for 循環中,指出你有多喜歡比薩。輸出應包含針對每種比薩的消息,還有一個總結性句子,如“I really love pizza!”。
2.想出至少三種有共同特征的動物,將這些動物的名稱存儲在一個列表中,再使用 for 循環將每種動物的名稱都打印出來。
- 修改這個程序,使其針對每種動物都打印一個句子,如“A dog would make a greatpet”。
- 在程序末尾添加一行代碼,指出這些動物的共同之處,如打印諸如“Any of theseanimals would make a great pet!”這樣的句子。
創建數值列表
在數據可視化中,處理的幾乎都是由數字(如溫度、距離、人口數量、經度和緯度等)組成的集合
使用函數range()
range()
能夠輕松地生成一系列的數字
for
value
in
range
(
1
,
5
)
:
print
(
value
)
運行程序得:
1
2
3
4
range()只是打印數字1~4,這是你在編程語言中經常看到的差一行為的結果。函數range()讓Python從你指定的第一個值開始數,并在到達你指定的第二個值后停止,因此輸出不包含第二個值
使用range()創建數字列表
要創建數字列表,可使用函數list()將range()的結果直接轉換為列表。
numbers
=
list
(
range
(
1
,
6
)
)
print
(
numbers
)
運行程序得:
[
1
,
2
,
3
,
4
,
5
]
使用函數range()時,還可指定步長
even_numbers
=
list
(
range
(
2
,
11
,
2
)
)
print
(
even_numbers
)
運行程序得:
[
2
,
4
,
6
,
8
,
10
]
下面我們來分析一下這句代碼的意思
list(range(2,11,2))
函數range()從2開始數,然后不斷地加2,直到達到或超過終值(11)
使用函數range()幾乎能夠創建任何需要的數字集,例如平方:
(在Python中,兩個星號(**)表示乘方運算)
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
]
如果我們想要代碼更加簡潔可以這樣,可不使用臨時變量square
squares
.
append
(
value
**
2
)
print
(
squares
)
對數字列表執行簡單的統計計算
有幾個專門用于處理數字列表的Python函數。
>>
>
digits
=
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
]
>>
>
min
(
digits
)
0
>>
>
max
(
digits
)
9
>>
>
sum
(
digits
)
45
列表解析
squares
=
[
value
**
2
for
value
in
range
(
1
,
11
)
]
print
(
squares
)
要使用這種語法首先指定一個描述性的列表名
然后,指定一個左方括號,并定義一個表達式,用于生成你要存儲到列表中的值
接下來,編寫一個for循環,用于給表達式提供值,再加上右方括號
打印列表squares
[
1
,
4
,
9
,
16
,
25
,
36
,
49
,
64
,
81
,
100
]
小插曲
現在我們來動手試試吧,練習一下剛才所學的東西
1.使用一個 for 循環打印數字 1~20(含20)
2.創建一個列表,其中包含數字 1~1 000 000,再使用一個 for 循環將這些數字打印出來(如果輸出的時間太長,按 Ctrl + C 停止輸出,或關閉輸出窗口)
3.創建一個列表,其中包含數字 1~1 000 000,再使用min()和 max()核實該列表確實是從 1 開始,到 1 000 000 結束的。另外,對這個列表調用函數 sum(),看看 Python 將一百萬個數字相加需要多長時間
4.通過給函數 range()指定第三個參數來創建一個列表,其中包含 1~20 的奇數;再使用一個 for 循環將這些數字都打印出來
5.創建一個列表,其中包含 3~30 內能被 3 整除的數字;再使用一個 for循環將這個列表中的數字都打印出來
6.將同一個數字乘三次稱為立方。例如,在 Python 中,2 的立方用 2**3表示。請創建一個列表,其中包含前 10 個整數(即 1~10)的立方,再使用一個 for 循環將這些立方數都打印出來
7.使用列表解析生成一個列表,其中包含前 10 個整數的立方
使用列表的一部分
切片
要創建切片,可指定要使用的第一個元素和最后一個元素的索引。與函數range()一樣,Python在到達你指定的第二個索引前面的元素后停止。要輸出列表中的前三個元素,需要指定索引0~3,這將輸出分別為0、1和2的元素。
players
=
[
'charles'
,
'martina'
,
'michael'
,
'florence'
,
'eli'
]
print
(
players
[
0
:
3
]
)
運行結果:
[
'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
:
]
)
遍歷切片
如果要遍歷列表的部分元素,可在for循環中使用切片。
players
=
[
'charles'
,
'martina'
,
'michael'
,
'florence'
,
'eli'
]
print
(
"Here are the first three players on my team:"
)
for
player
in
players
[
:
3
]
:
print
(
laer
.
title
(
)
)
運行程序得:
Here are the first three players on my team
:
Charles
Martina
Michael
復制列表
要復制列表,可創建一個包含整個列表的切片,方法是同時省略起始索引和終止索引([:])。這讓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 favorite foods are
:
[
'pizza'
,
'falafel'
,
'carrot cake'
]
My friend's favorite foods are
:
[
'pizza'
,
'falafel'
,
'carrot cake'
]
小插曲
現在我們來動手試試吧,練習一下剛才所學的東西
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:”,再使用切片來打印列表末尾的三個元素。
2.在你為完成 第一個小插曲的第一題 而編寫的程序中,創建比薩列表的副本,并將其存儲到變量 friend_pizzas 中,再完成如下任務。
- 在原來的比薩列表中添加一種比薩。
- 在列表 friend_pizzas 中添加另一種比薩。
- 核實你有兩個不同的列表。為此,打印消息“My favorite pizzas are:”,再使用一個 for 循環來打印第一個列表;打印消息“My friend’s favorite pizzas are:”,再使用一個 for 循環來打印第二個列表。核實新增的比薩被添加到了正確的列表中。
元組
列表非常適合用于存儲在程序運行期間可能變化的數據集。列表是可以修改的,這對處理網站的用戶列表或游戲中的角色列表至關重要。然而,有時候你需要創建一系列不可修改的元素,元組可以滿足這種需求。Python將不能修改的值稱為不可變的,而不可變的列表被稱為元組。
定義元組
元組看起來猶如列表,但使用圓括號而不是方括號來標識。定義元組后,就可以使用索引來訪問其元素,就像訪問列表元素一樣
dimensions
=
(
200
,
50
)
print
(
dimensions
[
0
]
)
print
(
dimensions
[
1
]
)
我們首先定義了元組dimensions,為此我們使用了圓括號而不是方括
```python
200
50
下面來嘗試修改元組dimensions中的一個元素
dimensions
=
(
200
,
50
)
dimensions
[
0
]
=
250
這時候python返回來一個錯誤的信息
Traceback
(
most recent call last
)
:
File
"dimensions.py"
,
line
3
,
in
<
module
>
dimensions
[
0
]
=
250
TypeError
:
'tuple'
object
does
not
support item assignment
遍歷元組中的所有值
像列表一樣,也可以使用for循環來遍歷元組中的所有值
dimensions
=
(
200
,
50
)
for
dimension
in
dimensions
:
print
(
dimension
)
運行程序得:
200
50
修改元組變量
雖然不能修改元組的元素,但可以給存儲元組的變量賦值。
dimensions
=
(
200
,
50
)
print
(
"Original dimensions:"
)
for
dimension
in
dimensions
:
print
(
dimension
)
dimensions
=
(
400
,
100
)
print
(
"\nModified dimensions:"
)
for
dimension
in
dimensions
:
print
(
dimension
)
運行程序得:
Original dimensions
:
200
50
Modified dimensions
:
400
100
相比于列表,元組是更簡單的數據結構。如果需要存儲的一組值在程序的整個生命周期內都不變,可使用元組。
小插曲
現在我們來動手試試吧,練習一下剛才所學的東西
1.有一家自助式餐館,只提供五種簡單的食品。請想出五種簡單的食品,并將其存儲在一個元組中。
- 使用一個 for 循環將該餐館提供的五種食品都打印出來。
- 嘗試修改其中的一個元素,核實 Python 確實會拒絕你這樣做。
- 餐館調整了菜單,替換了它提供的其中兩種食品。請編寫一個這樣的代碼塊:給元組變量賦值,并使用一個 for 循環將新元組的每個元素都打印出來。
設置代碼格式
隨著你編寫的程序越來越長,有必要了解一些代碼格式設置約定。請花時間讓你的代碼盡可能易于閱讀;讓代碼易于閱讀有助于你掌握程序是做什么的,也可以幫助他人理解你編寫的代碼。
格式指南
若要提出Python語言修改建議,需要編寫Python改進提案(Python Enhancement Proposal,PEP)。PEP 8是最古老的PEP之一,它向Python程序員提供了代碼格式設置指南。PEP 8的篇幅很長,但大都與復雜的編碼結構相關。
縮進
PEP 8建議每級縮進都使用四個空格,這既可提高可讀性,又留下了足夠的多級縮進空間。
行長
很多Python程序員都建議每行不超過80字符
在大多數計算機中,終端窗口每行只能容納79字符
PEP 8還建議注釋的行長都不超過72字符
PEP 8中有關行長的指南并非不可逾越的紅線,有些小組將最大行長設置為99字符
空行
要將程序的不同部分分開,可使用空行。你應該使用空行來組織程序文件,但也不能濫用
空行不會影響代碼的運行,但會影響代碼的可讀性
小插曲
現在我們來動手試試吧,練習一下剛才所學的東西
1.請訪問 https://python.org/dev/peps/pep-0008/,閱讀 PEP 8 格式設置指南。當前,這些指南適用的不多,但你可以大致瀏覽一下
2.從本章編寫的程序中選擇三個,根據 PEP 8 指南對它們進行修改。
- 每級縮進都使用四個空格。對你使用的文本編輯器進行設置,使其在你按 Tab鍵時都插入四個空格;如果你還沒有這樣做,現在就去做吧
-
每行都不要超過 80 字符。對你使用的編輯器進行設置,使其在第 80 個字符處顯
示一條垂直參考線。 - 不要在程序文件中過多地使用空行。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
