每日反馈

代码一直记不住,除了那些常用的,其他的代码一直来回翻,怎么提高啊
再讲一下finally写与不写的差别呗

代码一直记不住,除了那些常用的,其他的代码一直来回翻,怎么提高啊 ?

  • 想敲代码不翻笔记几乎不可能,不要害怕翻笔记, 翻笔记 查百度,是程序员最重要的能力之一, 叫做检索能力.
  • 如果需要提高自己的检索或者查询速度, 两个技巧: 1. 描述知识时使用专业用语. 2. 有自己的笔记
  • 常用的知识,用几遍就记住了,不常用的不用记.

再讲一下finally写与不写的差别呗?

  • finally 中的代码无论try中的异常是否出现,,是否捕获成功,都会被执行
  • 如果卸载try..except结构之外的代码异常捕获不成功则不会继续执行

    day09知识回顾

    Day10-模块 综合案例 - 图1

    00-今日课程内容

  1. 异常
    1. 异常传递(异常穿透)
    2. 手动抛出异常
  2. 模块
    1. 模块导入
    2. 自定义模块
    3. 包的导入
  3. 学生管理系统案例
    1. 学员的增删改查操作
    2. 学员信息的读取和写入文件

      01-异常传递(异常穿透)[理解]

      ```python

      异常传递,就是try…except…嵌套, 内层try中的异常没有被成功捕获,可以传递到外层这种继续捕获该异常

      如果外层还是没有捕获到,将会继续向外传递,知道程序终止.

try: print(‘外层try结构’) try:

  1. # 内层try结构, 内层try中的代码出现的是TypeError异常,此时内层指定捕获的是NameError,无法成功捕获异常
  2. print('内层异常')
  3. print(1 + '123')
  4. except NameError as error:
  5. 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.使用判断的位置,是我们希望在代码运行阶段进行判断就可以了,安全层级较低.

练习:

  1. 我们在try中尝试打开一个文件,文件名手动输入
  2. 如果出现了异常,则提示文件不存在,并且以写入模式打开 该文件
  3. 如果没有异常,则输出读取到的数据
  4. 无论是否异常,都将文件关闭
    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 创建即可
image.png
输入文件名后,创建成功
#package包图标上有个圆点,且包内部会自带一个init.py文件
image.png
方法二:
在工程目录中右键>>new>>Directory创建即可, 注意此时不会自动创建init.py 需要手动创建
image.png
directory 和package区别: 1.图标上没有圆点, 2.没有init.py文件
image.png
手动创建init.py文件,创建成功后,itheima上也有了一个小白点
image.png
包: 就是将具有关联关系的一系列模块放在一个目录中,并且由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()

作业

将学生管理系统敲一遍交上来

作业提交

点击查看【jinshuju】

文件链接

百度云盘: 链接:https://pan.baidu.com/s/13TqhouBQ8h1lP2VFtQHgMw 提取码:lh3d
阿里云盘:「python+大数据79期基础」等文件 https://www.aliyundrive.com/s/G6iPqGFQgfJ