Python基础day10【异常、模块、包、面向对象版-学生管理系统】

  • 视频、源码、课件、软件、笔记:超全面Python基础入门教程【十天课程】博客笔记汇总表【黑马程序员】

 

目录

00、复习和反馈

01、异常的概念[了解]

02、捕获单个异常[掌握]

03、捕获多个异常[掌握]

3.1、写法1-合并写法

3.2、写法2-分开写法

04、打印异常信息[掌握]

05、捕获所有的异常[掌握]

06、异常的完整结构[掌握]

07、异常的传递[理解]

7.1、异常传递1-try嵌套

7.2、异常传递2-函数嵌套调用

08、抛出自定义异常[理解]

09、模块

9.1、模块的制作

9.2、模块的导入

9.3、模块中的变量__all__

9.4、模块中的变量__name__

9.5、模块的注意点

10、包的使用

11、学生管理系统-面向对象版

11.1、面向对象开发的一般方式

11.2、搭建框架代码

11.3、实现添加学生的功能

11.4、删除/修改/查询-学生信息

11.5、保存

11.6、读取

11.7、面向对象版-学生管理系统-代码汇总

11.7.1、main.py

11.7.2、student.py

11.7.3、student_manager_system.py


00、复习和反馈

多写多练

实例属性:类外部:实例对象.属性名 = 属性值类内部:self.属性 = 属性值(一般在__init__()中操作)类属性:类内部,方法外部直接定义的变量,就是类属性实例方法:直接定义的方法def 方法名(self):# 方法使用了实例属性self.属性pass
类方法:@classmethod def 方法名(cls):类名.类属性cls.类属性pass
静态方法:@staticmethod def 方法名():pass

01、异常的概念[了解]

当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"。

异常的组成:异常类型:异常具体的描述信息

异常:不确定是否会出现的问题!一定会出现的问题、确定存在的错误:bug。

# 异常: 程序运行过程中,代码遇到错误,给出错误的提示print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
num = 10 / int(num)
print('计算得到的结果是:', num)
print('其他的代码...')

02、捕获单个异常[掌握]

# 异常: 程序代码在运行过程中遇到的错误, 程序会报错、会终止程序代码的运行.
# 异常捕获: 是指在程序代码运行过程中,遇到错误,不让程序代码终止,让其继续运行,同时可以给使用者一个提示信息
# 并记录这个错误,便于后期改进
"""
try:可能发生异常的代码
except 异常的类型:发生异常执行的代码
"""print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:num = 10 / int(num)print('计算得到的结果是:', num)
except ZeroDivisionError:print('你输入有误,请再次输入!')print('其他的代码...')

03、捕获多个异常[掌握]

3.1、写法1-合并写法

"""
try:可能发生异常的代码...
except (异常类型1, 异常类型2, ...):发生异常执行的代码...
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:a = int(num)num = 10 / a# num = 10 / int(num)print('计算得到的结果是:', num)
except (ZeroDivisionError, ValueError):print('你输入有误,请再次输入。')
print('其他的代码...')

3.2、写法2-分开写法

"""
try:可能发生异常的代码
except 异常类型1:发生异常1执行的代码...
except 异常类型2:发生异常2执行的代码...
except ...:pass
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:a = int(num)num = 10 / a# num = 10 / int(num)print('计算得到的结果是:', num)
except ZeroDivisionError:print('你输入有误,请再次输入。')
except ValueError:print('输入有误,请输入数字。')
print('其他的代码...')

04、打印异常信息[掌握]

try:
    可能发生异常的代码...
except (异常的类型1, 异常类型2, ...) as 变量名:
    发生异常执行的代码...
    print(变量名)

