python 异常 包 模块

本文介绍了Python中的异常处理机制,包括如何捕获并处理不同类型的异常,主动抛出异常的语法,以及如何编写异常完整语法。此外,还详细讲解了Python模块的使用,如`import`和`from import`导入方式,`__name__`属性,以及如何创建和使用包,特别是包内模块的导入方式。最后,文章提供了实际操作的练习帮助读者巩固这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、异常

  • 程序的错误有两种
  • 编码出错,不符合语言的语法
  • 运行时报错—异常
  • 程序运行期间要避免异常
  • 程序一旦出现异常就终止运行

捕获异常

  • 语法
try:
	可能出现异常的语句
except:
	出现异常后会自动执行的代码

如果try下面的代码没出现异常,那么except下面的代码不会执行
只有try下面的代码出现异常,except下面的代码才会执行
一旦异常被try捕捉,那么程序就不会报错终止
try:
    a=int(input("请输入一个整数"))
except:
    print("输入不正确")

在这里插入图片描述

捕捉不同类型异常
  • 语法
try:
	可能出异常的代码
except 异常类型1:
	出现异常类型执行的代码
except 异常类型2:
	出现异常类型执行的代码
except:
	出现未知异常执行的代码
try:
    a = int(input("请输入一个整数"))
    b = int(input("请输入一个整数"))
    print(a / b)
except ValueError:
    print("请输入一个可以转化整数")
except ZeroDivisionError:
    print("除数不能为0")
except:
    print("未知错误")

# ValueError: 输入的值不能转化为整数
# ZeroDivisionError: 除数为0 报错

练习–计算器
在这里插入图片描述

try:
    num1=int(input("请输入num1的值"))
    num2=int(input("请输入num2的值"))
    op1=input("请输入op1的值")
    if op1=="+":
        print(num1+num2)
    elif op1=="-":
        print(num1-num2)
    elif op1=="*":
        print(num1*num2)
    elif op1=="/":
        print(num1/num2)
    else:
        print("op1值不对")

except ValueError:
    print("请输入一个可以转化整数")
except ZeroDivisionError:
    print("除数不能为0")
except:
    print("未知错误")

没有异常发生执行的代码

  • 语法
try:
	可能出现异常的代码
except:
	发生异常要处理的代码
else:
	没有异常发生要执行的代码
try:
    a = int(input("请输入a的值"))
    b = int(input("请输入b的值"))
    print(a / b)
except:
    print("异常发生")
else:
    print("没有异常发生")
  • 捕捉未知异常显示系统异常提示信息
try:
    a = int(input("请输入a的值"))
    b = int(input("请输入b的值"))
    print(a / b)
except Exception as result:   # 捕捉未知异常,把未知异常系统的错误提示显示出来
    print(result)

无论是否异常都要执行的代码

try:
	可能出现异常的代码
except:
	出现异常要处理的代码
finally:
	无论是否异常都要执行的代码
try:
    a = int(input("请输入a的值"))
    b = int(input("请输入b的值"))
    print(a / b)
except:
    print("异常发生")
finally:
    print("不论是否异常都要执行的代码")
异常完整语法
try:
	可能出现异常的代码
except 指定异常类型1:
	异常执行代码
except 指定异常类型2:
	异常执行代码
except Exception as result:
	异常执行代码
else:
	没有异常执行代码
finally:
	无论是否有异常执行代码
try:
    a = int(input("请输入a的值"))
    b = int(input("请输入b的值"))
    print(a / b)
except ValueError:
    print("请输入正确的整数")
except ZeroDivisionError:
    print("除数不能为0")
except Exception as result:
    print("未知异常",result)
else:
    print("代码没有异常发生")
finally:
    print("代码执行完成")

主动抛出异常

  • 可以通过代码人为的抛出异常
  • 语法
raise Exception("异常描述")
  • 主动抛出的异常同样会导致程序报错终止
print("开始")
raise Exception("主动抛出的异常")  # 这个异常是人为抛出
# 不论什么样的异常,只有不捕捉,代码就会报错终止
print("结束")  # 这的print不执行了,因为上面代码已经抛出异常,程序终止了

捕捉主动抛出的异常

  • 不管是什么异常,都需要代码捕捉,不然程序会报错
# 计算器,当用户输入的不是+ - * /就会抛出异常,并捕捉这个异常
try:
    num1=int(input("请输入num1的值"))
    num2=int(input("请输入num2的值"))
    op1=input("请输入op1的值")
    if op1 !="+"and op1 !="-" and op1 !="*" and op1 !="/":
        raise Exception("请输入正确的+-*/")
    if op1=="+":
        print(num1+num2)
    elif op1=="-":
        print(num1-num2)
    elif op1=="*":
        print(num1*num2)
    else:
        print(num1/num2)

