大爽Python入门公开课教案

点击查看教程总目录

本文偏难。

推荐等第一二三四章上完后,回过来拓展阅读。

基础情景思考

假设有这样一张成绩表

最左边的一列是名字,起名麻烦。

这里直接用ABC...来代替。

language math english
A 90 80 85
B 80 87 86
C 85 90 90
  1. 使用怎样的容器可以存储这张表中的的数据信息。

    (开放题,答案不唯一)
  2. 使用1中容器,如何根据人名得到其详细信息。

    具体来讲,有变量name值为人名(可以取一个名字做示例值,比如A),怎么使用name变量,找到对应的具体成绩信息。(代码不能写死,name变量值变了也应该能生效)

详细信息以以下格式输出

name: A, language: 90, math: 80, english: 85.
  1. 怎么添加一行学生信息。比如下面这一行
language math english
D 80 85 85
  1. 怎么使用容器,以如下格式输出所有人成绩信息。
A: language=90, math=80, english=85, sum=255.

提示,sum(sequence)方法可以得到sequence所有元素的和。

基础实现

主要使用列表

选择列表作为容器的主要实现方式

使用列表作为容器的主要实现方式,其对应的实现方法也有很多种,以下只是一种示例。

  1. 将每行信息看作一组,使用元组来存储每行的信息,再用列表来存储所有行。(这里选择不存储科目信息)

    代码如下
scores = [
("A", 90, 80, 85),
("B", 80, 87, 86),
("C", 85, 90, 90)
]
  1. 使用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)
  1. 代码如下
d_item = ("D", 80, 85, 85)
scores.append(d_item)
  1. 代码如下
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))

主要使用字典

选择字典作为容器的主要实现方式

使用字典作为容器的主要实现方式,其对应的实现方法也有很多种,以下只是一种示例。

  1. 将每行的学生名字作为键,成绩信息放在元组中,用该元组作为值。(这里选择不存储科目信息)

    代码如下
scores = {
"A": (90, 80, 85),
"B": (80, 87, 86),
"C": (85, 90, 90)
}
  1. 代码如下
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]))
  1. 代码如下
scores["D"] = (80, 85, 85)
  1. 代码如下
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输出时,只输出学生选择的课程的信息。)

  1. 如果有一个新的科目,比如sports,如何添加这个新的科目的成绩信息到容器中。

    该科目成绩是已知的,值如下。
sports
A 85
B 90
C 85
D 85
  1. 如果每个人后面可以从几门课中选一门课程来上并获得分数。又该如何添加?

    选课和对应成绩如下(其中-代表没有选择这个课程)
music art science
A - - 90
B 90 - -
C - 95 -
D - - 85

思考分析:

  • 原来的课程名称信息是在输出代码中写死的,这里需要调整,写到容器变量中。
  • 原来每个人的课程分数都是保存再元组中,不能修改,

    这里要使用可以修改的容器,以便添加成绩。
  • 没有选择的课程,其成绩该如何表示。

拓展实现

