python异常&模块&包

1.异常

常见异常种类:

1.NameError:使用一个为被赋值的变量

2.SyntaxError:代码不符合python语法规定

3.IndexError:下标/索引超出范围

4.ZeroDivisionError:除数为0

5.KeyError:字典里不存在这个键

6.IOError:输入/输出操作失败,基本上是无法打开文件(比如你要读的文件不存在)

7.AttributeError:对象没有这个属性

8.ValueError:传入的值有错误

9.TypeError:类型错误,传入类型不匹配

10.ImportError:无法引入模块或包;基本都是路径问题或者名称错误

11.IndentationError:缩进错误,代码没有正确对齐

这些异常中,有一些异常是通过写程序时的疏忽导致的,比如命名错误,我们可以通过python提供的一场Traceback(追踪)来定位出错点,进行分析和改正。

这个时候只需要定义一下name即可 

然而有些异常是不可避免的,对于这些不可避免的异常,我们可以通过捕获并妥善处理,来防止程序因错误而终止

1.1异常处理(捕获异常)

python中使用try-except语句来处理异常,语法格式如下

try:
    尝试执行的代码块
except 异常类型 as 变量:
    检测到异常时要执行的代码块
else:
    没有检测到异常时,要执行的代码块
finally:
    无论是否检测到异常都要执行的代码块

1.1.1捕获指定异常

同时捕获多个异常时用元组的形式接收 

try:
    #尝试将用户输入的字符串类型转换为整型数据
    num1 = int(input("请输入:"))
except ValueError:    #只捕获值错误
    print("传入值错误")

try:
    #尝试将用户输入的字符串类型转换为整型数据
    num1 = int(input("请输入:"))
    print(num2)
except (ValueError,NameError):    #只捕获值错误和命名错误
    print("传入值错误/命名错误")

1.1.2捕获异常描述信息

我们可以生命捕获Exception,他是一个万能异常类,他能捕获程序中发生的任意非语法错误类型的一场,并允许我们获取异常的具体描述信息

try:
    #尝试将用户输入的字符串类型转换为整型数据
    num1 = int(input("请输入:"))
    print(num2)
except Exception as e:         #捕获程序中可能发生的任意非语法错误类型的异常,并将捕获到的异常对象(包含异常描述信息)保存到变量e中
    print("异常描述信息:",e)     #获取异常的具体描述信息

注意:用try-except对异常进行处理,如果有异常下面的代码还能继续执行

1.1.3 else语句

try:
    #尝试将用户输入的字符串类型转换为整型数据
    num1 = int(input("请输入:"))
except Exception as e:         
    print("异常描述信息:",e)     
else:
    print("转换成功")
    print(num1)

1.1.4 finally 语句

确保遇到错误也能执行的某些操作:如关闭文件,释放系统资源

print("打开文件")
try:
    print("文件操作")
except Exception as e:
    print("异常描述信息:",e)
else:
    print("操作成功")
finally:
    print("关闭文件")

注意:try-finally语句可以单独使用,也可以和except ,else结合使用

1.2抛出指定异常

在python中,如果你想要在自己的程序中主动抛出一个异常,可以使用raise语句来实现。raise语句允许你指定要抛出的异常类型和可选的异常信息

步骤:1.创建一个异常对象
              异常类型(异常具体描述信息)Exception(“    ”)

           2.使用raise语句抛出异常对象

python标准库中并未涵盖所有可能的异常类型,特别是那些与特定逻辑紧密相关的异常,例如“密码不足8位”或者“用户名不能为空”等。针对这种情况,我们可以自定义异常,以便更精确的描述程序中的错误情况。这样的自定义异常能够增强代码的可读性和可维护性。

应用:用户输入密码:如果密码长度不足8位,则系统会主动抛出异常。

def input_pwd():
    pwd = input("请输入密码:")
    if len(pwd) < 8:
        #抛出自定义异常
        raise Exception("密码长度不足8位,输入失败")
    print("输入成功")
    return pwd

#防止程序因异常而终止,对异常进行捕获操作
try:
    print(input_pwd())
except Exception as e:
    #输出异常描述信息
    print(e)

2.模块

含义:在python中一个.py文件即被视为一个模块,其中可以定义函数,变量等。

2.1:分类

2.1.1:内置模块

python提供了一个强大的标准库,内置了许多非常有用的模块,如copy,random,time,os等,这些模块可以直接使用,为开发者提供极大的便利

示例:导入random随机模块

