实验二 Python序列结构

实验二 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学习的时候需要学习大量函数,许多函数方法都已经做好了,直接调用库然后用就可以了。

感觉写实验报告跟平时书上看的例子确实不太相同,因为实验报告上的题目需要自己去思考,然后想出知识点相近的方法去实现它,这样才能更好的锻炼自己,同时检验自己学习的效果,对知识的巩固。

**意见与建议:**没什么建议其实,老师给的题目很好,写的时候能很好地锻炼自己的解题思维和敲代码能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一只大狸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值