主要使用列表

  1. 实现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]
]
  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. 实现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}
}
  1. 实现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 *拓展实践,对比与思考的更多相关文章

  1. 大爽Python入门教程 3-4 实践例题

    大爽Python入门公开课教案 点击查看教程总目录 1. 求和 使用循环,计算列表所有项的和,并输出这个和. 列表示例 lst = [8, 5, 7, 12, 19, 21, 10, 3, 2, 11 ...

  2. 大爽Python入门教程 2-2 序列: 字符串、元组与列表

    大爽Python入门公开课教案 点击查看教程总目录 序列 序列(sequence): 顾名思义,有序的排列. 有序排列的一串数据. 一种容器,容器内成员有序排列. python的字符串str,元组tu ...

  3. 大爽Python入门教程 2-3 字符串,列表,字典

    大爽Python入门公开课教案 点击查看教程总目录 除了通用的序列方法, 列表和字符串还有些自己的专属方法. 后面介绍有些是英中文对照介绍(英文来自官方文档), 便于大家更深入的去理解其意思. 灵活的 ...

  4. 大爽Python入门教程 2-4 练习

    大爽Python入门公开课教案 点击查看教程总目录 方位输出 第一章有一个思考题,方位变换: 小明同学站在平原上,面朝北方,向左转51次之后(每次只转90度), 小明面朝哪里?小明转过了多少圈? (3 ...

  5. 大爽Python入门教程 2-1 认识容器

    大爽Python入门公开课教案 点击查看教程总目录 1 什么是容器 先思考这样一个场景: 有五个学生,姓名分别为: Alan, Bruce, Carlos, David, Emma. 需要给他们都打一 ...

  6. 大爽Python入门教程 1-1 简单的数学运算

    大爽Python入门公开课教案 点击查看教程总目录 1 使用pycharm建立我们的第一个项目 打开pycharm,点击菜单栏,File->New Project 在Location(项目地址) ...

  7. 大爽Python入门教程 1-2 数与字符串

    大爽Python入门公开课教案 点击查看教程总目录 1 整数与浮点数 整数大家都知道,比如1, 2, 10, 123, 都是整数int. 浮点数是什么呢? 上一节的除法运算,不知道有没有人注意到,其结 ...

  8. 大爽Python入门教程 1-3 简单的循环与判断

    大爽Python入门公开课教案 点击查看教程总目录 这里只初步认识下循环和判断,以便于我们去实现一些简单的计算. 循环和判断的详细知识和细节,我们将在后面的章节(大概是第三章)展开阐述. 1 初步了解 ...

  9. 大爽Python入门教程 0-3 安装Atom与配置Python环境

    大爽Python入门公开课教案 点击查看教程总目录 安装轻量级IDE--Atom 一 下载 下面步骤1,2中网络卡顿的朋友, 请直接查看步骤3来操作 1. 搜索官网 使用搜索引擎搜索Atom, 打开搜 ...

随机推荐

  1. Spring,IOC源码分析

    有错勿喷 1.首先是Spring,IOC的基本概念 IOC是一个容器 容器启动的时候创建所有单实例对象 我们可以直接从容器中获取到这个对象 2.调试流程 ioc容器的启动过程?启动期间都做了什么(什么 ...

  2. 踩坑系列《一》数据库建表权限 CREATE command denied to user for table

    今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...

  3. 产生UUID随机字符串工具类

    产生UUID随机字符串工具类 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成的API.按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址. ...

  4. docker-compose 搭建mongo集群

    创建目录 在每台机器上操作此步骤 一.在编写容器文件之前的注意事项: 1.yaml文件的指令前端不能使用tab键只能使用空格 2.storage: 指令的对接只能使用 : 不能使用 = 冒号的后面要跟 ...

  5. Linux Bash命令杂记(tr col join paste expand)

    Linux Bash命令杂记(tr col join paste expand) tr命令 tr命令可以将输入的数据中的某些字符做替换或者是作删除 tr [-ds] STR d: 删除输入数据的中的S ...

  6. PGSLQ并发控制

    并发控制简介 PostgreSQL提供了多种方式以控制对数据的并发访问.在数据库内部,数据的一致性使用多版本模式(多版本并发控制(Multiversion Concurrency Control),即 ...

  7. C语言对"不定长"字符串数组的遍历

    一般来说,c语言的数组的初始化可以通过三种方式: {0},在声明时使用,如 int a[10]={0} 使用memset, memset(array,0,sizeof(array)) 用for循环赋值 ...

  8. 每日一题,是否存在(c语言)

    每日一题:1.是否存在 是否存在描述猫咪非常喜欢饼干,尤其是字母饼干.现在,她得到一些字母饼干,她希望选择他们中的一些拼写某些单词. 你的任务是确定她是否可以拼出自己想要的单词. 输入输入包含若干测试 ...

  9. 【UE4 C++】读写Text文件 FFileHelper

    CoreMisc.h 读取 FFileHelper::LoadFileToString 读取全部内容,存到 FString FString TextPath = FPaths::ProjectDir( ...

  10. Python语法1

    变量 命名规则 变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 变量赋值 同一变量可以反复赋值,而且可以是不同类型的变量 i=2; i="name&q ...