"""
try:可能发生异常的代码...
except (异常的类型1, 异常类型2, ...) as 变量名:发生异常执行的代码...print(变量名)
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:a = int(num)num = 10 / aprint('计算得到的结果是:', num)
except (ZeroDivisionError, ValueError) as e:print('你输入有误,请再次输入。', e)print('其他的代码...')

05、捕获所有的异常[掌握]

try:
    可能发生异常的代码...
except:   # 缺点:不能获取异常的描述信息
    发生异常执行的代码...

try:
    可能发生异常的代码...
except Exception as e:
    发生异常执行的代码...
    print(e)
    pass

# Exception是常见异常类的父类,可以捕获所有Exception子类的异常。
ZeroDivisionError --> ArithmeticError --> Exception --> BaseException  --> object
ValueError --> Exception --> BaseException  --> object

print('其他的代码...')
num = input('请输入一个数字:')
try:a = int(num)num = 10 / aprint('计算得到的结果是:', num)f = open('1.txt', 'r')
except Exception as e:print('你输入有误,请再次输入。', e)print('其他的代码...')

06、异常的完整结构[掌握]

try:
    可能发生异常的代码...
except Exception as e:
    发生异常执行的代码...
    print(e)
else:
    代码没有发生异常,会执行...
finally:
    不管有没有发生异常,都会执行...

print('其他的代码...')
num = input('请输入一个数字:')
try:a = int(num)num = 10 / aprint('计算得到的结果是:', num)
except Exception as e:print('你输入有误, 请再次输入。', e)
else:print('没有发生异常, 我会执行。')
finally:print('不管有没有发生异常, 我都会执行。')print('其他的代码...')

07、异常的传递[理解]

异常的传递:是Python异常处理的底层机制,是原理层面上的,不需要我们自己写代码实现,是Python已经实现好的。

异常传递:当一行代码发生异常之后,会向外层将这个异常进行传递,指导被捕获或者程序报错为止。1.try 嵌套;2.函数嵌套。

7.1、异常传递1-try嵌套

print('其他的功能代码...')
num = input('请输入数字:')
try:try:a = int(num)  # ValueErrorexcept ZeroDivisionError:print('发生异常。')finally:print('finally我都执行了...')num = 10 / aprint(f'计算的结果:<<{num}>>')
except Exception as e:print(e)print('其他的功能代码...')

7.2、异常传递2-函数嵌套调用

 

异常传递总结:

  1. 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理;如果外边的try依然没有捕获到,那么再进行传递。
  2. 如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中;如果函数B有异常处理,那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样。
  3. 注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行。
def func1():print('-------1---------')num = input('请输入数字:')  # 0num = 10 / int(num)  # 假设0是计算的出来的print(num)print('-------2---------')def func2():print('-------3---------')func1()print('-------4---------')try:print('-------5---------')func2()print('-------6---------')
except Exception as e:print('-------7---------')print(e)# 5 3 1 7

08、抛出自定义异常[理解]

程序代码为什么会报错?
因为不符合语法,因为python的作者在代码中使用了if判断,如果除数为0,就会在代码中抛出异常错误。
抛出异常:raise异常对象  # 当程序代码遇到raise的时候,程序就报错了。
    
异常对象 = 异常类(参数)  

抛出自定义异常:
    1.自定义异常类,继承Exception或者BaseException; 
    2.选择书写,定义__init__方法,定义__str__方法;
    3.在合适的时机抛出异常对象即可。

# 定义异常类, 密码长度不足的异常
class PasswordLengthError(Exception):def __str__(self):return 'xxxxxx'passdef get_password():  # 等同于系统定义函数password = input('请输入密码:')if len(password) >= 8:print('密码长度合格。')else:# 抛出异常raise PasswordLengthError('密码长度不足8位。')print('密码长度不足8位!!!')try:get_password()  # 调用系统的函数
except PasswordLengthError as e:print(e)print('其他代码...')

09、模块

import random
random.randint(a, b):产生[a,b]之间的随机整数,包含b。
import os

Python就是一个python代码文件,是别人已经写好的代码文件,文件中的函数类以及变量,我们都可以使用。
使用模块的好处:直接使用别人已经实现好的功能。

9.1、模块的制作

模块就是一个python文件
制作一个模块,其实就是定义一个python代码文件。
注意点:模块的名字要遵循标识符的规则(由字母、数字和下划线组成,不能以数字开头)。
模块中可以定义变量、定义函数、定义类。

9.2、模块的导入

想要使用模块中的内容,必须先导入模块 。
注意点:如果导入的是自己书写的模块,使用的模块和代码文件需要在一个目录中。

# 想要使用模块中的内容,必须先导入模块
# 导入模块方法1:import 模块名
# 使用:模块名.功能名
import my_module1
print(my_module1.num)  # 使用my_module1中的变量num
my_module1.func()  # 调用my_module1中的func函数
dog = my_module1.Dog()  # 调用my_module1中的类创建对象
dog.show_info()# 导入模块方法2:from 模块名 import 功能名1, 功能名2, ....
# 使用:功能名
# 注意点:如果存在同名的方法名,则会被覆盖
from my_module2 import func, num
from my_module1 import num
func()
print(num)# 导入模块方法3:from 模块名 import * # 将模块中所有的功能进行导入
# 使用:功能名
from my_module2 import *
print(num)
func()
dog = Dog()
dog.show_info()# as:起别名,可以对模块和功能起别名.
# 注意:如果使用as别名,就不能再使用原来的名字.
import my_module1 as mm1
from my_module1 import func as m1_func
from my_module2 import func as m2_func
mm1.func()
m1_func()
m2_func()

9.3、模块中的变量__all__

__all__变量,可以在每个代码文件中(模块中)定义,类型是元组、列表。
作用:影响‘form 模块名 import *’导入行为,另外两种导入行为不受影响。
1.如果没有定义__all__变量,模块中的所有功能都可以被导入;
2.如果定义__all__变量,只能导入变量中定义的内容。

9.4、模块中的变量__name__

9.5、模块的注意点

# 自己定义的模块名字,不要和系统中你要使用的模块名字相同
import random
import sys# 模块的搜索顺序:当前目录 ---> 系统目录 ---> 程序报错
# sys.path保存模块查找顺序
print(sys.path)  # ['F:\\JetBrains\\2pythonSpace\\pythonCode\\day10-异常和模块',...
a = random.randint(1, 5)
print(a)  # 4

10、包的使用

包:功能相近或者相似的模块放在一个目录中,并在目录中定义一个__init__.py 文件,这个目录就是包。

# 导入包方法1:import 包名.模块名
import my_package.my_module1
import my_package.my_module2 as mm2
my_package.my_module1.func()
# mm2.func()# 导入包方法2:from 包名.模块名 import 功能名
from my_package.my_module1 import func
from my_package.my_module2 import *
func()# 导入包方法3:from 包名 import *  # 导入的是__init__.py中的内容
from my_package import *
func()

11、学生管理系统-面向对象版

面向对象:编程思想(偷懒)

对象 = 管理系统类()
对象.start() 

管理系统类
类名:StudentManagerSystem
属性:
    所有学生信息
    学生列表 = []
    学生字典 = {'学号': 一个学生对象, ...}
方法:增删改查、显示菜单信息

学生:字典
类名:Student
属性:姓名name、年龄age、性别gender、学号stu_id(唯一)
方法:__init__、__str__

11.1、面向对象开发的一般方式

1.一个类作为一个 python 文件
2.定义一个main.py作为程序代码的启动文件

代码文件的组成(共3个):
    1.student.py   # 定义Student 类
    2.student_manager_system.py  # 定义管理系统类
    3.main.py  # 作为程序的启动代码

11.2、搭建框架代码

 

11.3、实现添加学生的功能

1.使用input()获取学生的信息
2.使用学生信息、创建学生对象
3.将学生对象添加的字典中

 

11.4、删除/修改/查询-学生信息

1.使用input()输入学生学号
2.判断学生信息是否存在
3.存在进行操作

def __remove_student(self):  # 2.删除学生# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.存在则进行操作,删除字典中的数据:del 变量[key]del self.stu_dicts[stu_id]print('学生已经删除.')else:print('学生信息不存在,无法删除...')def __modify_student(self):  # 3.修改学生信息# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.修改对象的属性:对象.属性名 = 属性值stu = self.stu_dicts[stu_id]  # 字典[key]stu.age = input('请输入新的年龄:')print('信息已经修改完毕.....')else:print('学生信息不存在,无法删除.....')def __search_student(self):  # 4.查询单个学生信息# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.输出学生对象的信息stu = self.stu_dicts[stu_id]  # 字典[key]print(stu)else:print('学生信息不存在,无法删除.....')

11.5、保存

字典:{'11': 对象, '22': 对象}     {'11': 0x100, '22': 0x200}
之前的学生信息保存方式:str({'11': 0x100, '22': 0x200})

把具体的学生信息保存到文件中:
11,aa,18,m
22,bb,16,f

for x in {}.values():  # 只需要学生对象的信息
    pass

def __save(self):  # 保存所有的学生信息f = open('student.txt', 'w', encoding='utf-8')for stu in self.stu_dicts.values():f.write(str(stu) + '\n')  # str(stu):调用student类中的__str__ 方法f.close()

11.6、读取

读取文件,一行内容就是一个学生信息。readlines:读取所有行,['11,aa,18,m\n', '22,bb,16,f\n']
将列表中的每一项数据转换为对象Student(id, name, age, gender)   '11,aa,18,m\n'.strip() ==> '11,aa,18,m'.split() ===> [11,aa,18,m]

def __load_info(self):  # 读取所有的学生信息try:f = open('student.txt', 'r', encoding='utf-8')buf_list = f.readlines()for buf in buf_list:buf = buf.strip()  # 去重\ninfo_list = buf.split(',')  # 列表# 创建对象# stu = student.Student(info_list[0], info_list[1], info_list[2], info_list[3])stu = student.Student(*info_list)  # *列表:将列表中的数据逐个赋给变量# 将对象添加到字典中stu_id = info_list[0]self.stu_dicts[stu_id] = stuf.close()except Exception:pass

11.7、面向对象版-学生管理系统-代码汇总

11.7.1、main.py

import student_manager_system as smsif __name__ == '__main__':stu_sms = sms.StudentManagerSystem()  # 创建对象stu_sms.start()  # 调用start()方法

11.7.2、student.py

class Student(object):def __init__(self, stu_id, name, age, gender):self.stu_id = stu_idself.name = nameself.age = ageself.gender = genderdef __str__(self):return f"{self.stu_id},{self.name},{self.age},{self.gender}"if __name__ == '__main__':stu = Student(1, 'aa', 18, 'm')print(stu)

11.7.3、student_manager_system.py

import studentclass StudentManagerSystem(object):def __init__(self):self.stu_dicts = {}@staticmethoddef __show_menu():print('1.添加学生')print('2.删除学生')print('3.修改学生信息')print('4.查询单个学生信息')print('5.查询所有的学生信息')print('6.退出系统')def __insert_student(self):  # 1.添加学生# 1.使用input()获取学生的信息stu_id = input('请输入学生学号:')# 代码优化:判断学生信息是否存在->学号是否存在->判断字典的key是否存在if stu_id in self.stu_dicts:  # key存在返回Trueprint('学生信息已经存在, 不需要再次添加.........')returnname = input('请输入学生名字:')age = input('请输入学生年龄:')gender = input('请输入学生性别:')# 2.使用学生信息,创建学生对象-学生类(参数)stu = student.Student(stu_id, name, age, gender)# 3.将学生对象添加的字典中:字典['key'] = 数据值self.stu_dicts[stu_id] = studef __remove_student(self):  # 2.删除学生# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.存在则进行操作:删除字典中的数据:del 变量[key]del self.stu_dicts[stu_id]print('学生已经删除.')else:print('学生信息不存在,无法删除...')def __modify_student(self):  # 3.修改学生信息# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.修改对象的属性:对象.属性名 = 属性值stu = self.stu_dicts[stu_id]  # 字典[key]stu.age = input('请输入新的年龄:')print('信息已经修改完毕.....')else:print('学生信息不存在,无法删除.....')def __search_student(self):  # 4.查询单个学生信息# 1.使用input()输入学生学号stu_id = input('请输入学号:')# 2.判断学生信息是否存在if stu_id in self.stu_dicts:# 3.输出学生对象的信息stu = self.stu_dicts[stu_id]  # 字典[key]print(stu)else:print('学生信息不存在,无法删除.....')def __show_all_info(self):  # 5.查询所有的学生信息for stu in self.stu_dicts.values():print(stu)def __save(self):  # 保存所有的学生信息f = open('student.txt', 'w', encoding='utf-8')for stu in self.stu_dicts.values():f.write(str(stu) + '\n')  # str(stu):调用student类中的__str__ 方法f.close()def __load_info(self):  # 读取所有的学生信息try:f = open('student.txt', 'r', encoding='utf-8')buf_list = f.readlines()for buf in buf_list:buf = buf.strip()  # 去重\ninfo_list = buf.split(',')  # 列表# 创建对象# stu = student.Student(info_list[0], info_list[1], info_list[2], info_list[3])stu = student.Student(*info_list)  # *列表:将列表中的数据逐个赋给变量# 将对象添加到字典中stu_id = info_list[0]self.stu_dicts[stu_id] = stuf.close()except Exception:passdef start(self):self.__load_info()while True:self.__show_menu()opt = input('请输入用来选择的操作编号:')if opt == '1':# print('1.添加学生')self.__insert_student()elif opt == '2':# print('2.删除学生')self.__remove_student()elif opt == '3':# print('3.修改学生信息')self.__modify_student()elif opt == '4':# print('4.查询单个学生信息')self.__search_student()elif opt == '5':# print('5.查询所有的学生信息')self.__show_all_info()elif opt == '6':self.__save()print('欢迎下次使用本系统......')breakelse:print('输入有误,请再次输入.')continueinput('...... 回车键继续操作.......')

  


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部