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()

      

原文地址:https://www.cnblogs.com/yuxiangyang/p/10738132.html