目錄
4:操作列表
4.1 遍歷整個列表
4.1.1 深入地研究循環(huán)
4.1.2 在 for 循環(huán)中執(zhí)行更多的操作
4.1.3 在 for 循環(huán)結(jié)束后執(zhí)行一些操作
4.2 避免縮進(jìn)錯誤
4.2.1 忘記縮進(jìn)
4.2.2 忘記縮進(jìn)額外的代碼行
4.2.3 不必要的縮進(jìn)
4.2.4 循環(huán)后不必要的縮進(jìn)
往期快速傳送門??(在文章最后):
4:操作列表
4.1 遍歷整個列表
你經(jīng)常需要遍歷列表的所有元素,對每個元素執(zhí)行相同的操作。例如,在游戲中,可能需要 將每個界面元素平移相同的距離;對于包含數(shù)字的列表,可能需要對每個元素執(zhí)行相同的統(tǒng)計運 算;在網(wǎng)站中,可能需要顯示文章列表中的每個標(biāo)題。需要對列表中的每個元素都執(zhí)行相同的操 作時,可使用Python中的for循環(huán)。
假設(shè)我們有一個魔術(shù)師名單,需要將其中每個魔術(shù)師的名字都打印出來。為此,我們可以分 別獲取名單中的每個名字,但這種做法會導(dǎo)致多個問題。例如,如果名單很長,將包含大量重復(fù) 的代碼。另外,每當(dāng)名單的長度發(fā)生變化時,都必須修改代碼。通過使用for循環(huán),可讓Python 去處理這些問題。 下面使用for循環(huán)來打印魔術(shù)師名單中的所有名字:
magicians.py
1 magicians = ['alice', 'david', 'carolina']
2 for magician in magicians:
3 print(magician)
首先,我們像第3章那樣定義了一個列表(見1)。接下來,我們定義了一個for循環(huán)(見2);這行代碼讓Python從列表magicians中取出一個名字,并將其存儲在變量magician中。最后,我們 讓Python打印前面存儲到變量magician中的名字(見3)。這樣,對于列表中的每個名字,Python 都將重復(fù)執(zhí)行2處和3處的代碼行。你可以這樣解讀這些代碼:對于列表magicians中的每位魔術(shù) 師,都將其名字打印出來。輸出很簡單,就是列表中所有的姓名
alice
david
carolina
4.1.1 深入地研究循環(huán)
循環(huán)這種概念很重要,因為它是讓計算機自動完成重復(fù)工作的常見方式之一。例如,在前面 的magicians.py中使用的簡單循環(huán)中,Python將首先讀取其中的第一行代碼:
for magician in magicians:
這行代碼讓Python獲取列表magicians中的第一個值('alice'),并將其存儲到變量magician 中。接下來,Python讀取下一行代碼:
print(magician)
它讓Python打印magician的值——依然是'alice'。鑒于該列表還包含其他值,Python返回到 循環(huán)的第一行:
for magician in magicians:
Python獲取列表中的下一個名字——'david',并將其存儲到變量magician中,再執(zhí)行下面這 行代碼:
print(magician)
Python再次打印變量magician的值——當(dāng)前為'david'。接下來,Python再次執(zhí)行整個循環(huán), 對列表中的最后一個值——'carolina'進(jìn)行處理。至此,列表中沒有其他的值了,因此Python接 著執(zhí)行程序的下一行代碼。在這個示例中,for循環(huán)后面沒有其他的代碼,因此程序就此結(jié)束。
剛開始使用循環(huán)時請牢記,對列表中的每個元素,都將執(zhí)行循環(huán)指定的步驟,而不管列表包 含多少個元素。如果列表包含一百萬個元素,Python就重復(fù)執(zhí)行指定的步驟一百萬次,且通常速 度非???。
另外,編寫for循環(huán)時,對于用于存儲列表中每個值的臨時變量,可指定任何名稱。然而, 選擇描述單個列表元素的有意義的名稱大有幫助。例如,對于小貓列表、小狗列表和一般性列表, 像下面這樣編寫for循環(huán)的第一行代碼是不錯的選擇:
for cat in cats:
for dog in dogs:
for item in list_of_items:
這些命名約定有助于你明白for循環(huán)中將對每個元素執(zhí)行的操作。使用單數(shù)和復(fù)數(shù)式名稱, 可幫助你判斷代碼段處理的是單個列表元素還是整個列表。
4.1.2 在 for 循環(huán)中執(zhí)行更多的操作
在for循環(huán)中,可對每個元素執(zhí)行任何操作。下面來擴展前面的示例,對于每位魔術(shù)師,都 打印一條消息,指出他的表演太精彩了。
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
1 print(magician.title() + ", that was a great trick!")
相比于前一個示例,唯一的不同是對于每位魔術(shù)師,都打印了一條以其名字為抬頭的消息(見 1)。這個循環(huán)第一次迭代時,變量magician的值為'alice',因此Python打印的第一條消息的抬 頭為'Alice'。第二次迭代時,消息的抬頭為'David',而第三次迭代時,抬頭為'Carolina'。 下面的輸出表明,對于列表中的每位魔術(shù)師,都打印了一條個性化消息:
Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!
在for循環(huán)中,想包含多少行代碼都可以。在代碼行for magician in magicians后面,每個 縮進(jìn)的代碼行都是循環(huán)的一部分,且將針對列表中的每個值都執(zhí)行一次。因此,可對列表中的每 個值執(zhí)行任意次數(shù)的操作。
下面再添加一行代碼,告訴每位魔術(shù)師,我們期待他的下一次表演:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician.title() + ", that was a great trick!")
1 print("I can't wait to see your next trick, " + magician.title() + ".\n")
由于兩條print語句都縮進(jìn)了,因此它們都將針對列表中的每位魔術(shù)師執(zhí)行一次。第二條 print語句中的換行符"\n"(見1)在每次迭代結(jié)束后都插入一個空行,從而整潔地將針對各位魔 術(shù)師的消息編組:
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循環(huán)中,想包含多少行代碼都可以。實際上,你會發(fā)現(xiàn)使用for循環(huán)對每個元素執(zhí)行眾 多不同的操作很有用。
4.1.3 在 for 循環(huán)結(jié)束后執(zhí)行一些操作
for循環(huán)結(jié)束后再怎么做呢?通常,你需要提供總結(jié)性輸出或接著執(zhí)行程序必須完成的其他 任務(wù)。
在for循環(huán)后面,沒有縮進(jìn)的代碼都只執(zhí)行一次,而不會重復(fù)執(zhí)行。下面來打印一條向全體 魔術(shù)師致謝的消息,感謝他們的精彩表演。想要在打印給各位魔術(shù)師的消息后面打印一條給全體 魔術(shù)師的致謝消息,需要將相應(yīng)的代碼放在for循環(huán)后面,且不縮進(jìn):
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")
1 print("Thank you, everyone. That was a great magic show!")
你在前面看到了,開頭兩條print語句針對列表中每位魔術(shù)師重復(fù)執(zhí)行。然而,由于第三條 print語句沒有縮進(jìn),因此只執(zhí)行一次:
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循環(huán)處理數(shù)據(jù)是一種對數(shù)據(jù)集執(zhí)行整體操作的不錯的方式。例如,你可能使用for循 環(huán)來初始化游戲——遍歷角色列表,將每個角色都顯示到屏幕上;再在循環(huán)后面添加一個不縮進(jìn) 的代碼塊,在屏幕上繪制所有角色后顯示一個Play Now按鈕。
4.2 避免縮進(jìn)錯誤
Python根據(jù)縮進(jìn)來判斷代碼行與前一個代碼行的關(guān)系。在前面的示例中,向各位魔術(shù)師顯示 消息的代碼行是for循環(huán)的一部分,因為它們縮進(jìn)了。Python通過使用縮進(jìn)讓代碼更易讀;簡單 地說,它要求你使用縮進(jìn)讓代碼整潔而結(jié)構(gòu)清晰。在較長的Python程序中,你將看到縮進(jìn)程度各不相同的代碼塊,這讓你對程序的組織結(jié)構(gòu)有大致的認(rèn)識。
當(dāng)你開始編寫必須正確縮進(jìn)的代碼時,需要注意一些常見的縮進(jìn)錯誤。例如,有時候,程序 員會將不需要縮進(jìn)的代碼塊縮進(jìn),而對于必須縮進(jìn)的代碼塊卻忘了縮進(jìn)。通過查看這樣的錯誤示 例,有助于你以后避開它們,以及在它們出現(xiàn)在程序中時進(jìn)行修復(fù)。
下面來看一些較為常見的縮進(jìn)錯誤。
4.2.1 忘記縮進(jìn)
對于位于for語句后面且屬于循環(huán)組成部分的代碼行,一定要縮進(jìn)。如果你忘記縮進(jìn),Python 會提醒你:
magicians.py
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
1 print(magician)
print語句(見?)應(yīng)縮進(jìn)卻沒有縮進(jìn)。Python沒有找到期望縮進(jìn)的代碼塊時,會讓你知道哪 行代碼有問題。
File "magicians.py", line 3
print(magician)
^
IndentationError: expected an indented block
通常,將緊跟在for語句后面的代碼行縮進(jìn),可消除這種縮進(jìn)錯誤。
4.2.2 忘記縮進(jìn)額外的代碼行
有時候,循環(huán)能夠運行而不會報告錯誤,但結(jié)果可能會出乎意料。試圖在循環(huán)中執(zhí)行多項任 務(wù),卻忘記縮進(jìn)其中的一些代碼行時,就會出現(xiàn)這種情況。 例如,如果忘記縮進(jìn)循環(huán)中的第2行代碼(它告訴每位魔術(shù)師,我們期待他的下一次表演), 就會出現(xiàn)這種情況:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician.title() + ", that was a great trick!")
1 print("I can't wait to see your next trick, " + magician.title() + ".\n")
第二條print語句(見1)原本需要縮進(jìn),但Python發(fā)現(xiàn)for語句后面有一行代碼是縮進(jìn)的, 因此它沒有報告錯誤。最終的結(jié)果是,對于列表中的每位魔術(shù)師,都執(zhí)行了第一條print語句, 因為它縮進(jìn)了;而第二條print語句沒有縮進(jìn),因此它只在循環(huán)結(jié)束后執(zhí)行一次。由于變量 magician的終值為'carolina',因此只有她收到了消息“l(fā)ooking forward to the next trick”:
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.
這是一個邏輯錯誤。從語法上看,這些Python代碼是合法的,但由于存在邏輯錯誤,結(jié)果并 不符合預(yù)期。如果你預(yù)期某項操作將針對每個列表元素都執(zhí)行一次,但它卻只執(zhí)行了一次,請確 定是否需要將一行或多行代碼縮進(jìn)。
4.2.3 不必要的縮進(jìn)
如果你不小心縮進(jìn)了無需縮進(jìn)的代碼行,Python將指出這一點:
hello_world.py
message = "Hello Python world!"
1 print(message)
print語句(見?)無需縮進(jìn),因為它并不屬于前一行代碼,因此Python將指出這種錯誤:
File "hello_world.py", line 2
print(message)
^
IndentationError: unexpected indent
為避免意外縮進(jìn)錯誤,請只縮進(jìn)需要縮進(jìn)的代碼。在前面編寫的程序中,只有要在for循環(huán) 中對每個元素執(zhí)行的代碼需要縮進(jìn)。
4.2.4 循環(huán)后不必要的縮進(jìn)
如果你不小心縮進(jìn)了應(yīng)在循環(huán)結(jié)束后執(zhí)行的代碼,這些代碼將針對每個列表元素重復(fù)執(zhí)行。 在有些情況下,這可能導(dǎo)致Python報告語法錯誤,但在大多數(shù)情況下,這只會導(dǎo)致邏輯錯誤。 例如,如果不小心縮進(jìn)了感謝全體魔術(shù)師精彩表演的代碼行,結(jié)果將如何呢?
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")
1 print("Thank you everyone, that was a great magic show!")
由于1處的代碼行被縮進(jìn),它將針對列表中的每位魔術(shù)師執(zhí)行一次,如2所示
Alice, that was a great trick!
I can't wait to see your next trick, Alice.
2 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.
2 Thank you everyone, that was a great magic show!
這也是一個邏輯錯誤,與4.2.2節(jié)的錯誤類似。Python不知道你的本意,只要代碼符合語法, 它就會運行。如果原本只應(yīng)執(zhí)行一次的操作執(zhí)行了多次,請確定你是否不應(yīng)該縮進(jìn)執(zhí)行該操作的 代碼。
Python:核心知識點整理大全1-筆記-CSDN博客
Python:核心知識點整理大全2-筆記-CSDN博客
Python:核心知識點整理大全3-筆記-CSDN博客
Python:核心知識點整理大全4-筆記-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-754365.html
Python:核心知識點整理大全5-筆記-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-754365.html
往期快速傳送門??(在文章最后):
到了這里,關(guān)于關(guān)于“Python”的核心知識點整理大全6的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!