Python基础之模块+异常
一、模块相关概念
1、定义:包含一系列数据、函数、类的文件,通常以.py结尾。
2、作用:让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。有利于多人合作开发。
3、模块导入方式(三种):
1)、import导入法:
2)、from import导入法:
3)、from import *导入法:
4、模块变量:
5、模块分类:
6、加载过程:
二、包相关概念
1、定义:将模块以文件夹的形式进行分组管理。
2、作用:让一些相关的模块组织在一起,使逻辑结构更加清晰。
3、导入方式(三种):
4、包中的__init__.py文件作用:是包内必须存在的文件,会在包加载时被自动调用。
5、__all__变量在导包中的作用:记录from 包 import * 语句需要导入的模块
三、异常处理相关概念:
1、异常:
1)、定义:运行时检测到的错误。
2)、 现象:当异常发生时,程序不会再向下执行,而转到函数的调用语句。
3)、常见异常类型:
2、处理:
1)、语法:
2)、raise语句:
3)、自定义异常:
四、基础语法代码:
代码1:
""" 模块属性 # 练习: 将学生管理系统拆分为四个模块 # XXXModel ---> model 模型层 # XXXView ---> ui 表示层 # XXXController ---> bll 业务逻辑层 # 调用代码 ---> main 程序入口 """ from module01 import * fun01() # fun04() # 获取模块文档注释 import module01 print(module01.__doc__) # 获取模块文件路径 print(module01.__file__) # 获取模块名称 print(module01.__name__) #模块名 __main_
代码2:
""" 标准库模块 -- 时间 """ import time # 返回时间戳(1970年后经过的浮点秒数) # 1555579061.7284493 print(time.time()) # 时间戳 --> 时间元组(年 月 日 时 分 秒 星期 一年的第几天 夏令时) print(time.localtime(1555579061.7284493)) # 时间元组 --> 时间戳 print(time.mktime(time.localtime())) # 时间元组 --> 字符串 (时间的格式化) # time.localtime() --> str print(time.strftime("%Y %m %d %H:%M:%S", time.localtime())) print(time.strftime("%y %m %d %H:%M:%S", time.localtime())) # 字符串 --> 时间元组 print(time.strptime("2019 04 14", "%Y %m %d"))
代码3:
import time # 练习1:定义函数, 输入年月日,返回星期. # 星期一 星期二 星期三 ...... def get_week(year, month, day): time_tuple = time.strptime("%d/%d/%d" % (year, month, day), "%Y/%m/%d") weeks = { 0: "星期一", 1: "星期二", 2: "星期三", 3: "星期四", 4: "星期五", 5: "星期六", 6: "星期日", } # time_tuple[6] 从时间元组中获取星期数 return weeks[time_tuple[6]] print(get_week(2019, 4, 18)) # 练习2:定义函数:根据生日(年月日),返回活了多少天. # -- 根据年月日构建时间元组 # -- 根据构建的时间元组获取时间戳 # -- 使用当前时间戳 - 生日的时间戳 # -- 将活的秒数换算为天 def life_days(year, month, day): time_tuple = time.strptime("%d/%d/%d" % (year, month, day), "%Y/%m/%d") # time.mktime( time_tuple) life_seconds = time.time() - time.mktime(time_tuple) return life_seconds / 60 / 60 // 24 print(life_days(1984, 6, 11))
代码3:
""" 包(文件夹) # 练习1: 目标 -- 在实际项目结构中,随心所欲的调用不同模块成员. # 1. 根据目录结构,创建相应的包与模块. # 2. 在相应模块中,定义函数/类. # 3. 在main中,调用skill_manager模块中成员 # 4. 在skill_manager模块中调用skill_deployer模块成员 # 5. 在skill_data模块中,调用list_helper模块成员. """ # python程序结构 # 包 # 模块 # 类 # 函数()/方法() # 语句 # # 方式1:import 包.模块 # import package01.module01 # # 使用:包.模块.成员 # package01.module01.fun01() # # 方式2:from 包 import 模块 # from package01 import module01 # # 使用:模块.成员 # module01.fun01() # # 方式3: # from package01 import * # # 在包的__init__文件中,定义__all__ 属性 # module01.fun01() # [推荐] # from 包.模块 import 成员 from package01.module01 import * fun01()
代码4:
""" 异常处理 """ def div_apple(apple_count): # 分苹果 person_count = int(input("请输入人数:")) # ValueError result = apple_count / person_count # ZeroDivisionError print("每个人分类%d个苹果" % result) # 缺点:不能根据具体错误,做出相应处理逻辑. # try: # div_apple(10) # except Exception as e: # 捕获所有类型的异常 # print("分苹果失败啦") # try: # div_apple(10) # except ValueError: # 捕获ValueError类型的异常 # print("输入的人数有误") # except ZeroDivisionError: # 捕获ZeroDivisionError类型的异常 # print("人数不能是零") # except Exception as e: # 捕获所有类型的异常 # print("未知类型的错误") try: div_apple(10) except ValueError as e: # 捕获ValueError类型的异常 print("输入的人数有误") except ZeroDivisionError: # 捕获ZeroDivisionError类型的异常 print("人数不能是零") except Exception as e: # 捕获所有类型的异常 print("未知类型的错误") else: # 没有发生异常,执行的逻辑 print("分苹果成功喽") finally: print("无论是否发生异常,都执行的逻辑") print("后续逻辑.......")
代码5:
""" 自定义异常 练习:成绩异常(1-100) """ class AgeError(Exception): """ 封装错误信息 """ def __init__(self,msg,code,age_value): super().__init__(msg) self.msg = msg self.code = code self.age_value = age_value class Wife: def __init__(self,age): self.age = age @property def age(self): return self.__age @age.setter def age(self,value): if 20 <= value <= 30: self.__age = value else: # print("我不要") # raise ValueError("我不要") # 人为抛出异常 raise AgeError("我不要",27,value) try: w01 = Wife(80) print(w01.age) except AgeError as e: print("错误信息:",e.msg) print("错误代码行号:",e.code) print("输入的年龄是:",e.age_value)
代码6:
def get_score(): while True: try: number = int(input("请输入成绩:")) # except ValueError: except: print("输入有误") continue # 跳过本次循环 if 1<= number <= 100: return number print("成绩不在范围内") get_score()
代码7:
""" 学生管理系统 ui 界面----输入数据的异常处理 表示层 """ from bll import * from model import * class StudentManagerView: """ 界面视图类 """ def __init__(self): # 创建逻辑控制器对象 self.__manager = StudentManagerController() def __input_int(self, msg): while True: try: return int(input(msg)) except: print("输入有误") def __input_students(self): # 1. 在控制台中录入学生信息,存成学生对象StudentModel. stu = StudentModel() stu.name = input("请输入姓名:") # while True: # try: # stu.age = int(input("请输入年龄:")) # break # except: # print("输入有误") # # while True: # try: # stu.score = int(input("请输入成绩:")) # break # except: # print("输入有误") stu.age = self.__input_int("请输入年龄:") stu.score = self.__input_int("请输入成绩:") # 2. 调用逻辑控制器的add_student方法 self.__manager.add_student(stu) print(self.__manager) def __output_students(self, list_target): """ 显示学生列表信息 :return: """ # for stu in self.__manager.list_stu: for stu in list_target: # print(stu) print("%d -- %s -- %d -- %d" % (stu.id, stu.name, stu.age, stu.score)) def __output_student_by_score(self): """ 根据成绩显示所有学生信息 :return: """ list_target = self.__manager.order_by_score() self.__output_students(list_target) def __delete_student(self): # id = int(input("请输入需要删除的学生编号:")) id = self.__input_int("请输入需要删除的学生编号:") if self.__manager.remove_student(id): print("删除成功") else: print("删除失败") def __modify_student(self): """ 修改学生信息 :return: """ stu = StudentModel() # stu.id = int(input("请输入需要修改的学生编号:")) stu.id= self.__input_int("请输入需要修改的学生编号:") stu.name = input("请输入姓名:") # stu.age = int(input("请输入年龄:")) # stu.score = int(input("请输入成绩:")) stu.age = self.__input_int("请输入年龄:") stu.score = self.__input_int("请输入成绩::") if self.__manager.update_student(stu): print("修改成功") else: print("更新失败") def __display_menu(self): """ 显示菜单 :return: """ print("1) 添加学生") print("2) 显示学生") print("3) 删除学生") print("4) 修改学生") print("5) 按照成绩降序排列") def __select_menu(self): """ 选择菜单 :return: """ number = input("请输入选项:") if number == "1": self.__input_students() elif number == "2": self.__output_students(self.__manager.list_stu) elif number == "3": self.__delete_student() elif number == "4": self.__modify_student() elif number == "5": self.__output_student_by_score() def main(self): """ 界面入口方法 :return: """ while True: self.__display_menu() self.__select_menu()