大爽Python入門教程 2-5 *拓展實踐,對比與思考
阿新 • • 發佈:2021-08-30
大爽Python入門公開課教案
點選檢視教程總目錄
本文偏難。
推薦等第一二三四章上完後,回過來拓展閱讀。
基礎情景思考
假設有這樣一張成績表
最左邊的一列是名字,起名麻煩。
這裡直接用ABC...
來代替。
language | math | english | |
---|---|---|---|
A | 90 | 80 | 85 |
B | 80 | 87 | 86 |
C | 85 | 90 | 90 |
- 使用怎樣的容器可以儲存這張表中的的資料資訊。
(開放題,答案不唯一) - 使用1中容器,如何根據人名得到其詳細資訊。
具體來講,有變數name
值為人名(可以取一個名字做示例值,比如A
),怎麼使用name
變數,找到對應的具體成績資訊。(程式碼不能寫死,name
詳細資訊以以下格式輸出
name: A, language: 90, math: 80, english: 85.
- 怎麼新增一行學生資訊。比如下面這一行
language | math | english | |
---|---|---|---|
D | 80 | 85 | 85 |
- 怎麼使用容器,以如下格式輸出所有人成績資訊。
A: language=90, math=80, english=85, sum=255.
提示,
sum(sequence)
方法可以得到sequence
所有元素的和。
基礎實現
主要使用列表
選擇列表作為容器的主要實現方式
使用列表作為容器的主要實現方式,其對應的實現方法也有很多種,以下只是一種示例。
- 將每行資訊看作一組,使用元組來儲存每行的資訊,再用列表來儲存所有行。(這裡選擇不儲存科目資訊)
程式碼如下
scores = [
("A", 90, 80, 85),
("B", 80, 87, 86),
("C", 85, 90, 90)
]
- 使用
for
迴圈遍歷查詢name
值,程式碼如下
name = "A" for item in scores: item_name = item[0] if item_name == name: print("name: %s, language: %s, math: %s, english: %s." % item)
- 程式碼如下
d_item = ("D", 80, 85, 85)
scores.append(d_item)
- 程式碼如下
for item in scores:
name, s1, s2, s3 = item
s = s1 + s2 + s3
print("%s: language=%s, math=%s, english=%s, sum=%s." %
(name, s1, s2, s3, s))
主要使用字典
選擇字典作為容器的主要實現方式
使用字典作為容器的主要實現方式,其對應的實現方法也有很多種,以下只是一種示例。
- 將每行的學生名字作為鍵,成績資訊放在元組中,用該元組作為值。(這裡選擇不儲存科目資訊)
程式碼如下
scores = {
"A": (90, 80, 85),
"B": (80, 87, 86),
"C": (85, 90, 90)
}
- 程式碼如下
name = "A"
score_a = scores[name]
print("name: %s, language: %s, math: %s, english: %s." %
(name, score_a[0], score_a[1], score_a[2]))
- 程式碼如下
scores["D"] = (80, 85, 85)
- 程式碼如下
for name in scores:
s1, s2, s3 = scores[name]
s = s1 + s2 + s3
print("%s: language=%s, math=%s, english=%s, sum=%s." %
(name, s1, s2, s3, s))
拓展情景思考
考慮以下兩個需求,思考原有容器應該如何調整結構(或者說重新設計),
調整後的容器如何實現234。
(其中2和4輸出時,只輸出學生選擇的課程的資訊。)
- 如果有一個新的科目,比如
sports
,如何新增這個新的科目的成績資訊到容器中。
該科目成績是已知的,值如下。
sports | |
---|---|
A | 85 |
B | 90 |
C | 85 |
D | 85 |
- 如果每個人後面可以從幾門課中選一門課程來上並獲得分數。又該如何新增?
選課和對應成績如下(其中-
代表沒有選擇這個課程)
music | art | science | |
---|---|---|---|
A | - | - | 90 |
B | 90 | - | - |
C | - | 95 | - |
D | - | - | 85 |
思考分析:
- 原來的課程名稱資訊是在輸出程式碼中寫死的,這裡需要調整,寫到容器變數中。
- 原來每個人的課程分數都是儲存再元組中,不能修改,
這裡要使用可以修改的容器,以便新增成績。 - 沒有選擇的課程,其成績該如何表示。
拓展實現
主要使用列表
- 實現1, 5, 6, 程式碼如下
# 1
# 用一個專門的列表儲存科目資訊
courses = ["language", "math", "english"]
# 仍然將每行資訊看作一組,但使用可變的列表來儲存每行的資訊
scores = [
["A", 90, 80, 85],
["B", 80, 87, 86],
["C", 85, 90, 90]
]
# 5
courses.append("sports")
sports_scores = (85, 90, 85)
for i in range(len(scores)):
item = scores[i]
item.append(sports_scores[i])
# 6
courses.append("music")
courses.append("art")
courses.append("science")
# 沒有選擇的課程的成績用-1表示
music_scores = (-1, 90, -1)
art_scores = (-1, -1, 95)
science_scores = (90, -1, -1)
for i in range(len(scores)):
item = scores[i]
item.append(music_scores[i])
item.append(art_scores[i])
item.append(science_scores[i])
改程式碼執行完後,
courses
如下
['language', 'math', 'english', 'sports', 'music', 'art', 'science']
scores
如下
[
['A', 90, 80, 85, 85, -1, -1, 90],
['B', 80, 87, 86, 90, 90, -1, -1],
['C', 85, 90, 90, 85, -1, 95, -1]
]
- 實現2, 3, 4, 程式碼如下
# 2
# 2
name = "A"
for item in scores:
item_name = item[0]
if item_name == name:
# 用output變數來計算最後的輸出
output = "name: %s" % item_name
for i in range(len(courses)):
# 遍歷所有課程的索引
si = i + 1 # 成績的索引為課程索引+1
if item[si] >= 0:
# 如果成績值不小於0,就代表選擇了這門課程
course = courses[i]
output += ", %s: %s" % (course, item[si])
output += "."
print(output)
# 3
d_item = ("D", 80, 85, 85, 85, -1, -1, 85)
scores.append(d_item)
# 4
for item in scores:
item_name = item[0]
# 用s來計算總分
s = 0
# 用output變數來計算對應的輸出
output = "%s: " % item_name
for i in range(len(courses)):
# 遍歷所有課程的索引
si = i + 1 # 成績的索引為課程索引+1
if item[si] >= 0:
# 如果成績值不小於0,就代表選擇了這門課程
course = courses[i]
output += "%s=%s, " % (course, item[si])
s += item[si]
output += "sum=%s." % s
print(output)
其輸出為
name: A, language: 90, math: 80, english: 85, sports: 85, science: 90.
A: language=90, math=80, english=85, sports=85, science=90, sum=430.
B: language=80, math=87, english=86, sports=90, music=90, sum=433.
C: language=85, math=90, english=90, sports=85, art=95, sum=445.
D: language=80, math=85, english=85, sports=85, science=85, sum=420.
主要使用字典
- 實現1, 5, 6, 程式碼如下
# 1 每個人的成績資訊換成用字典來儲存。
# 課程名作為該字典的鍵,成績作為該字典的值。
scores = {
"A": {
"language":90,
"math":80,
"english":85
},
"B": {
"language":80,
"math":87,
"english":86
},
"C": {
"language":85,
"math":90,
"english":90
}
}
# 5
sports_scores = {
"A": 85,
"B": 90,
"C": 85
}
for name in scores:
info = scores[name]
info["sports"] = sports_scores[name]
# 6
add_scores = {
"A": {
"science": 90
},
"B": {
"music": 90
},
"C": {
"art": 95
}
}
for name in scores:
info = scores[name]
new_info = add_scores[name]
info.update(new_info)
方法介紹:
dict.update(other)
:
Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.
使用其他鍵/值對更新字典,覆蓋現有鍵。無返回值(直接修改了原有的字典)。
使用示例:>>> a_dict = {"a": 12, "b": 13, "c": 11} >>> other = {"c":15, "d": 20} >>> a_dict.update(other) >>> a_dict {'a': 12, 'b': 13, 'c': 15, 'd': 20}
此時scores
值如下
{
'A': {'language': 90, 'math': 80, 'english': 85, 'sports': 85, 'science': 90},
'B': {'language': 80, 'math': 87, 'english': 86, 'sports': 90, 'music': 90},
'C': {'language': 85, 'math': 90, 'english': 90, 'sports': 85, 'art': 95}
}
- 實現2, 3, 4, 程式碼如下
# 2
name = "A"
score_a = scores[name]
output = "name: %s" % name
for key in score_a: # key即是該同學選擇的課程的名稱
output += ", %s: %s" % (key, score_a[key])
output += "."
print(output)
# 3
score_d = {
"language": 80,
"math": 85,
"english": 85,
"sports": 85,
"science": 85
}
scores["D"] = score_d
# 4
for name in scores:
info = scores[name]
output = "%s: " % name
s = 0
for key in info: # key即是該同學選擇的課程的名稱
output += "%s=%s, " % (key, info[key])
s += info[key]
output += "sum=%s." % s
print(output)
其輸出為
name: A, language: 90, math: 80, english: 85, sports: 85, science: 90.
A: language=90, math=80, english=85, sports=85, science=90, sum=430.
B: language=80, math=87, english=86, sports=90, music=90, sum=433.
C: language=85, math=90, english=90, sports=85, art=95, sum=445.
D: language=80, math=85, english=85, sports=85, science=85, sum=420.