- 每日反馈
- day09知识回顾
- 00-今日课程内容
- 01-异常传递(异常穿透)[理解]
- 异常传递,就是try…except…嵌套, 内层try中的异常没有被成功捕获,可以传递到外层这种继续捕获该异常
- 如果外层还是没有捕获到,将会继续向外传递,知道程序终止.
- 内层没有捕获到TypeError,外层try结构继续捕获,捕获成功后进行处理
- 03-模块的导入[掌握]
- 模块: 别人或者自己已经写好的功能或者代码,可以通过导入模块的手段进行调用
- 模块的作用: 1.增加代码的复用率 2.是多人协同开发的基础 3.站在巨人的肩膀上
- 模块的导入方式:
- 1.全部导入 一次性将模块中所有可以被导入的功能全部导入进去
- 导入格式: import 模块名称
- 调用格式: 模块名称.功能名称
- 导入
- 调用
- 一次导入,可以使用random模块的所有功能
- 2.局部导入: 只导入模块中的一部分功能
- 导入格式: from 模块名 import 功能名
- 调用格式: 功能名称
- 导入
- 调用
- 局部导入只能使用被导入的功能名称
- print(random())
- 3.局部导入使用通配符 * (代表任意) : 导入模块中允许被导入的所有功能
- 导入格式: from 模块名 import *
- 调用格式: 功能名称
- 导入:
- 调用
- 无论使用通配符还是使用from import的形式将数据全部导入进来,最终这种导入形式都只能叫做局部导入
- 05-自定义模块[熟悉]
- 导入03-模块文件
- import 03-模块
- 注意: 如果我们想要将自己的代码作为模块导入到其他文件中进行使用,则该文件名称必须遵循标识符的命名规则,否则无法导入
- 回顾标识符命名规则: 1. 只能由字母数字下划线组成, 2. 不能使用关键字, 3. 严格区分大小写, 4. 不能使用数字开头
- 导入自定义模块
- 1. 如果我们自己书写的py文件满足标识符的命名规则就可以导入到其他文件作为模块使用
- (1)py文件 (2)文件名满足标识符命名规则
- 2.哪些数据可以在其他模块中被调用??? 定义的内容会保存到内存中的可以, 否则执行完就消失了,无法在其他文件中使用
- 可以导入到其他文件的功能类型: 全局变量, 函数, 类….
- 06-all的使用功能[熟悉]
- 07-包的创建[掌握]
- 08-包的使用[掌握]
- 09-模块中演示代码的书写位置[理解]
- 10-学生管理系统的需求分析[理解]
- 11-学生管理系统-框架搭建[掌握]
- 12-学生管理系统-从框架中抽取函数[掌握]
- 13-学生管理系统-添加学员[掌握]
- 14-学生管理系统-删除学员[掌握]
- 15-学生管理系统-修改学员[掌握]
- 16-学生管理系统-查询学员[掌握]
- 17-学生管理系统-展示所有学员[掌握]
- 18-学生管理系统-退出系统[掌握]
- 19-学生管理系统-数据持久化[熟练使用]
- 学生管理系统完整模
- 作业
- 作业提交
- 文件链接
每日反馈
代码一直记不住,除了那些常用的,其他的代码一直来回翻,怎么提高啊 |
---|
再讲一下finally写与不写的差别呗 |
代码一直记不住,除了那些常用的,其他的代码一直来回翻,怎么提高啊 ?
- 想敲代码不翻笔记几乎不可能,不要害怕翻笔记, 翻笔记 查百度,是程序员最重要的能力之一, 叫做检索能力.
- 如果需要提高自己的检索或者查询速度, 两个技巧: 1. 描述知识时使用专业用语. 2. 有自己的笔记
- 常用的知识,用几遍就记住了,不常用的不用记.
再讲一下finally写与不写的差别呗?
- 异常
- 异常传递(异常穿透)
- 手动抛出异常
- 模块
- 模块导入
- 自定义模块
- 包的导入
- 学生管理系统案例
try: print(‘外层try结构’) try:
# 内层try结构, 内层try中的代码出现的是TypeError异常,此时内层指定捕获的是NameError,无法成功捕获异常
print('内层异常')
print(1 + '123')
except NameError as error:
print('变量没有被定义')
内层没有捕获到TypeError,外层try结构继续捕获,捕获成功后进行处理
except TypeError as e: print(f’数据类型错误: {e}’)
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1280980/1657591980592-2fcb9924-4eac-4a21-8365-f9ba6f9373bf.png#clientId=u383a665a-9814-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=309&id=ub468a89e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=463&originWidth=719&originalType=binary&ratio=1&rotation=0&showTitle=false&size=67576&status=done&style=none&taskId=ud181714a-23d0-4043-b2a8-36ad0ab04f1&title=&width=479.3333333333333)
<a name="NyZwu"></a>
# 02-raise抛出异常[了解]
```python
# 手动抛出异常的关键字是raise
# raise Exception('这个异常我也不知道是什么!')
# 这个抛出异常的使用场景很多,比如我们现在要获取大家的年龄,如果年龄过大就出现异常
age = 18
if age >= 18:
print('年级太大了')
raise Exception('老年人警告!')
else:
print('我还是个小鲜肉')
# 手动抛出异常和判断的区别:
# 1.抛出异常的位置,是我们希望在开发阶段完全处理好,不希望有任何问题,安全层级较高.
# 2.使用判断的位置,是我们希望在代码运行阶段进行判断就可以了,安全层级较低.
练习:
- 我们在try中尝试打开一个文件,文件名手动输入
- 如果出现了异常,则提示文件不存在,并且以写入模式打开 该文件
- 如果没有异常,则输出读取到的数据
- 无论是否异常,都将文件关闭
file_name = input('请输入您要读取的文件名称:') try: file = open(file_name, 'r', encoding='utf8') except FileNotFoundError as e: print(f'出现了异常,{e}') # 如果出现了异常,我们就以写入模式打开文件 file = open(file_name, 'w', encoding='utf8') file.write('猫吃鱼,狗吃肉,奥特曼吃小怪兽!') else: print(file.read()) finally: file.close()
03-模块的导入[掌握]
```python模块: 别人或者自己已经写好的功能或者代码,可以通过导入模块的手段进行调用
模块的作用: 1.增加代码的复用率 2.是多人协同开发的基础 3.站在巨人的肩膀上
模块的导入方式:
1.全部导入 一次性将模块中所有可以被导入的功能全部导入进去
导入格式: import 模块名称
调用格式: 模块名称.功能名称
导入
import random
调用
一次导入,可以使用random模块的所有功能
print(random.randint(1, 3)) # 随机1-3的一个整数 print(random.random()) # 0.9479508588284316 随机浮点型数据,值在0-1之间
2.局部导入: 只导入模块中的一部分功能
导入格式: from 模块名 import 功能名
调用格式: 功能名称
导入
from random import randint
调用
局部导入只能使用被导入的功能名称
print(randint(1, 3))
print(random())
3.局部导入使用通配符 * (代表任意) : 导入模块中允许被导入的所有功能
导入格式: from 模块名 import *
调用格式: 功能名称
导入:
from random import *
调用
print(randint(1, 3)) print(random())
无论使用通配符还是使用from import的形式将数据全部导入进来,最终这种导入形式都只能叫做局部导入
<a name="BMNAK"></a>
# 04-给模块或功能起别名[掌握]
- 起别名时要注意,别名也要遵循标识符的命名规则
```python
# 导入模块或者功能时,有些模块名称太长,或者功能层级太多,可以起别名,简化调用过程
# 举例:import multiprocessing.process 名称过长, 可以起别名,便于调用
# import pandas as pd
# import numpy as np
# 1.给模块起别名 模块名 as 别名
# 不要在标识符中出现中文,因为存在编码问题,部署到服务器上很容易出现问题.
# 警告: 你的代码中除了注释,不要出现中文,如果再linux环境中,安装任何软件,路径中不能存在中.
import random as rd
print(rd.randint(1, 3))
# 思考: 起别名之后,之前的模块名还能够使用么? 不行,起别名之后,在当前的文件中,只能使用别名,原名称失效
# NameError: name 'random' is not defined
# print(random.randint(1,3))
# 2.给功能起别名 功能名称 as 别名
from random import randint as rdt
print(rdt(1, 3))
# 思考: 起别名之后,之前你的功能名称还能够使用么? 不行,起别名之后,在当前文件中,之鞥呢使用别名,原名称失效
# NameError: name 'randint' is not defined
# print(randint(1, 3))
# 3.如果有多个功能名称,我们需要使用多个as进行命名
# 如果需要一次导入多个功能,直接在功能名称中间加,即可
# from random import randint, random, randrange
from random import randint as rdt, random as rd, randrange as rdg
print(rd())
print(rdt(1, 3))
print(rdg(1, 10, 3))
# print(random())
# print(randint(1, 3))
# print(randrange(1,10))
05-自定义模块[熟悉]
- 模块名要遵循标识符的命名规则
- 只有模块中可以储存到内存中的数据才可以导入到其他文件中
```python
导入03-模块文件
import 03-模块
注意: 如果我们想要将自己的代码作为模块导入到其他文件中进行使用,则该文件名称必须遵循标识符的命名规则,否则无法导入
回顾标识符命名规则: 1. 只能由字母数字下划线组成, 2. 不能使用关键字, 3. 严格区分大小写, 4. 不能使用数字开头
导入自定义模块
import my_module
1. 如果我们自己书写的py文件满足标识符的命名规则就可以导入到其他文件作为模块使用
(1)py文件 (2)文件名满足标识符命名规则
print(my_module.age) # 18 导入成功
2.哪些数据可以在其他模块中被调用??? 定义的内容会保存到内存中的可以, 否则执行完就消失了,无法在其他文件中使用
可以导入到其他文件的功能类型: 全局变量, 函数, 类….
my_module.func1() # 我是一个孤独的函数
my_module模块
```python
age = 18
def func1():
print('我是一个孤独的函数')
06-all的使用功能[熟悉]
# 局部导入使用统配符的导入形式:
# 思考: 我们是如何知道import* 导入的是什么是功能的呢???
# 分析:肯定是有变量控制了导入功能的列表,其实这个变量就是我即将要学习的__all__变量
# from my_module_all import *
# 1.当我们不写__all__变量时,可以获取模块中所有的功能
# print(age)
# func1()
# 2. 当__all__ = []时,所有的功能将无法被使用
# print(age) # NameError: name 'age' is not defined
# func1() # NameError: name 'func1' is not defined
# 3.当我们使用的是__all__ = [功能名称时], 则我们使用from 模块名 import * 导入的只有[]内书写了的功能
# 例如:写入__all__ = ['age']
# print(age)
# func1() # NameError: name 'func1' is not defined
# 4.无论是否修改了__all__都不影响全部导入数据
# import my_module_all
#
# print(my_module_all.age) # 18
# my_module_all.func1() # 我是一个孤独的函数
# 5.无论是否修改了__all__, 都不影响局部导入的使用
from my_module_all import func1
func1() # 我是一个孤独的函数
# 总结:
# 1. __all__是为了防止使用局部导入时,导入的方法或函数太多及不可控,影响正常工作.
# 2.__all__只影响from...import * 的形式
# 建议: 在开发中,需要什么就导入什么,不要多也不要缺
07-包的创建[掌握]
方法一:
在工程目录中右键>>new>>Python Package 创建即可
输入文件名后,创建成功
#package包图标上有个圆点,且包内部会自带一个init.py文件
方法二:
在工程目录中右键>>new>>Directory创建即可, 注意此时不会自动创建init.py 需要手动创建
directory 和package区别: 1.图标上没有圆点, 2.没有init.py文件
手动创建init.py文件,创建成功后,itheima上也有了一个小白点
包: 就是将具有关联关系的一系列模块放在一个目录中,并且由init.py统一进行管理的功能组合.
08-包的使用[掌握]
# 包的导入方式(包中模块或功能的导入方式)
# 方式一:
# 导入方式: import 包名.模块名
# 调用方式: 包名.模块名.功能名称
# 导入:
import itheima.my_module02
# 调用:
itheima.my_module02.func1()
# 方式二:
# 导入方式: from 包名 import 模块名
# 调用方式: 模块名.功能名称
# 导入
from itheima import my_module02
# 调用
my_module02.func1()
# 方式三:
# 导入方式: from 包名.模块名 import 功能名称 或者使用 *
# 调用方式: 功能名称
# 导入:
from itheima.my_module02 import func1
# 调用
func1()
# 方式四:
# 导入方式:from 包名 import *
# 调用方式:模块名.功能名
from itheima import *
# 此时什么也调用不了,因为没有在__all__中填写模块名称
# 在__init__.py文件中,可以通过__all__变量中保存的值,判断可以使用*导入的模块
# 在包中如果__all__什么也不写,则无法使用任何模块
# my_module02.func()
# my_module01.func()
# 当我在__init__.py文件中添加了 __all__ = ['my_module01']后 该可以使用, my_module02.依旧不可以
my_module01.func1() # 我是一个孤独的函数
# my_module02.func1() # NameError: name 'my_module02' is not defined
# 注意: 如果再模块中不写__all__则from import* 可以导入一切内容.如果再包中不写,则什么模块也用不了
init.py文件
__all__ = ['my_module01']
09-模块中演示代码的书写位置[理解]
# 导入模块
import my_module_test
# 思考: 仅仅导入模块什么也没有做, func1就执行了? 为什么会这样呢?
# 我们模块导入到文件中时,模块内所有的代码会执行一遍,变量,函数,类等就会加载到内存中.供我们在其他文件中使用.
# 所以我们在这个文件中虽然什么也没有做,但是在模块中我们调用了func1.
# 我们希望在不调用任何模块中的功能时,执行func1函数呢??? 不希望
# 我们希望使用模块时,我们调用才执行,不调用不对当前产生任何影响.
# 思考: 我们可能可以让演示代码或者测试代码,只有在模块中运行时才执行,导入到其他文件中时不执行????
# 可以:
# 当我们将模块导入到其他文件中时,该模块中的__name__变量的值为模块名
# 当我们在该模块中执行代码时,该模块中的__name__变量的值为__main__
print(__name__) # __main__
my_module_test.py
age = 18
def func1():
print('我是一个孤独的函数')
print('__name__: ',__name__)
# 当我们在模块中执行程序时: __name__: __main__
#如果导入其他文件中: __name__: my_module_test
# 思考: 能不能根据__name__值的变化,控制演示代码是否执行????
if __name__ == '__main__':
# 如果 __name__ == __main__ 证明我们在模块中执行程序,此时可以执行演示代码
# 我想测试一下模块中书写的函数能否正常执行!!!
func1()
print('这个函数测试完毕')
# 小技巧: 我们再pycharm中定格书写main 自动提示 if __name__ == '__main__':
10-学生管理系统的需求分析[理解]
"""
需求:进入系统显示系统功能界面,功能如下:
1、添加学员
2、删除学员
3、修改学员信息
4、查询学员信息
5、显示所有学员信息
6、退出系统
系统共6个功能,用户根据自己需求选取。
"""
# 分析步骤:
# 1.展示该系统的功能列表
# 2.获取用户输入的功能编号
# 3.根据功能编号选择要执行的功能
# 4.循环执行上述内容(因为不输入6号命令,不会主动退出系统)
# 分析: 如果我们想要保存学员信息,我们需要使用什么容器来进行保存??? 字典
# 保存一个学员的信息,由于维度较少,我们建议使用字典,可以快速存取学员信息
# 如果我想保存多个学员信息需要使用什么样的数据容器呢???列表
# 所以最终选择的保存学员信息的容器类型 是列表嵌套字典的形式
# 举例
students_list = [
{'name': '小明', 'age': 18, 'stu_id': '001'},
{'name': '小强', 'age': 19, 'stu_id': '002'}
]
11-学生管理系统-框架搭建[掌握]
# TODO: 4. 循环
while True:
# TODO: 1. 展示功能列表
print('-' * 20)
print('欢迎登录学员管理系统')
print('1: 添加学员')
print('2: 删除学员')
print('3: 修改学员信息')
print('4: 查询学员信息')
print('5: 显示所有学员信息')
print('6: 退出系统')
print('-' * 20)
# TODO: 2. 获取用户输入的功能编号
option = input('请输入您要执行功能的编号:')
# TODO: 3. 根据功能编号选择要执行的功能
if option == '1':
print('添加学员')
elif option == '2':
print('删除学员')
elif option == '3':
print('修改学员')
elif option == '4':
print('查询学员')
elif option == '5':
print('展示所有学员')
elif option == '6':
print('退出系统')
else:
print('输入数据有误,请重新输入')
# 书写一个input用来阻塞功能代码,让功能执行完成后停顿一下,让我们更容易观察
input()
12-学生管理系统-从框架中抽取函数[掌握]
# 一个完整的功能可以抽取成一个函数
# 分析: 我们目前有哪些内容可以抽取函数????
# 1. 展示功能列表
# 3. 根据功能编号选择要执行的功能
# 功能列表中的每一个功能都可以抽取成一个函数,而不是仅仅打印就可以了
# TODO: 1. 抽取功能列表函数
def print_info():
"""展示功能列表"""
print('-' * 20)
print('欢迎登录学员管理系统')
print('1: 添加学员')
print('2: 删除学员')
print('3: 修改学员信息')
print('4: 查询学员信息')
print('5: 显示所有学员信息')
print('6: 退出系统')
print('-' * 20)
# TODO: 2. 抽取选择功能函数
def choose_option(option):
"""根据功能编号选择要执行的功能"""
# TODO: 3. 逐一用函数替换打印效果
if option == '1':
# print('添加学员')
add_student()
elif option == '2':
# print('删除学员')
delete_student()
elif option == '3':
# print('修改学员')
modify_student()
elif option == '4':
# print('查询学员')
search_student()
elif option == '5':
# print('展示所有学员')
show_students()
elif option == '6':
# print('退出系统')
exit_program()
else:
print('输入数据有误,请重新输入')
# TODO: 3. 将所有的功能抽取成函数
def add_student():
"""添加学员"""
print('添加学员')
def delete_student():
"""删除学员"""
print('删除学员')
def modify_student():
"""修改学员"""
print('修改学员')
def search_student():
"""查询学员"""
print('查询学员')
def show_students():
"""展示所有学员"""
print('展示所有学员')
def exit_program():
"""退出系统"""
print('退出系统')
# 循环
while True:
# # 展示功能列表
# print('-' * 20)
# print('欢迎登录学员管理系统')
# print('1: 添加学员')
# print('2: 删除学员')
# print('3: 修改学员信息')
# print('4: 查询学员信息')
# print('5: 显示所有学员信息')
# print('6: 退出系统')
# print('-' * 20)
# TODO: 1. 功能列表函数调用
print_info()
# 获取用户输入的功能编号
option = input('请输入您要执行功能的编号:')
# 根据功能编号选择要执行的功能
# if option == '1':
# print('添加学员')
# elif option == '2':
# print('删除学员')
# elif option == '3':
# print('修改学员')
# elif option == '4':
# print('查询学员')
# elif option == '5':
# print('展示所有学员')
# elif option == '6':
# print('退出系统')
# else:
# print('输入数据有误,请重新输入')
# TODO: 2.调用选择功能函数
choose_option(option)
# 书写一个input用来阻塞功能代码,让功能执行完成后停顿一下,让我们更容易观察
input()
13-学生管理系统-添加学员[掌握]
# TODO: 1. 创建全局变量, 用来保存学员信息
students_list = [
{'name': '小明', 'age': '18', 'stu_id': '001'},
{'name': '小强', 'age': '19', 'stu_id': '002'}
]
.....
.....
def add_student():
"""添加学员"""
# TODO: 2. 获取我们要添加学员的学号
stu_id = input('请输入您要添加的学员的学号:')
# TODO: 3. 循环遍历,判断学号是否重复
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# TOO: 4. 如果重复,则不能添加学员,提示该学员已存在
print('该学员已经存在,添加学员失败')
# 当我们找到与输入的id相同的学员时,没必要继续查询,因为学员id 不重复
break
else:
# 当所有的学员遍历完成,但是没有执行break 证明所有学员的id 均与输入的id 不相同
# TODO: 5. 如果不重复,则可以继续添加学员的姓名和年龄,
name = input('请输入您要添加学员的姓名:')
age = input('请输入您要添加学员的年龄:')
# 保存到students_list中
students_list.append({'name': name, 'age': age, 'stu_id': stu_id})
14-学生管理系统-删除学员[掌握]
def delete_student():
"""删除学员"""
# TODO: 1. 获取要删除学员的学号
stu_id = input('请输入您要删除学员的学号:')
# TODO: 2.循环遍历,查看该学号是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# TODO: 3.如果存在,则删除该学员
# 由于student_info就是该字典,所以可以直接删除,并且学号不重复,所以相同值的字典仅有一个
students_list.remove(student_info)
# 删除完成后直接结束循环,因为学员唯一
break
else:
# 所有学员都遍历完成没有找到该学号的学员,证明此人不存在
# TODO: 4.如果不存在,则提示查无此人
print('该学员不存在,请核对后再删除')
15-学生管理系统-修改学员[掌握]
def modify_student():
"""修改学员"""
# TODO: 1. 获取要修改学员的学号
stu_id = input('请输入您要修改的学员的学号:')
# TODO: 2. 循环遍历查看学员是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# TODO: 3. 如果存在则修改其姓名年龄
student_info['name'] = input('请输入您要修改为什么姓名:')
student_info['age'] = input('请输入您要修改为什么年龄:')
# 学员不会重复,所以查询到以后退出循环即可
break
else:
# 当所有学员遍历完成,学员不存在时,证明没有该学号的学员
# TODO: 4. 如果不存在提示查无此人
print('该学员不存在,请核对后再修改')
16-学生管理系统-查询学员[掌握]
def search_student():
"""查询学员"""
# TODO: 1. 获取用户查询学员的学号
stu_id = input('请输入您要查询的学员的学号:')
# TODO: 2.循环遍历,判断该学员是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# TODO: 3.如果存在,展示该学员信息
print(f'学员的姓名是{student_info.get("name")}, '
f'学员的年龄是{student_info.get("age")}, '
f'学员的学号是{student_info.get("stu_id")}')
# 学员不重复,查到指定学员后可以立即终止循环
break
else:
# 如果所有学员遍历完成后依然没有查到,证明该学号学员不存在
# TODO: 4.如果不存在,则提示查无此人
print('该学员不存在,请核对后再查询')
17-学生管理系统-展示所有学员[掌握]
def show_students():
"""展示所有学员"""
# TODO: 1.循环遍历,将所有学员信息获取到
for student_info in students_list:
# TODO: 2.打印每一个学员的基本信息
print(f'学员的姓名是{student_info.get("name")}, '
f'学员的年龄是{student_info.get("age")}, '
f'学员的学号是{student_info.get("stu_id")}')
18-学生管理系统-退出系统[掌握]
def exit_program():
"""退出系统"""
# 此方法可以结束程序执行,直接退出程序
exit('退出学生管理系统,欢迎下次光临')
19-学生管理系统-数据持久化[熟练使用]
def exit_program():
"""退出系统"""
# 此方法可以结束程序执行,直接退出程序
# TODO: 2. 在退出系统前将数据持久化到磁盘中,再此之前数据在内存中
save_students_info()
exit('退出学生管理系统,欢迎下次光临')
# 现在每一次编辑学员信息后,重新启动程序,学员信息会丢失么?会丢失
# 因为我们所有的数据都是储存在变量中的,程序执行结束后,变量被销毁,数据丢失
# 如果我们想让每一次编辑的数据都保存下来则需要进行数据持久化(保存在磁盘中)
# 保存数据的手段就是文件读写
# TODO: 1. 定义保存所有学员信息的函数
def save_students_info():
"""保存所有学员信息"""
# 1. 以写入模式打开一个文件students_info.txt
file = open('students_info.txt', 'w', encoding='utf8')
# 2. 将student_list以字符串的形式写入文件中
file.write(str(students_list))
# 3.关闭文件
file.close()
# TODO: 3.定义加载学员信息的函数
def load_students_info():
"""加载学员信息"""
# 在程序结束后将数据存储到磁盘中,并不能将数据持续更改,还需要在程序启动时先将数据读取出来,保存到全局变量中
# 第一次加载数据时文件一定不存在,所以我们需要进行异常处理
try:
# 1. 以读取的方式打开students_info.txt
file = open('students_info.txt', 'r', encoding='utf8')
# 2.将student_info中的数据读取出来,转换成列表类型,赋值给student_list
students_list = eval(file.read())
# 3.关闭文件
file.close()
except:
students_list = []
return students_list
# TODO: 4. 加载数据,赋值给全局变量
students_list = load_students_info()
学生管理系统完整模
# 抽取功能列表函数
def print_info():
"""展示功能列表"""
print('-' * 20)
print('欢迎登录学员管理系统')
print('1: 添加学员')
print('2: 删除学员')
print('3: 修改学员信息')
print('4: 查询学员信息')
print('5: 显示所有学员信息')
print('6: 退出系统')
print('-' * 20)
# 抽取选择功能函数
def choose_option(option):
"""根据功能编号选择要执行的功能"""
if option == '1':
add_student()
elif option == '2':
delete_student()
elif option == '3':
modify_student()
elif option == '4':
search_student()
elif option == '5':
show_students()
elif option == '6':
exit_program()
else:
print('输入数据有误,请重新输入')
def add_student():
"""添加学员"""
# 获取我们要添加学员的学号
stu_id = input('请输入您要添加的学员的学号:')
# 循环遍历,判断学号是否重复
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# 如果重复,则不能添加学员,提示该学员已存在
print('该学员已经存在,添加学员失败')
# 当我们找到与输入的id相同的学员时,没必要继续查询,因为学员id 不重复
break
else:
# 如果不重复,则可以继续添加学员的姓名和年龄,
name = input('请输入您要添加学员的姓名:')
age = input('请输入您要添加学员的年龄:')
# 保存到students_list中
students_list.append({'name': name, 'age': age, 'stu_id': stu_id})
def delete_student():
"""删除学员"""
# 获取要删除学员的学号
stu_id = input('请输入您要删除学员的学号:')
# 循环遍历,查看该学号是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# 如果存在,则删除该学员
students_list.remove(student_info)
# 删除完成后直接结束循环,因为学员唯一
break
else:
# 所有学员都遍历完成没有找到该学号的学员,证明此人不存在
# 如果不存在,则提示查无此人
print('该学员不存在,请核对后再删除')
def modify_student():
"""修改学员"""
# 获取要修改学员的学号
stu_id = input('请输入您要修改的学员的学号:')
# 循环遍历查看学员是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# 如果存在则修改其姓名年龄
student_info['name'] = input('请输入您要修改为什么姓名:')
student_info['age'] = input('请输入您要修改为什么年龄:')
# 学员不会重复,所以查询到以后退出循环即可
break
else:
# 如果不存在提示查无此人
print('该学员不存在,请核对后再修改')
def search_student():
"""查询学员"""
# 获取用户查询学员的学号
stu_id = input('请输入您要查询的学员的学号:')
# 循环遍历,判断该学员是否存在
for student_info in students_list:
if student_info.get('stu_id') == stu_id:
# 如果存在,展示该学员信息
print(f'学员的姓名是{student_info.get("name")}, '
f'学员的年龄是{student_info.get("age")}, '
f'学员的学号是{student_info.get("stu_id")}')
# 学员不重复,查到指定学员后可以立即终止循环
break
else:
# 如果不存在,则提示查无此人
print('该学员不存在,请核对后再查询')
def show_students():
"""展示所有学员"""
# 循环遍历,将所有学员信息获取到
for student_info in students_list:
# 打印每一个学员的基本信息
print(f'学员的姓名是{student_info.get("name")}, '
f'学员的年龄是{student_info.get("age")}, '
f'学员的学号是{student_info.get("stu_id")}')
def exit_program():
"""退出系统"""
# 在退出系统前将数据持久化到磁盘中,再此之前数据在内存中
save_students_info()
exit('退出学生管理系统,欢迎下次光临')
def save_students_info():
"""保存所有学员信息"""
# 1. 以写入模式打开一个文件students_info.txt
file = open('students_info.txt', 'w', encoding='utf8')
# 2. 将student_list以字符串的形式写入文件中
file.write(str(students_list))
# 3.关闭文件
file.close()
def load_students_info():
"""加载学员信息"""
try:
# 1. 以读取的方式打开students_info.txt
file = open('students_info.txt', 'r', encoding='utf8')
# 2.将student_info中的数据读取出来,转换成列表类型,赋值给student_list
students_list = eval(file.read())
# 3.关闭文件
file.close()
except:
students_list = []
return students_list
# 加载数据,赋值给全局变量
students_list = load_students_info()
# 循环
while True:
# 功能列表函数调用
print_info()
# 获取用户输入的功能编号
option = input('请输入您要执行功能的编号:')
# 调用选择功能函数
choose_option(option)
input()
作业
作业提交
文件链接
百度云盘: 链接:https://pan.baidu.com/s/13TqhouBQ8h1lP2VFtQHgMw 提取码:lh3d
阿里云盘:「python+大数据79期基础」等文件 https://www.aliyundrive.com/s/G6iPqGFQgfJ