1. 程式人生 > 其它 >大爽Python入門教程 2-1 認識容器

大爽Python入門教程 2-1 認識容器

大爽Python入門公開課教案
點選檢視教程總目錄

1 什麼是容器

先思考這樣一個場景:
有五個學生,姓名分別為:
Alan, Bruce, Carlos, David, Emma.
需要給他們都打一遍招呼。
即按照以下格式輸出一遍

hello, Alan!
hello, Bruce!
hello, Carlos!
hello, David!
hello, Emma!

如果一個一個print,程式碼重複度太高,且後續每多一個學生,需要跟著增加一行print。
20個學生就需要20行程式碼,100個學生就需要100行程式碼,
這樣的程式碼是很糟糕的。

回顧第一章,我們可能能想到使用迴圈。
但是由於每個學生都有自己的名字,這些名字一般是不同的字串,
所以不能直接使用第一章學到的for i in range(n)

迴圈。

那麼我們希望怎樣一種迴圈?
我們希望:
有多少個學生,迴圈就執行多少次,
同時第幾次迴圈中,我們能知道第幾個學生的姓名資訊。

實際上,
這會被分成兩步去實現,
有一個東西,去存放學生的姓名資訊。
使用迴圈,遍歷(依次獲取)這個東西里面存放的資訊。

這樣一種能存放其他變數資訊的東西,稱為容器。
python裡面最常用的三種容器:

  • 列表(list)
  • 元組(tuple)
  • 字典(dict,dictionary)

2 列表list

先回到我們剛才描述的場景,
對這個場景而言,選擇列表list做為容器是最好的。

程式碼如下

# 首先,新建一個存放學生的姓名資訊的容器,容器名為names
names = ["Alan", "Bruce", "Carlos", "David", "Emma"]

for name in names:  # 遍歷容器:依次獲取學生姓名資訊
    print("hello, %s!" % name)

# 後面都為註釋,
執行程式碼時,註釋是不執行的。
註釋主要是用來解釋說明程式碼的用意。
方便別人看懂(也方便自己看懂)

列表基礎

  • 列表用[]來表示,內部存放的資料,稱為項(item)或者元素(element),不同元素用,分隔。
  • 可以使用for ... in ...來遍歷列表裡面的元素(依次獲取全部元素資訊)
  • 列表使用append(item)方法來新增新元素
  • *列表內部的元素可以是不同的型別,但一個列表通常會存放相同型別的資料(不同型別的資料一般會分開存放)。
  • *列表是有序的。
  • *列表的型別為list

使用示例

>>> names = ["Alan", "Bruce", "Carlos"]
>>> type(names)
<class 'list'>
>>> for name in names:
...     print(name)
...
Alan
Bruce
Carlos
>>> names.append("David")
>>> names
['Alan', 'Bruce', 'Carlos', 'David']
>>> for name in names:
...     print(name)
...
Alan
Bruce
Carlos
David

3 場景拓展

更近一步,假設這五個學生的數學成績分別為:
90, 80, 85, 92, 81.

需要按以下格式展示他們的姓名和成績,

Alan, your's math score is 90.
Bruce, your's math score is 80.
Carlos, your's math score is 85.
David, your's math score is 92.
Emma, your's math score is 81.

這個問題,有多種解決思路。

4 元組tuple

一種思路是,使用元組作為子容器
把每個學生的名字和分數一起放在一個元組裡,
看作每個學生的個人資訊,再把每個學生的個人資訊(名字和分陣列成的元組)放到列表裡面。
程式碼如下

info_list = [
    ("Alan", 90),
    ("Bruce", 80),
    ("Carlos", 85),
    ("David", 92),
    ("Emma", 81),
]

for info in info_dict:
    name, score = info
    print("%s, your's math score is %s." % (name, score))

元組基礎

  • 元組用()來表示,內部存放的資料,稱為項(item)或者元素(element),不同元素用,分隔。
  • 元組和列表很像,不過元組是不可變物件,不能新增、修改或刪除項。
    所以一般定義了一個元組,元組元素的數量就是固定的,
    所以可以直接用相同的固定數量的變數來承接元組中的項。
  • *列表的型別為list

使用示例

>>> info = ("Alan", 90)
>>> type(info)
<class 'tuple'>
>>> name, score = info
>>> name
'Alan'
>>> score
90
>>> for item in info:
...     print(item)
...
Alan
90

補充說明:一般定義了一個元組,元組元素的數量就是固定的,
所以可以直接用相同的固定數量的變數來承接元組中的項。

其實列表也可以用同等數量的變數來承接列表的所有元素。
但是列表的元素數量是可變的,即數量是不固定的,所以一般不這麼做。

一般不用for迴圈來取元組的值,而是直接用同樣個數的變數來取。

5 字典dict

另一種思路是,使用字典作為容器。
那麼學生的名字和分數就是一一對應的關係。
程式碼如下

info_dict = {
    'Alan': 90,
    'Bruce': 80,
    'Carlos': 85,
    'David': 92,
    'Emma': 81
}

for name in info_dict:
    score = info_dict[name]
    print("%s, your's math score is %s." % (name, score))

補充說明:原本python的字典是無序的(目前很多老教程也是這麼說的),
那麼這個輸出的順序不能保證一致,可能是亂的。
不過python3.6以後,字典就改成有序的了(遵循先後順序,也叫插入順序),
所以這個輸出是完全符合的。

字典基礎

  • 字典用{}來表示,內部存放鍵值對,鍵值對內部用:分隔鍵與值,即key: value,不同鍵值對用,分隔。

  • 可以使用for ... in ...來遍歷字典裡面的鍵(依次獲取全部鍵)

  • 字典的鍵的型別,只能為字串、數字、元組。

  • 字典的鍵是唯一的,不能重複。

  • 字典的值的型別,可以為任何型別。

  • 字典的鍵可以是不同的型別,值也可以是不同的型別,但通常,一個字典的鍵會使用相同型別,值也使用相同型別。

  • 字典通過dict[key]來取值,dict[key]=value賦值(如果key已存在就是修改值)。

使用示例

>>> info_dict = {
...    'Alan': 90,
...    'Bruce': 80
... }
>>> type(info_dict)
<class 'dict'>
>>> info_dict['Alan']
90
>>> for key in info_dict::
...     print(key)
...
Alan
Bruce
>>> for key in info_dict::
...     print(info_dict[key])
...
90
80
>>> info_dict['Carlos'] = 85
>>> info_dict
{'Alan': 90, 'Bruce': 80, 'Carlos': 85}
>>> info_dict['Bruce'] = 88
>>> info_dict
{'Alan': 90, 'Bruce': 88, 'Carlos': 85}

6 容器簡單比較

上一部分說到過,容器是一種能存放其他變數資訊的東西。

實際上,容器存放的是,資料與資料關係

字典中的資料是對應關係。
列表中的資料是先後順序關係。
元組中的資料是一個固定的小組的關係。

不同的場景,使用的資料的關係不同,
解決對應需求的容器往往也不同。