大爽Python入门教程 2-5 *拓展实践,对比与思考
大爽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.
大爽Python入门教程 2-5 *拓展实践,对比与思考的更多相关文章
- 大爽Python入门教程 3-4 实践例题
大爽Python入门公开课教案 点击查看教程总目录 1. 求和 使用循环,计算列表所有项的和,并输出这个和. 列表示例 lst = [8, 5, 7, 12, 19, 21, 10, 3, 2, 11 ...
- 大爽Python入门教程 2-2 序列: 字符串、元组与列表
大爽Python入门公开课教案 点击查看教程总目录 序列 序列(sequence): 顾名思义,有序的排列. 有序排列的一串数据. 一种容器,容器内成员有序排列. python的字符串str,元组tu ...
- 大爽Python入门教程 2-3 字符串,列表,字典
大爽Python入门公开课教案 点击查看教程总目录 除了通用的序列方法, 列表和字符串还有些自己的专属方法. 后面介绍有些是英中文对照介绍(英文来自官方文档), 便于大家更深入的去理解其意思. 灵活的 ...
- 大爽Python入门教程 2-4 练习
大爽Python入门公开课教案 点击查看教程总目录 方位输出 第一章有一个思考题,方位变换: 小明同学站在平原上,面朝北方,向左转51次之后(每次只转90度), 小明面朝哪里?小明转过了多少圈? (3 ...
- 大爽Python入门教程 2-1 认识容器
大爽Python入门公开课教案 点击查看教程总目录 1 什么是容器 先思考这样一个场景: 有五个学生,姓名分别为: Alan, Bruce, Carlos, David, Emma. 需要给他们都打一 ...
- 大爽Python入门教程 1-1 简单的数学运算
大爽Python入门公开课教案 点击查看教程总目录 1 使用pycharm建立我们的第一个项目 打开pycharm,点击菜单栏,File->New Project 在Location(项目地址) ...
- 大爽Python入门教程 1-2 数与字符串
大爽Python入门公开课教案 点击查看教程总目录 1 整数与浮点数 整数大家都知道,比如1, 2, 10, 123, 都是整数int. 浮点数是什么呢? 上一节的除法运算,不知道有没有人注意到,其结 ...
- 大爽Python入门教程 1-3 简单的循环与判断
大爽Python入门公开课教案 点击查看教程总目录 这里只初步认识下循环和判断,以便于我们去实现一些简单的计算. 循环和判断的详细知识和细节,我们将在后面的章节(大概是第三章)展开阐述. 1 初步了解 ...
- 大爽Python入门教程 0-3 安装Atom与配置Python环境
大爽Python入门公开课教案 点击查看教程总目录 安装轻量级IDE--Atom 一 下载 下面步骤1,2中网络卡顿的朋友, 请直接查看步骤3来操作 1. 搜索官网 使用搜索引擎搜索Atom, 打开搜 ...
随机推荐
- Spring系列之Redis的两种集成方式
在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-redis两种方式. 一.使用Jedis方 ...
- Django整理(二) - 视图和模板的初步使用
Django中的视图 · Django使用视图来编写web应用的业务逻辑 · Django的视图也就是一个函数,可称为视图函数 · 视图定义在应用的view.py文件中 · 视图需要绑定一个URL地址 ...
- Windows下的程序及热键监视神器——Spy++
Windows下的程序及热键监视神器--Spy++ 背景 在使用Windows的时候,偶尔会发现某些应用程序的热键不生效了:又或是桌面弹出了弹框却并不知道这个弹框来自何处.例如,本人最近使用Vim的时 ...
- gRPC,爆赞
原文链接: gRPC,爆赞 gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用. 作为一名程序员,学就对了. 之前用 Python 写过一些 gRPC 服务, ...
- Java基础之(十一):方法
Java方法详解 何谓方法(了解) System.out.println() // 类 对象 方法 方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序集合 方法包含于类或对象中 ...
- iOS Swift结构体与类的方法调度
前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...
- hdu3001(三进制状压)
题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...
- C#开发BIMFACE系列47 IIS部署并加载离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>与<C#开发BIMFACE系 ...
- Vuex 基础
其他章节请看: vue 快速入门 系列 Vuex 基础 Vuex 是 Vue.js 官方的状态管理器 在vue 的基础应用(上)一文中,我们已知道父子之间通信可以使用 props 和 $emit,而非 ...
- 从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群
前两期的文章介绍了Kubernetes基本概念和架构,用Kubeadm+Ansible搭建Kubernetes集群所需要的工具及其作用.本篇介绍怎么使用Ansible安装Kubernetes集群. 启 ...