簡(jiǎn)介
這是我們系列中的第二個(gè)模塊,可幫助您了解 Python 及其在機(jī)器學(xué)習(xí) (ML) 和人工智能 (AI) 中的使用。
現(xiàn)在您已經(jīng)了解了第一個(gè)模塊中討論的 Python 的一些基礎(chǔ)知識(shí),我們可以更深入地了解列表和元組數(shù)據(jù)結(jié)構(gòu),并了解如何使用它們。
列表
列表是項(xiàng)目的集合。列表是可變的:你可以改變它們的元素和大小。因此,它們類似于List<T>
C# 中的 a ArrayList<T>
、Java 中的 a 和 JavaScript 中的數(shù)組。
您可以像這樣分配一個(gè)列表,然后通過(guò)從零開(kāi)始的索引訪問(wèn)它的元素:
foo = [1, 2, True, "mixing types is fine"]
print(foo[0]) # 1
foo[0] = 3
print(foo[0]) # 3
該append
方法在列表的末尾添加一個(gè)元素。該insert
方法將元素放置在您指定的索引處:
foo = [1, 2, 3]
foo.append(4)
print(foo) # [1, 2, 3, 4]
foo.insert(0, 0.5)
print(foo) # [0.5, 1, 2, 3, 4]
要?jiǎng)h除索引處的元素,請(qǐng)使用del
關(guān)鍵字:
del foo[2]
print(foo) # [0.5, 1, 3, 4]
元組
元組是另一種類型的項(xiàng)目集合。元組類似于列表,但它們是不可變的。一個(gè)元組是這樣分配的:
foo = 1, 2, True, "you can mix types, like in lists"
您經(jīng)常會(huì)看到格式為 的元組(1, 2, "a")
,并帶有括號(hào)。元組值周圍的括號(hào)用于幫助提高可讀性或根據(jù)上下文需要。例如,1, 2 + 3, 4
表示不同于(1, 2) + (3, 4)
! 第一個(gè)表達(dá)式返回一個(gè)元組,(1, 5, 4)
而第二個(gè)返回(1, 2, 3, 4)
。
從獲得一個(gè)元組的值相同的方式工作從列表,foo[index],
以index
表示該元素的從零開(kāi)始的索引。如果您嘗試更改其中一個(gè)元素,您可以看到元組是不可變的:
foo[0] = 3 # will raise a TypeError
這適用于列表,但不適用于元組。
元組也沒(méi)有 append、remove 和其他一些方法。
你也可以從函數(shù)中返回元組,這是一種常見(jiàn)的做法:
def your_function():
return 1, 2
這將返回一個(gè)元組(1, 2)
。
如果您想要一個(gè)只有一個(gè)元素的元組,請(qǐng)?jiān)谠撛睾蠓胖靡粋€(gè)逗號(hào):
foo = 1,
負(fù)指數(shù)和切片
Python 的索引比我目前演示的更強(qiáng)大。它們提供了一些在 C#、Java 等中不存在的功能。一個(gè)例子是負(fù)索引,其中 -1 指的是最后一個(gè)元素,-2 指的是倒數(shù)第二個(gè)元素,依此類推。
my_list = [1, 2, 3]
print(my_list[-1]) # 3
這適用于列表和元組。
此外,您可以通過(guò)指定切片的開(kāi)始、結(jié)束或開(kāi)始和結(jié)束元素的索引來(lái)獲取列表或元組的切片。這會(huì)生成一個(gè)包含元素子集的新列表或元組。下面舉幾個(gè)例子來(lái)演示:
my_list = [0, 1, 2, 3, 4, 5]
print(my_list[1:2]) # [1, 2]
print(my_list[2:]) # [2, 3, 4, 5]
print(my_list[:2]) # [0, 1]
print(my_list[0:4:2]) # [0, 2]
print(my_list[-3:-1]) # [3, 4]
print(my_list[::-1]) # [5, 4, 3, 2, 1, 0]
切片符號(hào)是[start:stop:step]
。如果start
保持為空,則默認(rèn)為 0。如果end
保持為空,則表示列表結(jié)束。該:step
符號(hào)是可選的。所以::-1
表示“從 0 到列表末尾,步驟為 -1”,從而返回反向列表。
切片永遠(yuǎn)不會(huì)提高IndexErrors
。當(dāng)超出范圍時(shí),它們只返回一個(gè)空列表。
解構(gòu)
假設(shè)您有一個(gè)元組(或列表),其中包含已知數(shù)量的元素,例如三個(gè)。并且假設(shè)你擁有三個(gè)不同的變量,每個(gè)元組元素一個(gè)。
Python 提供了一種稱為解構(gòu)(或解包)的功能,可以用一行來(lái)分解集合:
my_tuple = 1, 2, 3
a, b, c = my_tuple
現(xiàn)在a = 1
,b = 2
, 和c = 3
。
my_list = [1, 2, 3]
a, b, c = my_list
這在處理返回元組的函數(shù)時(shí)非常有用,Python 生態(tài)系統(tǒng)中有很多這樣的函數(shù),以及處理與 AI 相關(guān)的庫(kù)時(shí)。
循環(huán)
您可能熟悉三種循環(huán):for、foreach 和 while。Python 只提供 while 和 foreach 循環(huán)(它使用for關(guān)鍵字!)。不過(guò)不用擔(dān)心。正如我們稍后將看到的,創(chuàng)建一個(gè)行為與 for 循環(huán)完全相同的循環(huán)非常容易。
這是一個(gè)迭代列表的 Python 循環(huán):
fruits = ["Apple", "Banana", "Pear"]
for fruit in fruits:
print(fruit)
您還可以遍歷元組:
fruits = "Apple", "Banana", "Pear"
for fruit in fruits:
print(fruit)
通常,您可以在每個(gè)迭代器上使用 for 循環(huán)。迭代器以及如何創(chuàng)建自己的迭代器將在后面的文章中進(jìn)行更深入的討論。
如果你想要一個(gè) C 風(fēng)格的 for 循環(huán)而不是 foreach 循環(huán),你可以遍歷range函數(shù)的結(jié)果,它返回一個(gè)范圍內(nèi)的迭代器:
for i in range(10):
print(i)
最后打印出來(lái)的數(shù)字是 9。這相當(dāng)于下面的 C 代碼片段:
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
該range
函數(shù)提供的不僅僅是從零到給定數(shù)字的計(jì)數(shù)。您可以使用range(x, 10),
where x
will be the first array element指定不同的起始編號(hào)。您可以使用第三個(gè)參數(shù)指定步長(zhǎng),例如range(0, 10, 2)
。
從高向低數(shù)是這樣的創(chuàng)建范圍:range(10, 0, -1)
。第一元件現(xiàn)在將10和最后一個(gè)將是1。實(shí)際上,range(0, 10)
是不相反range(10, 0, -1)
,因?yàn)榈诙€(gè)參數(shù)將不被包括在該范圍。
Python 中的 while 循環(huán)看起來(lái)與您已經(jīng)知道的非常相似:
while condition:
# code
Python 還提供了 break 和 continue 語(yǔ)句,它們的工作方式與 C#、Java、JavaScript 和許多其他語(yǔ)言中的語(yǔ)句完全一樣。
while True: if input() == "hello": break
結(jié)論
在本模塊中,我們查看了 Python 中的列表和元組,并了解了索引、解構(gòu)和循環(huán)。