今天是基础课完结啦,最后那个学生管理系统最好自己再多写几遍,复盘复盘!!
异常捕获,导包,模块的内容,有一个内容被截掉了,记得补回去!
下面是今天的笔记内容:
# 异常:程序运行过程中,代码遇到错误,会终止程序代码的运行
num = input('请输入数字:')
num = 10 / int(num)
# 如果输入0就会发生异常
print(num)
# 异常的组成:‘异常类型’:‘具体的描述信息’
# 捕获异常:在运行过程中,遇到错误时不让程序终止,让其继续运行,同时给使用者一个提示信息
# 并记录这个错误,便于后期改进
# try: 可能发生异常的代码
# except (异常的类型1....): 发生异常的代码# try: 可能发生异常的代码
# except (异常的类型1....): 发生异常的代码
# try :
# except 异常类型1:
# except 异常类型2:
num = input('请输入数字:')
try:
num = 10 / int(num)
print(num)
except (ZeroDivisionError,ValueError): # 多个异常
print('输入错误')
num = input('请输入数字:')
try:
num = 10 / int(num)
print(num)
except ZeroDivisionError: # 多个异常
print('输入错误,不要输入0哦')
except ValueError:
print('只能输入数字哦')
# 打印异常信息
# try: 可能发生异常的代码
# except (异常的类型1....) as 变量名:
# 发生异常的代码
# print(变量名)
num = input('请输入数字:')
try:
num = 10 / int(num)
print(num)
except (ZeroDivisionError,ValueError) as e: # 多个异常
print('输入错误',e)
# 捕获所有的异常!!!
# try: 可能发生异常的代码
# except: 发生异常执行的代码 (缺点:不能获取异常的描述信息)
# 或者:
# 异常的完整结构:
# try:可能发生异常的代码
# except Exception as e: 发生异常执行的代码 print(e)
# else: 代码没有异常会执行
# finally: 不管有没有异常都会执行
# Exception 是常见异常类的父类
num = input('请输入数字:')
try:
num = 10 / int(num)
print(num)
# f = open('huiyu','r') # [Errno 2] No such file or directory: 'huiyu'
except Exception as e: # 多个异常
print('输入错误',e)
else:
print('没有发生异常')
finally:
print('不管有没有异常都会执行')
# 异常的传递(理解):是底层机制,原理层面
# 异常的传递:当一行代码发生异常之后,会向外城将这哥异常进行传递,只到被捕获或者程序报错为止
# try嵌套
print('other')
num = input('请输入数字:')
try:
try: # 内层try发生的异常没有被捕获,会向外层进行传递
a = int(num)
except ZeroDivisionError:
print('error')
finally:
print('执行啦')
num = 10 / a
print(num)
except Exception as e:
print(e)
# 函数嵌套 5-3-1-7
def func():
print('------1---------')
num = input('输入')
num = 10 / int(num)
print(num)
print('----2---------')
def func1():
print('------3-------')
func()
print('----4-------')
try:
print('5')
func1()
print('6')
except Exception as e:
print('7')
print(e)
# 抛出自定义异常(理解)
# 1.自定义异常类,继承Exception 或者BaseException
# 2.选择书写,定义__init__,__str__
# 3.在合适的实际抛出异常对象即可
class PasswordLength(Exception): # 继承父类的方法
pass
def get_password(): # 等同于系统定义函数
password = input('请输入密码:')
if len(password) >= 6:
print('hege')
else:
# 抛出异常,异常对象
raise PasswordLength('长度不对')
try:
get_password()
except PasswordLength as e:
print(e) # 异常类的 __str__
print('其他代码')
# 模块 random,os
# 模块就是一个代码文件,是别人已经写好的,文件中的函数类以及变量我们都可以使用
# 好处:直接使用别人已经实现好的功能
# 模块的制作:制作一个模块就是定义一个代码文件
# 模块的名字要遵循标识符的规则(由字母,数字,下划线构成,不能由数字开头)
# 模块中可以定义变量,可以定义函数,定义类
# 想要使用模块的内容,必须先导入模块
# 如果导入的是自己书写的模块,使用的模块和代码文件需要在同一个目录下
# 方法一:import 模块名 使用:模块名.功能名
# 方法二:from 模块名 import 功能名1,2...
# 使用:功能名
# 注意点:如果存在同名的方法名,则会被覆盖
# 方法三:from 模块名 import * ,将模块中的所有功能进行导入(不建议用)
# as 起别名,可以对模块和功能起别名
# 注意:如果使用了别名,就不能使用原来的名字
# 模块中的变量 __all__ = () 在模块前边写上这句话
# 该变量可以在每个模块中定义,类型是元组,列表
# 作用:只是影响 from 模块名 import * 这种导入行为
# 1. 如果没有定义该变量,模块中的所有功能,都可以被导入
# 2. 如果定义了改变了,只能导入变量中定义的内容
# __name__ 在每个模块中都有,是系统自己定义的
# 1.直接运行当前代码,值为__main__
# 2.把文件作为模块导入时,结果是my_cacl(文件名)
# 模块的注意点
# 自己定义的模块名字,不要和系统中的名字一致
# 模块的搜索顺序,当前目录-->系统目录-->报错
# 包:功能相近或者相似的模块放在一个目录中,
# 并在目录中定义 __init__.py文件,这个目录就是包
面向对象版本的学生管理系统:将其分成三个文件,放入同一个目录下,方便查看
(1)main.py
main.py # 程序启动
# 对象 = 管理系统类()
# 对象.start()
# 管理系统类,类名:StudentManagerSystem
# 属性:学生列表=[],学生字典={’学号‘:一个学生对象}
# 方法:增删改查,显示菜单信息
# 学生:字典 类名:Student 属性:姓名,年龄,性别,学号(唯一)
# 方法:init str
# 面向对象开发的一般方式:
# 1.一个类作为一个单独的python文件
# 2.定义一个main.py作为程序启动文件
# 代码文件的组成:student.py student_manager_system.py main.py
# 保存,把具体的学生信息保存到文件中
# for x in {}.values():pass
# 读取文件,一行内容就是一个学生信息
# readline 读取所有行,会有换行符
# 将列表中的每一项数据转换为数据
# Student(id,name,age,gender)
# .strip()去除换行符 .split() 分割
import student_manager_system as sms
if __name__ == '__main__':
stu_sms = sms.StudentMangerSystem()
stu_sms.start()
(2)student.py
class Student(object):
def __init__(self,stu_id,name,age,gender):
self.stu_id = stu_id
self.name = name
self.age = age
self.gender = gender
def __str__(self):
return f'{self.stu_id},{self.name},{self.age},{self.gender}'
if __name__ == '__main__':
stu = Student(1,'aa',15,'m')
print(stu)
(3)student_manager_system.py
import student
class StudentMangerSystem(object):
def __init__(self):
self.stu_dicts = {}
@staticmethod
def __show_menu(): # 功能菜单函数
print('1.添加学生')
print('2.删除学生')
print('3.修改学生信息')
print('4.查询单个学生信息')
print('5.查询所有学生信息')
print('6.退出系统')
def __insert_student(self):
# 判断学生信息是否存在,学号是否存在,key是否存在
stu_id = input('请输入学号:')
if stu_id in self.stu_dicts:
print('学生信息已经存在啦,不要再添加')
return
name = input('请输入姓名:')
age = input('请输入年龄:')
gender = input('请输入性别:')
stu = student.Student(stu_id,name,age,gender)
# 放入字典
self.stu_dicts[stu_id] = stu
def __remove_student(self):
stu_id = input('请输入要删除的学号')
if stu_id in self.stu_dicts:
# 删除字典中的数据 del 变量[key]
del self.stu_dicts[stu_id]
print('学生已删除')
else:
print('学生信息不存在')
def __modify_student(self):
stu_id = input('请输入要修改的学号')
if stu_id in self.stu_dicts:
# 修改
stu = self.stu_dicts[stu_id]
stu.age = input('请输入信息的年龄信息')
print('信息已经修改完毕....')
else:
print('学生信息不存在')
def __search_student(self):
stu_id = input('请输入要查询的学号')
if stu_id in self.stu_dicts:
# 删除字典中的数据 del 变量[key]
stu = self.stu_dicts[stu_id]
print(stu)
else:
print('学生信息不存在')
def __show_all_info(self):
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')
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() # 去除换行符
info_list = buf.split(',') # 列表
# 创建对象
stu = student.Student(*info_list)
# 将对象添加到字典中
stu_id = info_list[0]
self.stu_dicts[stu_id] = stu
f.close()
except Exception:
pass
def start(self): # 将整个定义成一个函数
self.load_info()
while True: # 多次进行
self.show_menu()
opt = input('请输入要选择对的操作编号:')
if opt == '1':
self.insert_student()
pass
elif opt == '2':
self.remove_student()
pass
elif opt == '3':
self.modify_student()
pass
elif opt == '4':
self.search_student()
pass
elif opt == '5':
self.show_all_info()
pass
elif opt == '6':
print('6.退出系统')
self.save()
break
else:
print('输入错误,请重新输入')
continue
input('.......回车键继续操作......')
多敲多练!一定要自己写到不会出bug!