实验二 Python序列结构
一、实验学时
实验学时:2学时
二、实验目的
1.掌握:Python常用内置对象-列表、元组、字典、集合。
2.掌握运算符和内置函数对列表、元组、字典、集合的操作。
3.理解列表推导式、生成器表达式的工作原理。
4.掌握切片操作。
5.掌握序列解包的用法。
三、实验内容
1.编写程序,用一个变量存储以下信息:学号,姓名,所在学院,专业名称。
2.编写程序,用一个变量存储你所在小组的组员名单。
3.对组员名单进行操作,如增加一个同学,减少一个同学,修改一个同学的姓名。
4.编写程序,录入小组成员的姓氏,利用集合输出小组中的所有姓氏。
5.编写程序,用一个变量存储组员名单,组员Python成绩,计算组员总人数,总分,平均分。
6.编写程序,用一个变量存储组员成绩,要求有低于60的成绩,利用列表推导式,筛选出低于60分的成绩。
7.产生两个随机数x,y,要求0<x<y<组员长度.输出组员成绩[x:y]切片的成绩。
8.利用生成器表达式生成0-9的数值,要求每一个数值乘以你的幸运数字,最后将生成器对象转换成列表,输出列表的结果。
9.复制一段文章或者论文,利用字典统计出每个字出现的次数。
10.棋盘一共64个小格子,第一个格子放一粒米,第二个2粒米,第三个4粒米,第四个8粒米,以此类推一直把64个格子放满需要多少粒米?要求使用列表推导式和内置函数进行计算。
四、实验结果
题目1:
编写程序,用一个变量存储以下信息:学号,姓名,所在学院,专业名称。
题目思路: 本题可以定义一个Student类,里面可以获取实例属性学号、姓名、学院、专业,最后创建对象并打印即可
程序代码:
"""
程序名:实验2.1.py
功能:用一个变量存储以下信息:学号,姓名,所在学院,专业名称。
日期:2022.3.23
版本:1.0
"""
class Student: # Student类定义
def __init__(self, s_id=None, s_name=None, s_faculty=None, s_major=None): # 带默认参数的初始化
# 类里面获取实例属性
self.s_id = s_id # 学号
self.s_name = s_name # 姓名
self.s_faculty = s_faculty # 所在学院
self.s_major = s_major # 专业
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
def print_info(self): # 格式化打印对象属性
print(f'学号:{self.s_id},姓名:{self.s_name},学院:{self.s_faculty},专业:{self.s_major}')
student1 = Student("20212501305", "宋抗非", "软件学院", "软件工程") # 创建对象并添加实例属性
student1.print_info() # 打印对象属性
运行结果截图:
题目2:
编写程序,用一个变量存储你所在小组的组员名单。
题目思路: 本题可以在上一个题目的基础上,再加一个继承类Group,该类中的对象有Student类对象的参数,通过Group类中写的print_all函数,来逐个格式化输出Group对象中Student对象的信息。
程序代码:
"""
程序名:实验2.2.py
功能:用一个变量存储你所在小组的组员名单。
日期:2022.3.23
版本:1.0
"""
class Student: # Student类定义
def __init__(self, s_id=None, s_name=None, s_faculty=None, s_major=None): # 带默认参数的初始化
# 类里面获取实例属性
self.s_id = s_id # 学号
self.s_name = s_name # 姓名
self.s_faculty = s_faculty # 所在学院
self.s_major = s_major # 专业
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
def print_info(self): # 格式化打印对象属性
print(f'学号:{self.s_id},姓名:{self.s_name},学院:{self.s_faculty},专业:{self.s_major}')
class Group(Student): # Group类定义
def __init__(self, students=None):
# 类里面获取实例属性
super().__init__() # 对超类__init__的调用
self.students = students
def __del__(self): # 删除对象
print(f'{self}对象已经被删除')
def __str__(self): # 返回一个对象的描述信息
return "\"小组\""
def print_all(self): # 打印小组内部成员的信息
for student in self.students:
student.print_info()
student1 = Student("20212501305", "宋抗非", "软件学院", "软件工程") # 创建对象并添加实例属性
student2 = Student("20212501705", "王林", "软件学院", "软件工程") # 创建对象并添加实例属性
student3 = Student("20212501511", "庄斌裕", "软件学院", "软件工程") # 创建对象并添加实例属性
group1 = Group([student1, student2, student3]) # 创建对象并添加实例属性
group1.print_all() # 打印小组内部成员信息
运行结果截图:
题目3:
对组员名单进行操作,如增加一个同学,减少一个同学,修改一个同学的姓名。
解题思路: 本题依旧是在上一题的基础上,只要增加三个函数即可,增加同学可以用append函数在Group对象列表中加入,删除可以用pop函数弹出列表中的某个元素,修改姓名直接在函数中对应下标的name属性进行修改即可。
程序代码:
"""
程序名:实验2.3.py
功能:对组员名单进行操作,如增加一个同学,减少一个同学,修改一个同学的姓名。
日期:2022.3.23
版本:1.0
"""
class Student: # Student类定义
def __init__(self, s_id=None, s_name=None, s_faculty=None, s_major=None): # 带默认参数的初始化
# 类里面获取实例属性
self.s_id = s_id # 学号
self.s_name = s_name # 姓名
self.s_faculty = s_faculty # 所在学院
self.s_major = s_major # 专业
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
def print_info(self): # 格式化打印对象属性
print(f'学号:{self.s_id},姓名:{self.s_name},学院:{self.s_faculty},专业:{self.s_major}')
class Group(Student): # Group类定义
def __init__(self, students=None):
# 类里面获取实例属性
super().__init__() # 对超类__init__的调用
self.students = students
def __del__(self): # 删除对象
print(f'{self}对象已经被删除')
def __str__(self): # 返回一个对象的描述信息
return "\"小组\""
def print_all(self): # 打印小组内部成员的信息
for student in self.students:
student.print_info()
def change_name(self, order, name): # 改变对应序号上的成员的姓名
self.students[order - 1].s_name = name
def add_student(self, *args): # *args表示传入参数未知
for s in args:
s = Student(s.s_id, s.s_name, s.s_faculty, s.s_major) # 新成员的信息
self.students.append(s)
def delete_student(self, position):
self.students.pop(position - 1)
student1 = Student("20212501305", "宋抗非", "软件学院", "软件工程") # 创建对象并添加实例属性
student2 = Student("20212501705", "王林", "软件学院", "软件工程") # 创建对象并添加实例属性
student3 = Student("20212501511", "庄斌裕", "软件学院", "软件工程") # 创建对象并添加实例属性
student4 = Student("20212501901", "阿里木", "软件学院", "软件工程") # 创建对象并添加实例属性
group1 = Group([student1, student2, student3]) # 创建对象并添加实例属性
group1.change_name(1, "改过名字的宋抗非") # 将'宋抗非'改成'改过名字的宋抗非'
group1.add_student(student4) # 添加一个成员'阿里木'
group1.delete_student(3) # 删除成员庄斌裕
group1.print_all() # 打印小组内部成员信息
运行结果截图:
题目4:
编写程序,录入小组成员的姓氏,利用集合输出小组中的所有姓氏。
题目思路: 由于集合具有无重复性,所以可以直接输入姓氏存储到集合中,然后逐个输出。
程序代码:
"""
程序名:实验2.4.py
功能:录入小组成员的姓氏,利用集合输出小组中的所有姓氏。
日期:2022.3.23
版本:1.0
"""
name_set = set(input("请输入小组成员的姓氏:\n").split(' ')) # 录入姓名并按空格分割填充到集合里
print("小组成员的姓氏有:")
for name in name_set: # 利用循环打印小组所有姓氏
print(name, end=" ")
运行结果截图:
题目5:
编写程序,用一个变量存储组员名单,组员Python成绩,计算组员总人数,总分,平均分。
解题思路: 本题依旧是在Student/Group类的前提下, 在Group类中实现功能,总分可以直接算出Group类对象列表中对象的分数之和,总人数即为Group类对象列表的长度,平均分即为总分/总人数。
程序代码:
"""
程序名:实验2.5.py
功能:用一个变量存储组员名单,组员Python成绩,计算组员总人数,总分,平均分。
日期:2022.3.23
版本:1.0
"""
class Student: # Student类定义
def __init__(self, s_name, s_score): # 带默认参数的初始化
# 类里面获取实例属性
self.s_score = s_score # 分数
self.s_name = s_name # 姓名
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
class Group(Student): # Group类定义
def __init__(self, students):
# 类里面获取实例属性
super().__init__(self, None) # 对超类__init__的调用
self.students = students
def __del__(self): # 删除对象
print(f'{self}对象已经被删除')
def __str__(self): # 返回一个对象的描述信息
return "\"小组\""
def sum_member(self): # 根据列表长度得到总人数
return len(self.students)
def sum_score(self): # 利用循环计算总分
sum1 = 0
for i in self.students:
sum1 = sum1 + i.s_score
return sum1
def average_score(self): # 利用总分和总人数计算平均分
return self.sum_score() / self.sum_member()
def add_member(self, *args): # *args表示传入参数未知
for s in args:
s = Student(s.s_name, s.s_score) # 新成员的信息
self.students.append(s) # 用append插入新成员
# 创建对象并添加实例属性
student1 = Student("宋抗非", 100)
student2 = Student("王林", 99)
student3 = Student("庄斌裕", 101)
student4 = Student("阿里木", 96)
group1 = Group([student1, student2, student3])
group1.add_member(student4) # 将'阿里木'成员加入到小组
print("总人数为:", group1.sum_member()) # 输出总人数
print("总分为:", group1.sum_score()) # 输出总分
print("平均分为:", group1.average_score()) # 输出平均分
运行结果截图:
题目6:
编写程序,用一个变量存储组员成绩,要求有低于60的成绩,利用列表推导式,筛选出低于60分的成绩。
题目思路: 在Student/Group类的前提下,在Group类中加入一个筛选功能,其中使用列表推导时筛选出低于60的成绩即可
程序代码:
"""
程序名:实验2.6.py
功能:用一个变量存储组员成绩,要求有低于60的成绩,利用列表推导式,筛选出低于60分的成绩。
日期:2022.3.23
版本:1.0
"""
class Student: # Student类定义
def __init__(self, s_name, s_score): # 带默认参数的初始化
# 类里面获取实例属性
self.s_score = s_score # 分数
self.s_name = s_name # 姓名
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
class Group(Student): # Group类定义
def __init__(self, students):
# 类里面获取实例属性
super().__init__(self, None) # 对超类__init__的调用
self.students = students
def __del__(self): # 删除对象
print(f'{self}对象已经被删除')
def __str__(self): # 返回一个对象的描述信息
return "\"小组\""
def filtrate_score(self):
return ['{}:{}'.format(s.s_name, s.s_score) for s in self.students if s.s_score < 60] # 列表推导式
# 创建对象并添加实例属性
student1 = Student("宋抗非", 100)
student2 = Student("王林", 100)
student3 = Student("庄斌裕", 55)
student4 = Student("阿里木", 44)
group1 = Group([student1, student2, student3, student4])
print("成绩低于60的人为:")
flunk = group1.filtrate_score() # flunk表示列表,其中元素为成绩低于60分的'姓名:分数'
for i in flunk: # for循环打印
print(i)
运行结果截图:
题目7:
产生两个随机数x,y,要求0<x<y<组员长度.输出组员成绩[x:y]切片的成绩。
**题目思路:**随机数可以用random库里面的randint,返回范围内的整数,在Student/Group类的基础上,切片可以用列表推导式来得到。
程序代码:
"""
程序名:实验2.7.py
功能:产生两个随机数x,y,要求0<x<y<组员长度.输出组员成绩[x:y]切片的成绩。
日期:2022.3.23
版本:1.0
"""
import random # 导入random扩展库
class Student: # Student类定义
def __init__(self, s_name, s_score): # 带默认参数的初始化
# 类里面获取实例属性
self.s_score = s_score # 分数
self.s_name = s_name # 姓名
def __del__(self): # 删除对象
print(f'\"{self}对象\"已经被删除')
def __str__(self): # 返回一个对象的描述信息
return f'{self.s_name}'
class Group(Student): # Group类定义
def __init__(self, students):
# 类里面获取实例属性
super().__init__(self, None) # 对超类__init__的调用
self.students = students
def __del__(self): # 删除对象
print(f'{self}对象已经被删除')
def __str__(self): # 返回一个对象的描述信息
return "\"小组\""
def sum_member(self): # 根据列表长度得到总人数
return len(self.students)
def add_member(self, *args): # *args表示传入参数未知
for s in args:
s = Student(s.s_name, s.s_score) # 新成员的信息
self.students.append(s) # 用append插入新成员
def slice_score(self): # 得到切片成绩
s_slice = self.students[x:y] # 切片
sc_slice = [s.s_score for s in s_slice] # 列表推导式
return sc_slice
# 创建对象并添加实例属性
student1 = Student("宋抗非", 100)
student2 = Student("王林", 99)
student3 = Student("庄斌裕", 101)
student4 = Student("阿里木", 96)
group1 = Group([student1, student2, student3])
group1.add_member(student4) # 将'阿里木'成员加入到小组
length = group1.sum_member() # 组员长度
x = random.randint(1, length - 2) # 0<x<y
y = random.randint(x + 1, length - 1) # x<y<l
score_slice = group1.slice_score()
print(f'成绩[{x}:{y}]切片为:')
for i in score_slice:
print(i)
运行结果截图:
题目8:
利用生成器表达式生成0-9的数值,要求每一个数值乘以你的幸运数字,最后将生成器对象转换成列表,输出列表的结果。
**题目思路:**利用生成器表达式生成0-9的数值,得到的结果是生成器对象,可以使用list直接强制转换成列表,然后输出即可。
程序代码:
"""
程序名:实验2.8.py
功能:利用生成器表达式生成0-9的数值,要求每一个数值乘以你的幸运数字,最后将生成器对象转换成列表,输出列表的结果。
日期:2022.3.23
版本:1.0
"""
iterator = (i*6 for i in range(10)) # 利用生成器表达式生成0-9的数值
list1 = list(iterator) # 强制转换为列表
print(list1)
运行结果截图:
题目9:
复制一段文章或者论文,利用字典统计出每个字出现的次数。
**题目思路:**将字符串用循环一个一个存储到字典中,如果存储过即+1,最后输出字典即可。
程序代码:
"""
程序名:实验2.9.py
功能:复制一段文章或者论文,利用字典统计出每个字出现的次数。
日期:2022.3.23
版本:1.0
"""
str1 = '''Love is like a butterfly.
It goes where it pleases and it pleases where it goes.
假如每次想起你我都会得到一朵鲜花,那么我将永远在花丛中徜徉。
If I had a single flower for every time I think about you,
I could walk forever in my garden.
有了你,我迷失了自我;失去你,我多么希望自己再度迷失。
''' # 给出字符串
d = {} # 给出字典
for x in str1: # 利用循环统计出现次数
if x in d:
d[x] = d[x] + 1
else:
d[x] = 1
print(d)
运行结果截图:
题目10:
棋盘一共64个小格子,第一个格子放一粒米,第二个2粒米,第三个4粒米,第四个8粒米,以此类推一直把64个格子放满需要多少粒米?要求使用列表推导式和内置函数进行计算。
题目思路: 数学问题,每个格子都等于前一个格子乘2,乘到2的63次方,再算总和即可。
程序代码:
"""
程序名:实验2.10.py
功能:棋盘一共64个小格子,第一个格子放一粒米,第二个2粒米,第三个4粒米,第四个8粒米
以此类推一直把64个格子放满需要多少粒米?要求使用列表推导式和内置函数进行计算。
日期:2022.3.23
版本:1.0
"""
print(f'把64个格子放满需要{sum([pow(2, i) for i in range(64)])}粒米') # 列表推导式
运行结果截图:
五、实验小结
问题和解决方法:
问题1:不清楚删除列表的方法都有哪些
解决方法: 通过上网翻书查询得知,可以用remove、pop、del [索引]三种方法来删除列表中的元素
问题2: SyntaxError: non-default argument follows default argument
解决方法: 这句话的意思是,默认参数后面跟着非默认参数,在函数中,设置默认参数时,有两点需要注意:一是必选参数在前,默认参数在后,否则python的解释器会报错;二是当函数有多个参数时,把变化大的参数放前面,变化小的放后面,变化小的参数就可以作为默认参数
问题3:在构建Group类时,初始化函数显示一直缺少参数
解决方法: 一旦重写init方法, 父类中定义的属性将不会继承,这种情况下, 想要继承父类的属性, 必须手动调用父类的init方法
心得体会: 在学习本实验的过程中,中间有很多东西其实忘掉了,需要重新翻书看,在学习python的过程中,感觉python和上学期的C++相比,更加的方便,代码量简洁,因为python学习的时候需要学习大量函数,许多函数方法都已经做好了,直接调用库然后用就可以了。
感觉写实验报告跟平时书上看的例子确实不太相同,因为实验报告上的题目需要自己去思考,然后想出知识点相近的方法去实现它,这样才能更好的锻炼自己,同时检验自己学习的效果,对知识的巩固。
**意见与建议:**没什么建议其实,老师给的题目很好,写的时候能很好地锻炼自己的解题思维和敲代码能力。