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-函数嵌套调用
![]()
异常传递总结:
- 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理;如果外边的try依然没有捕获到,那么再进行传递。
- 如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中;如果函数B有异常处理,那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样。
- 注意观察上图中,当调用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 osPython就是一个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,ffor 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('...... 回车键继续操作.......')
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

























