Python – 实验 3

实验目的

  • 熟悉 listtuplesetdict 数据类型的声明与表示方法。
  • 掌握字符串与列表的索引与切片方法。

实验说明

本次实验共三个部分:

  • 实验 3-13-23-3 应在课堂上完成。
  • 实验中的 蓝色题目 为课堂中已涉及的相关题目,相关代码可从网页复制后使用,代码运行结果自行观察即可,无需提交作业;若已在课后自行练习,请思考答案并略过该部分。
  • 实验中的 绿色题目 为本节实验课重点练习题,请独立完成相关程序,并将结果和代码截图或拍照保存,待后续提交。
  • 实验中的 红色题目 为附加题,具有一定难度,供学有余力的同学思考,不做硬性要求。

实验内容

实验 3-1 组合数据类型

题目 3-1-1 组合数据类型的表示(5 min)

编写下列代码并保存为 Exp3_1_1.py,注意思考和观察变量 abcde 的数据类型与表示方式,并思考各组合数据类型中的元素的数据类型。

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):在列表 ai 添加 一个 新的元素 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))))

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注