异常、模块与包
首先创建一个Exception('××')对象,××是异常提示信息,然后用raise抛出这个异常对象。并没有打印出哈哈哈,因为抛出异常后代码不能继续往下执行了raise Exception("抛出一个异常")print("哈哈哈")funa()"""funa()raise Exception("抛出一个异常")Exception: 抛出一个异常"""用户输入密码,判断输入的长度是否大于等于6,如果
1 异常
1.1 常见异常种类
当python检测到一个错误时,解释器就无法继续执行了,会出现一些错误的提示,这就是所谓的“异常”。Traceback是异常的追踪信息,可以追溯到程序异常的具体位置,××Error是异常的类型,后面包含异常的具体信息。
- NameError:使用了一个还未被赋值的变量
- SyntaxError:代码不符合python语法的规定
- IndexError:下标/索引超出范围
- ZeroDivisionError:除数为零
- KeyError:字典里不存在这个键
- IOError:输入输出操作失败,基本上是无法打开文件(比如你要读的文件不存在)
- AttributeError:对象没有这个属性
- ValueError:传入的值有错误
- TypeError:类型错误,传入的类型不匹配
- ImportError:无法引入模块或包,基本上是路径问题或名称错误
- IndentationError:缩进错误,代码没有正确对齐
1.2 捕获异常的语法
针对异常的处理,可以根据控制台的错误提示找出出错点并分析改正,此外可以对异常进行捕获处理。第一种语法格式:
"""
语法格式一
try:
不确定是否能够正常执行的代码
except:
如果检测到异常,就执行这个位置的代码
"""
try:
print(abc)
except (TypeError,NameError):#可以声明捕获异常类型,但是当遇到其他异常类型时依然会报错,无法捕获异常。当要捕获多个异常类型时,可以把要捕获的异常类型的名字放到except后面,并以元组的形式返回
print("这行代码有错误")
try:
print(abc)
except (TypeError,NameError) as e:#as相当于取别名,e是变量名可以自定义,as e相当于把异常信息保存到e变量中
print("这行代码有错误")
print(e)
"""
这行代码有错误
name 'abc' is not defined
"""
第二种语法格式:
"""
语法格式二:
try:
可能引发异常现象的代码
except:
出现异常现象的处理代码
else:
没有捕获到异常执行的代码
"""
第三种语法格式:
"""
语法格式二:
try:
可能引发异常现象的代码
except:
出现异常现象的处理代码
else:
没有捕获到异常执行的代码
finally:
try代码块结束后运行的代码(无论是否检测到异常,都要执行的代码)
"""
1.3 抛出自定义异常
首先创建一个Exception('××')对象,××是异常提示信息,然后用raise抛出这个异常对象。并没有打印出哈哈哈,因为抛出异常后代码不能继续往下执行了
def funa():
raise Exception("抛出一个异常")
print("哈哈哈")
funa()
"""
C:\Python\python.exe C:/pythonProject/py1/py01.py
Traceback (most recent call last):
File "C:\pythonProject\py1\py01.py", line 4, in <module>
funa()
File "C:\pythonProject\py1\py01.py", line 2, in funa
raise Exception("抛出一个异常")
Exception: 抛出一个异常
Process finished with exit code 1
"""
用户输入密码,判断输入的长度是否大于等于6,如果输入的长度不足6位,就报错,即抛出自定义异常,并捕获该异常。
def login():
pwd=input("请输入您的密码:")
if len(pwd)>=6:
return "密码输入成功"
raise Exception("密码不足六位,输入失败")#抛出异常
try:
print(login())
except Exception as e:
print(e)
#捕获异常是为了检测到异常代码后还能继续往下运行,即程序不会终止
2 模块
2.1 模块定义和分类
在python中一个py文件就是一个模块,里面定义了一些函数和变量,需要的时候可以导入并使用这些模块。执行的步骤:
- 在python模块加载路径中查找相应的模块文件
- 将模块文件编译成中间代码
- 执行模块文件中的代码
2.1.1 内置模块
直接导入即可使用
2.1.2 第三方模块(第三方库)
需要下载,在cmd窗口(wins+r)输入pip install 模块名
2.1.3 自定义模块
自己在项目中定义的模块,注意命名要遵守标识符规定以及变量的命名规范,并且不能与内置模块的命名起冲突。
2.2 导入模块
第一种语法:import 模块名,调用:模块名.功能名
第二种语法:from 模块名 import 功能,调用:直接输入功能即可,不需要添加模块名
第三种语法:from 模块名 import *,将模块中的所有内容都导入。不建议过多使用from .. import ..声明,有时候命名冲突会造成一些错误
第四种语法:import 模块名 as 别名,给模块取别名;from 模块名 import 功能 as 别名,给功能取别名,导入多个功能使用逗号隔开
2.3 内置全局变量
if __name__ == "__main__"
用来控制py文件在不同的应用场景执行不同的逻辑
- 文件在当前程序执行(即自己执行自己):__name__ == "__main__"
- 文件被当作模块被其他文件导入:__name__ == 模块名
#py2
print("这是py21")
def test():
print("哈哈哈")
if __name__ == "__main__":
print("这是py22")
#这是py21
#这是py22
调用py2.test()时,if __name__ == "__main__"下方的代码不会被执行。会输出这是py21是因为python模块在首次导入时会执行顶层代码,包括顶层的print()语句和函数/变量的定义。
#py1
import py2
py2.test()
#这是py21
#哈哈哈
3 包
包就是项目结构中的文件夹/目录,将有联系的模块放到同一个文件夹下,并且在这个文件夹中创建一个名字为__init__.py文件,那么这个文件夹就称之为包,有效避免模块名称冲突问题,让结构更清晰。普通的文件夹是directory,包是python package。
导包的代码是import 包名,import导入包时,首先执行__init__.py中的代码,因此不建议在init文件中写大量代码。想导入包中具体某个模块,可以采用from 包名 import 模块名,因此可以将导入模块的代码放入__init__.py文件中。
__all__变量,本质上是一个列表,列表里的元素代表要导入的模块,可以控制要引入的东西(模块、函数、类等)。例如,py1包中包含__init__文件和register文件,py01文件想要调用py1包中的register文件:
#register
def reg():
print("这是注册函数")
#__init__
__all__ = ["register"]#相当于导入[]里面定义的模块
#py01
from py1 import *
register.reg()#这是注册函数
如果再在py1包中添加一个login文件,并在py01中调用,会报错
#register
def reg():
print("这是注册函数")
#login
def log():
print("这是登录函数")
#__init__
__all__ = ["register"]
#py01
from py1 import *
register.reg()
login.log()
"""
这是注册函数
Traceback (most recent call last):
File "C:\pythonProject\pythonProject1\py01.py", line 3, in <module>
login.log()
NameError: name 'login' is not defined
"""
也可以直接在py01中进行调用,此时__init__文件中不需要有任何内容
from py1 import register,login
register.reg()
login.log()
更多推荐
所有评论(0)