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文件中直接定义的其他名称(如函数,类等)