except Exception as result:
    print(result)

在这里插入图片描述
练习

在这里插入图片描述
在这里插入图片描述

# 设计个函数,如果参数str1中有数字返回true,否则返回false
def digital(str1):
    for n in str1:
        if n >= "0" and n <= "9":
            return True
    return False

try:
    name = input("请输入姓名")
    if digital(name):  # 条件成立,抛出异常
        raise Exception("名字不允许有数字")
    age = int(input("请输入年龄"))
    if age < 0:
        raise Exception("年龄不能小于0")
except Exception as result:
    print(result)
当一个函数返回一个布尔值,作为条件放到if或者while后面的时候
if 函数名 == True  等价 if 函数名  如果函数返回True,等于条件成立
	如果返回False等于条件不成立

如果一个函数返回False,那么就执行if语句
if not 函数名:

二、模块

  • 一个py文件就是一个模块
  • 一个项目是由多个py文件构成,所以说一个项目是多个模块构成
  • 模块名,也就是py文件名要符合变量的命名规则
    • 一般习惯模块名用小写字母,如果有多个单词,单词之间用下划线分隔

import

  • 在一个py文件中使用另一个py文件中内容,需要先使用import导入模块
  • 语法
import 模块名
模块名.函数
# 在module2.py里面使用module1.py中定义的函数
import module1
print(module1.my_sum(1,2))

module1.py

def my_sum(a,b):
    return a+b
  • 导入模块同时起一个别名
import 模块名 as 别名
别名.函数
# 在module2.py里面使用module1.py中定义的函数
import module1 as m
print(m.my_sum(1,2))

from import导入指定内容

  • 从指定模块中导入指定的内容
  • import 默认会把模块中所有内容导入,from import会有选择的导入内容
  • 语法一
from 模块名 import 函数名
调用函数的时候,不需要前面再接模块名.,直接写函数名调用即可
  • 语法二
from 模块名 import *
导入所有内容,使用内容的时候,不需要写模块名.

module1.py

def my_sum(a, b):
    return a + b

def my_max(a, b):
    if a > b:
        return a
    else:
        return b

module3.py

# 只导人module1中的my_max函数
from module1 import my_max
print(my_max(2,3))

__name__属性

  • 每一个py文件都有一个属性__name__
  • 如果这个py文件是正在执行的模块,那么name属性的值为main
  • 如果这个py文件是被其他py文件import导入调用的,那么name属性的值就是这个py文件的模块名module4.py

module4.py

def my_test():
    print(__name__)

my_test()  #当前如果执行的就是module4这模块,那么属性__name__的值为"__main__"(两个下划线)

module5.py

import module4
module4.my_test()  # 调用module4中的my_test函数
# 这的my_test会输出module4

  • 包就是一个特殊的目录
  • 一个目录下需要有__init__ .py文件
  • 使用包的目的是一次性可以把一个目录下所有的模块通过一条import语句导入

创建步骤演示

  • 第一步:在项目里建立一个目录my_pack
  • 第二步:在my-pack 目录里创建两个py文件 a1.py 和 a2.py 内容如下:
    a1.py
def my_max(a,b):
    if a>b:
        return a
    else:
        return b

a2.py

def my_sum(a,b):
    return a+b
  • 第三步:在my-pack 目录下创建__init__ .py文件

_ _ init_ _.py

from . import a1
from . import a2
  • 第四步:在my_pack的上级目录建立一个module6.py文件,建立这个文件的目的是要使用my_pack包
    module6.py
# module6 要使用包 my_pack
import my_pack
print(my_pack.a1.my_max(3,5))
print(my_pack.a2.my_sum(3,5))
  • 使用包中的函数
import 包名
包名.模块名.函数名

在这里插入图片描述

  • 使用包注意的点
    • 不管目录下多少模块
    • 只要在__init__.py文件中通过import导入模块才能使用
    • __ init___.py里面的from后面是个相对路径

导入包中指定函数

  • 语法
from 包.模块名 import 函数
直接写函数名调用函数即可
from my_pack.a1 import my_max
from my_pack.a2 import my_sum
print(my_max(4,5))
print(my_sum(4,5))

练习
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
m1.py

def m1_func():
    print('我是m1的func函数')

def m1_test():
    print('我是m1的test函数')

m2.py

def m2_func():
    print('我是m2的func函数')

__ init__.py

from . import m1
from . import m2

最后一步

# import my_pack1
# my_pack1.m1.m1_func()
# my_pack1.mi.m1_test()
# my_pack1.m2.m2_func()
from my_pack1.m1 import m1_func
from my_pack1.m1 import m1_test
from my_pack1.m2 import m2_func
m1_func()
m1_test()
m2_func()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值