实验目的
- 熟悉
list
、tuple
、set
和dict
数据类型的声明与表示方法。 - 掌握字符串与列表的索引与切片方法。
实验说明
本次实验共三个部分:
- 实验 3-1、3-2 和 3-3 应在课堂上完成。
- 实验中的 蓝色题目 为课堂中已涉及的相关题目,相关代码可从网页复制后使用,代码运行结果自行观察即可,无需提交作业;若已在课后自行练习,请思考答案并略过该部分。
- 实验中的 绿色题目 为本节实验课重点练习题,请独立完成相关程序,并将结果和代码截图或拍照保存,待后续提交。
- 实验中的 红色题目 为附加题,具有一定难度,供学有余力的同学思考,不做硬性要求。
实验内容
实验 3-1 组合数据类型
题目 3-1-1 组合数据类型的表示(5 min)
编写下列代码并保存为 Exp3_1_1.py,注意思考和观察变量 a
、b
、c
、d
和 e
的数据类型与表示方式,并思考各组合数据类型中的元素的数据类型。
a = "123abc"
print(a)
b = [True, "2", 3., [], (), {}]
print(b)
c = True, "2", 3., [], (), {}
print(c)
d = {True, "2", 3., ()}
print(d)
e = {(): [], "2": (), 3.: {}}
print(e)
参考答案
输出结果(无序数据类型的输出结果可能因系统、版本等有所差异):
123abc [True, '2', 3.0, [], (), {}] (True, '2', 3., [], (), {}) {'2', 3.0, True, ()} {(): [], '2': (), 3.0: {}}
- 字符串、列表、元组和字典为组合数据类型。
- 字符串由引号(单引号/双引号或三引号)表示,元素为字符。
- 列表由方括号表示,元素为任意数据类型。
- 元组由圆括号表示(可省略),元素为任意数据类型。
- 集合由花括号表示,元素为不可变数据类型。
- 字典由花括号表示,键和值由分号分隔,键为不可变数据类型,值为任何数据类型。
题目 3-1-2 列表的操作(10 min)
编写下列代码并保存为 Exp3_1_2.py,注意观察和理解变量 a
在每次操作后的变化。
a = [1, 2, 3]
a.append(4)
print("第一步:", a, a.count(3))
a.append(3)
print("第二步:", a, a.count(3))
a.remove(1)
print("第三步:", a, a.count(3))
a.remove(3)
print("第四步:", a, a.count(3))
a.insert(2, 5)
print("第五步:", a, a.count(3))
a[0] = [2, 3]
print("第六步:", a, a.count(3))
print("第七步:", 1 in a, 4 in a)
print("第八步:", a.index(4))
参考答案
输出结果:
第一步: [1, 2, 3, 4] 1 第二步: [1, 2, 3, 4, 3] 2 第三步: [2, 3, 4, 3] 2 第四步: [2, 4, 3] 1 第五步: [2, 4, 5, 3] 1 第六步: False True 第七步: 1
a.append(x)
:在列表a
的末尾添加 一个 新的元素x
。a.insert(i, x)
:在列表a
的i
位 前 添加 一个 新的元素x
。a.remove(x)
:移除列表a
中 第一个 值为x
的元素。a.index(x)
:返回列表a
中 第一个 值为x
的元素的位置。- 使用
a
的索引值也可用于修改对应位置的元素。
题目 3-1-3 新同学报道(10 min)
编写代码并保存为 Exp3_1_3.py,实现如下功能:获取用户输入的新同学数据(共三组),保存至列表中并打印至屏幕上。
注意
每次打印的现有人员和输入姓名之间有一个空行。
程序运行结果如下:
请输入姓名:张三
现有同学: ['张三']
请输入姓名:李四
现有同学: ['张三', '李四']
请输入姓名:王五
现有同学: ['张三', '李四', '王五']
参考答案
因还未学习 for 和 while 关键字,这里使用简单三次重复代码实现上述功能。
data = [] name = input("请输入姓名:") data.append(name) print("现有同学:", data, "\n") name = input("请输入姓名:") data.append(name) print("现有同学:", data, "\n") name = input("请输入姓名:") data.append(name) print("现有同学:", data, "\n")
题目 3-1-4 又是新同学
(本题不做要求,供 题目 3-1-3 完成后时间充裕的同学做补充练习。)
若将 3-1-3 中要求的数据类型从列表改为字符串,应如何修改上述代码?
参考答案
data = "" name = input("请输入姓名:") data += name + ", " print("现有人员:", data, "\n") name = input("请输入姓名:") data += name + ", " print("现有人员:", data, "\n") name = input("请输入姓名:") data += name + ", " print("现有人员:", data, "\n")
实验 3-2 组合数据的切片与索引
题目 3-2-1 组合数据的索引(10 min)
编写下列代码并保存为 Exp3_2_1.py 并运行,注意思考和观察变量 a
索引与值之间的关系。
a = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
print("第 0 个元素为:", a[0])
print("第 4 个元素为:", a[4])
print("第 -1 个元素为:", a[-1])
print("第 -5 个元素为:", a[-5])
b = [[0.0, 0.1], [1.0, 1.1], [2.0, 2.1]]
print("第 0 个元素为:", b[0])
print("第 0 个元素的第 0 个元素为:", b[0][0])
print("第 1 个元素为:", b[1])
print("第 1 个元素的第 -1 个元素为:", b[1][-1])
print("[0, 1, 2, 3, 4][2]为:", [0, 1, 2, 3, 4][2])
print("[4][0]为:", [4][0])
参考答案
输出结果:
第 0 个元素为: 甲 第 4 个元素为: 戊 第 -1 个元素为: 癸 第 -5 个元素为: 己 第 0 个元素为: [0.0, 0.1] 第 0 个元素的第 0 个元素为: 0.0 第 1 个元素为: [1.0, 1.1] 第 1 个元素的第 -1 个元素为: 1.1 [0, 1, 2, 3, 4][2]为:2 [4][0]为:4
- 列表(或字符串)的索引以
列表[整型]
形式表示,用于读取列表(或字符串)特定位的值;- 索引从 0 开始,负数表示从倒数的位置开始;
- 索引下标只能为整型数。
题目 3-2-2 组合数据的切片(10 min)
编写下列代码并保存为 Exp3_2_2.py 并运行,注意思考和观察变量 a
切片结果的类型,及其与值之间的关系。
a = "0123456789"
print("a为:", a)
print("a[0:5]为:", a[0:5])
print("a[5:10]为:", a[5:10])
print("a[0:1]为:", a[0:1])
print("a[0:0]为:", a[0:0])
print("a[3:8:1]为:", a[3:8:1])
print("a[3:8:2]为:", a[3:8:2])
print("a[3:8:3]为:", a[3:8:3])
print("a[-8:-3:1]为:", a[-8:-3:1])
print("a[-8:-3:-1]为:", a[-8:-3:-1])
print("a[-3:-8:1]为:", a[-3:-8:1])
print("a[-3:-8:-1]为:", a[-3:-8:-1])
print("a[3:8:]为:", a[3:8:])
print("a[3::1]为:", a[3::1])
print("a[:8:1]为:", a[:8:1])
print("a[::1]为:", a[::1])
print("a[::]为:", a[::])
print("a[:]为:", a[:])
参考答案
输出结果:
a为: 0123456789 a[0:5]为: 01234 a[5:10]为: 56789 a[0:1]为: 0 a[0:0]为: a[3:8:1]为: 34567 a[3:8:2]为: 357 a[3:8:3]为: 36 a[-8:-3:1]为: 23456 a[-8:-3:-1]为: a[-3:-8:1]为: a[-3:-8:-1]为: 76543 a[3:8:]为: 34567 a[3::1]为: 3456789 a[:8:1]为: 01234567 a[::1]为: 0123456789 a[::]为: 0123456789 a[:]为: 0123456789
- 字符串(或列表)的切片以
字符串[整型 a: 整型 b: 整型 c]
形式表示,用于提取列表中全部或部分值,返回一个 新列表;- 切片中
a
为切片起点(含),b
为切片终点(不含),c
为步长。
题目 3-2-3 做个小转换(5 min)
阅读如下代码,思考如下代码实现了什么功能:
months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
number = int(input("请输入待转换月份:"))
print("{} 月转换为英文为 {}".format(number, months[number - 1]))
编写上述代码并保存为 Exp3_2_3.py 并运行,观察其运行结果。
注意
思考:若输入的月份大于
12
,或小于1
可能发生什么?参考答案
运行结果:
请输入待转换月份:3 3 月转换为英文为 Mar
- 若输入的月份大于
12
,因列表中没有对应的元素,因此会报错;- 若输入的月份大于
-12
,小于1
,表示列表从右向左倒着数获取对应的元素;- 若输入月份小于
-11
,因列表中从右向左倒着数没有对应的元素,因此会报错。
题目 3-2-4 又一个转换(10 min)
若将 3-2-3 中要求的数据类型从列表改为字符串,应如何修改上述代码?编写代码并保存为 Exp3_2_4.py。
参考答案
months = "JanFebMarAprMayJunJulAugSepOctNovDec" number = int(input("请输入待转换月份:")) print("{} 月转换为英文为 {}".format(number, months[(number - 1) * 3 : number * 3]))
题目 3-2-5 还是个转换
(本题不做要求,供 题目 3-2-4 完成后时间充裕的同学做补充练习。)
若将 3-2-4 中要求的数据类型从字符串改为 ① 元组或 ② 字典,应如何修改上述代码?
参考答案
- 元组:
months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") number = int(input("请输入待转换月份:")) print("{} 月转换为英文为 {}".format(number, months[number - 1]))
- 字典:
months = {1:"Jan", 2:"Feb", 3:"Mar", 4:"Apr", 5:"May", 6:"Jun", 7:"Jul", 8:"Aug", 9:"Sep", 10:"Oct", 11:"Nov", 12:"Dec"} number = int(input("请输入待转换月份:")) print("{} 月转换为英文为 {}".format(number, months[number]))
实验 3-3 综合练习
题目 3-3-1 回文数(15 min)
对于任一自然数,若将其的各位数字反向排列所得自然数与原数相等,则称其为回文数。例如:12321、456654 等。编写代码,检测用户输入的数值是否为回文数。
程序第一次运行结果如下:
请输入数字:7887
7887:True
程序第二次运行结果如下:
请输入数字:7890
7890:False
参考答案
value = input("请输入数字:") print("{}:{}".format(value, value == value[::-1]))
题目 3-3-2 班级出游(15 min)
某班统计出游人数,各位同学在班级群内接龙报名,根据报名情况,形成如下数组:["李明轩", "张雨萱", "王浩宇", "刘思涵", "陈俊杰", "赵婉儿", "黄子轩", "周欣怡", "吴昊然", "徐梦琪", "孙嘉懿", "朱晨曦", "胡雅静", "高宇航", "郭雨婷", "林俊熙", "何欣妍", "郑子豪", "冯婉如", "邓博文", "曹雨欣", "彭俊楠", "韩佳怡", "肖宇轩", "朱晨曦", "蒋欣怡", "许浩然", "傅雅琴", "朱晨曦", "袁梦琪", "潘俊杰", "蔡婉儿", "董子墨", "苏雨婷", "余浩宇", "卢欣怡", "郭雨婷", "钟雅静", "叶宇航", "田雨欣"]
已知,本班同学没有同名同姓的情况,部分同学可能由于失误进行了多次报名,请编写代码,统计1)报名总人数和2)真实的出游总人数(即去除重复报名的情况后的人数)。
程序运行结果如下:
报名总人数:40 人
出游总人数:37 人
参考答案
members = ["李明轩", "张雨萱", "王浩宇", "刘思涵", "陈俊杰", "赵婉儿", "黄子轩", "周欣怡", "吴昊然", "徐梦琪", "孙嘉懿", "朱晨曦", "胡雅静", "高宇航", "郭雨婷", "林俊熙", "何欣妍", "郑子豪", "冯婉如", "邓博文", "曹雨欣", "彭俊楠", "韩佳怡", "肖宇轩", "朱晨曦", "蒋欣怡", "许浩然", "傅雅琴", "朱晨曦", "袁梦琪", "潘俊杰", "蔡婉儿", "董子墨", "苏雨婷", "余浩宇", "卢欣怡", "郭雨婷", "钟雅静", "叶宇航", "田雨欣"] print("报名总人数:{} 人".format(len(members))) print("报名总人数:{} 人".format(len(set(members))))
发表回复