import random
#生成一个1-3(包括1和3之间的随机整数)
num = random.randint(1,3)
print(num)

输出结果:可能是1/2/3

2.1.2:第三方模块【第三方库】

是由python社区或者其他开发者创建的,不是python官方标准的一部分,这些模块提供了各种额外的功能和工具,可以帮助开发者更高效的完成编程任务。

在使用第三方模块之前需要先下载和安装他们,python提供了一个名为pip的包管理工具,用于下载和安装第三方模块。

在命令行或者终端,使用pip安装第三方的命令通常如下:

pip install 模块命

示例:

pip install requests

2.1.3:自定义模块

自定义模块是自己在项目中定义的一些模块。在创建自定义模块时,应确保命名遵循python的标识符规定和变量的命名规范,并且要避免与python的内置模块以及已安装的第三方模块命名放生冲突,以防止模块功能出现异常或者无法使用。

2.2导入模块

随着程序的不断扩展和完善,一个.py文件中可能会包含大量的代码行、函数和变量等。为了便于维护和提高代码的可重用性,我们通常会将代码拆分为多个文件,即多个模块。这样做的好处是,当我们在其他模块中使用某个模块的功能时,只需简单导入该模块即可,从而提高了代码的可维护性和重用性。

注意:1.导入模块语句建议写在.py文件的开头部分,这样做有助于代码的组织和阅读,同时也符合一般的编程习惯。2.同一个模块在python程序中只需要导入一次,因为首次导入时,模块就已经被加载到内存中,无需再次导入,这样既节省了资源,也避免了潜在的命名冲突,有助于提高程序的效率和可维护性。

2.2.1 import 模块名 (as 别名):导入模块所有内容

在需要使用模块中的变量,函数或者类时,需要在前面加上"模块名."的前缀,以便正确的引用他们

test.py: 

name = 'test'


def func():
    print("c函数")

def fund():
    print("d函数")

main.py 

import test
test.func()

2.2.2 from 模块名 import 功能名:从模块中导入指定功能

from test import func
func()

from ...import...语句可以实现导入模块的所有内容,可以通过使用from ... import*来实现

from test import*
func()
print(name)

注意:在使用from...import...语句导入模块内容时,必须特别留意,确保不同变量间的内容不重名,否则会产生冲突。具体来说,若不同模块存在同名的变量,函数或类,后导入的内容会覆盖先导入的。为了避免这种情况,推荐使用import语句进行导入,这也难怪可以通过使用模块名来明确区分和使用不同的内容。

2.3以主程序的形式执行 

每个python模块都内置了一个特殊变量__name__,用于记录模块的名称。程序通过检查这个变量,可以确定代码实在哪个模块中执行的。如果一个模块是直接被运行的,而不是被导入到其他程序中,那么__name__的变量的值,就会被设置为“__main__"。相反,如果这个模块是被导入到其他模块中执行的,那么__name__变量的值就会被设置成该模块的模块名

test.py :

name = 'test'


def func():
    print("c函数")

def fund():
    print("d函数")

if __name__ == "__main__":
    #测试代码
    print(name)
    func()
    fund()

main.py:

import test

3.包

在python中,为了解决模块名重复的问题,引入了包(Package)的概念。

本质:组织和封装多个模块,以便更方便的进行模块化管理和使用

3.1导包

3.1.1 import 包名    :导包

注意:在导包时,__init__.py文件会自动执行,作为包初始化的一个环节。然而,为了保持报的清晰和高效,建议在__init__.py文件中避免编写过多或复杂的代码

3.1.2import 包名.模块名:导入包下的某一个模块

使用:包名.模块名.功能名

import pack01.test01

print(pack01.test01.name)

3.1.3 from 包名 import 模块名:导入包内指定的模块

使用功能:模块名.功能名

3.1.4 from 包名 import *

如果__init__.py文件中没有定义__all__变量或显式的导入包内的任何模块或子包,那么执行from 包名 import*时,他只会导入__init__.py文件中直接定义的内容(如函数,类,变量等),而不会导入包内其他模块或子包。

__all__变量:是一个列表,用于模块和包中控制from...import*...的导入行为。在模块中定义__all__列表时,使用from 模块名 import*将仅导入该列表中指定的元素(如函数,类,变量等)。同样的,当在包下的__init__.py文件中定义__all__列表时,执行from 包名 ,将仅导入该列表中明确指定的模块(如果列表中含模块名)或__init__.py文件中直接定义的其他名称(如函数,类等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值