第四章
1叛溢、遍歷整個列表
當你需要整潔干凈地輸出一個列表中的所有元素,就必須對每個元素執(zhí)行相同的操作。此時的代碼中就會含有大量重復的代碼擅这,而當列表發(fā)生一些改變,又需要修改大量的代碼景鼠,顯然這樣的方法工作效率低下仲翎。所以有必要使用Python中的for循環(huán)來解決這些問題,簡化代碼铛漓,提高效率溯香。
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
# 輸出:
alice
david
carolina
2、for循環(huán)
循環(huán)就是讓計算機自動完成重復性的工作浓恶。進入循環(huán)操作后玫坛,計算機會自動執(zhí)行相應的操作,直到列表的最后一個元素也執(zhí)行完后包晰,就會自動退出循環(huán)湿镀,繼續(xù)往下執(zhí)行。
在for循環(huán)中伐憾,可對每個元素執(zhí)行任何的操作勉痴,添加多少行的代碼都可以,計算機會針對列表中的每個元素都執(zhí)行一次树肃。
在for循環(huán)的后面蒸矛,沒有縮進的代碼都只執(zhí)行一次。因為只有縮進了的代碼才隸屬于for循環(huán)。沒有縮進代表該行代碼不屬于for循環(huán)里面雏掠,所以只會執(zhí)行一次廓脆。
Python是根據(jù)縮進來判斷代碼行與前一個代碼行的關系。
3磁玉、常見的縮進錯誤
對于位于for語句后面且屬于循環(huán)組成部分的代碼行停忿,一定要縮進。如果你忘記縮進蚊伞,Python會提醒你席赂。
當循環(huán)能夠運行而且不會報告錯誤,但結果卻出乎意料时迫,此時颅停,就有可能是你忘記縮進其中的某些代碼行。
如果你將無需縮進的代碼行縮進了掠拳,Python也會提醒你癞揉。
如果不小心縮進了應在循環(huán)結束后執(zhí)行的代碼,這些代碼會針對每個列表元素重復執(zhí)行溺欧。
for語句末尾的冒號告訴Python喊熟,下一行是循環(huán)的第一行。如果你不小心遺漏了冒號姐刁,將導致語法錯誤芥牌,因為Python不知道你意欲何為。
因此聂使,在編寫代碼時壁拉,盡量避免不該出現(xiàn)的錯誤,因為某些錯誤會花費大量的時間才能找出柏靶。
4弃理、創(chuàng)建數(shù)值列表
(1)使用函數(shù)range()
range()函數(shù)可以生成一系列的數(shù)字,如:
for value in range(1, 5):
print(value)
# 輸出:
1
2
3
4
上述例子中用到的range()函數(shù)屎蜓,它的第一個參數(shù)表示生成的序列從1開始痘昌,到5之前結束,不包括5梆靖。
(2)使用range()創(chuàng)建數(shù)字列表
可使用函數(shù)list()將range()的結果直接轉(zhuǎn)換為列表控汉。
numbers = list(range(1, 5))
print(numbers)
# 輸出:
[1, 2, 3, 4]
使用range()函數(shù)時,還可以指定步長返吻。如:
numbers = list(range(2, 11, 2))
print(numbers)
# 輸出:
[2, 4, 6, 8, 10]
range()函數(shù)括號中的第三個參數(shù)為指定的步長,若不寫第三個參數(shù)乎婿,默認為1测僵。
(3)對數(shù)字列表執(zhí)行簡單的統(tǒng)計運算
digits = [4, 2, 5, 0, 7, 1, 9, 3]
print(min(digits))
print(max(digits))
print(sum(digits))
# 輸出:
0
9
31
(4)列表解析
列表解析將for循環(huán)和創(chuàng)建新元素的代碼合并成一行,并自動附加新元素。如:
squares = [value**2 for value in range(1, 11)]
print(squares)
# 輸出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要使用這種語法捍靠,首先指定一個描述性的列表名沐旨,然后添加一個方括號,并在方括號中定義一個表達式榨婆,用于生成你要存儲到列表中的值磁携。在上述例子中,表達式為value**2良风,用于計算平方值谊迄。而后的for循環(huán)用于給表達式提供值,注意這里的for語句末尾不需要加上冒號烟央。
5统诺、使用列表的一部分
(1)切片
要創(chuàng)建切片,可指定要使用的第一個元素和最后一個元素的索引疑俭。
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
print(fruits[1:4])
# 輸出:
['banana', 'orange', 'pear']
與函數(shù)range()一樣粮呢,Python會在第二個索引之前停止操作,即不包括索引為4的元素钞艇。通過切片啄寡,你可以生成列表的任何子集。
如果你沒有指定第一個索引哩照,Python將自動從列表的開頭開始提取元素这难;同樣的,如果沒有指定第二個索引葡秒,Python將會一直提取到列表的末尾姻乓。注意冒號不能省略,索引也可以是負數(shù)眯牧。
(2)遍歷切片
遍歷列表的部分元素蹋岩,可在for循環(huán)中使用切片。如只打印前三種水果:
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
for fruit in fruits[:3]:
print(fruit)
# 輸出:
apple
banana
orange
(3)復制列表
要復制整個列表学少,可創(chuàng)建一個包含整個列表的切片剪个,方法是同時省略起始索引和終止索引([:]),即可復制整個列表版确。
函數(shù)id()返回的是變量的內(nèi)存地址扣囊。
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
my_fruits = fruits[:]
print(id(fruits))
print(id(my_fruits))
# 輸出:
2722431740296
2722431740360
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
my_fruits = fruits
print(id(fruits))
print(id(my_fruits))
# 輸出:
2686324681096
2686324681096
通過上述兩個例子,我們可以知道绒疗,雖然復制的是整個列表侵歇,但是不能直接賦值,因為通過輸出內(nèi)存地址可以發(fā)現(xiàn)吓蘑,直接賦值的話惕虑,表明有兩個不同的變量名指向了同一個內(nèi)存地址坟冲,它實際上是將內(nèi)存地址復制給了新的變量。而用切片的方法溃蔫,我們可以發(fā)現(xiàn)內(nèi)存地址是不一樣的健提,說明這兩個變量除了列表里面的元素相同之外,并沒有任何的關系伟叛,它實際上是將列表中的元素完全復制給了新的變量私痹。
6、元組
列表在程序運行期間统刮,它的元素是可以修改的紊遵,即列表是可變的。但有時候需要一系列不可變的元素网沾,而這不可變的列表被稱為元組癞蚕。
(1)定義元組
元組類似于列表,但它使用圓括號而不是方括號來標識辉哥。
demensions = (18, 65, 32)
print(demensions)
print(demensions[1])
# 輸出:
(18, 65, 32)
65
對元組中元素的訪問桦山,和訪問列表元素是一樣的。
當你要修改元組中的某一個元素時醋旦,Python會返回類型錯誤的消息恒水,說明元組是不可變的。
(2)遍歷元組中的所有值
可以像列表一樣用for循環(huán)來遍歷元組中的所有值饲齐。
demensions = (18, 65, 32)
for demension in demensions:
print(demension)
# 輸出:
18
65
32
(3)修改元組變量
雖然不能修改元組的元素钉凌,但可以給存儲元組的變量賦值。所以當你需要修改元組的某一個元素時捂人,只能對該元組重新賦值御雕。這樣Python就不會報錯,因為給元組變量賦值是合法的滥搭。
7酸纲、設置代碼格式
Python改進提案(Python Enhancement Proposal,PEP)瑟匆,PEP 8是最古老的PEP之一闽坡,它向Python程序員提供了代碼格式設置指南。
PEP 8建議每級縮進都使用四個空格愁溜,這既可以提高可讀性疾嗅,又留下了足夠的多級縮進的空間。
建議每行的行長不超過80個字符冕象,雖然每行容納的字符數(shù)可以很多代承,但是為了方便查看,盡量不超過80個字符交惯。PEP 8還建議注釋的行長不超過72個字符次泽,原因與上面一樣穿仪。
要將程序的不同部分分開席爽,可使用空行意荤,但也不能濫用≈欢停空行不會影響代碼的運行玖像,但會影響代碼的可讀性。Python解釋器根據(jù)水平縮進情況來解讀代碼齐饮,但不關心垂直間距捐寥。