1.异常
<1>异常:
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
<2>捕获异常 try...except...
目的:
不让程序崩溃,然后出现问题给用户进行良好的提示,增加代码的稳健性
格式:
try:
执行可能会发生异常的代码
excpet 异常类型:
如果代码发生异常会进入这个语句中
说明:
把可能出现问题的代码,放在try中
把处理异常的代码,放在except中
扩展:
except可以单独处理某些自己关注的异常
<3> except捕获多个异常
使用一个except 可以捕获多个异常类型
try:
执行可能会发生异常的代码
excpet (异常类型1, 异常类型2,...):
如果代码发生异常会执行这个语句
注意:
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
<4>获取异常的信息描述
try:
执行可能会发生异常的代码
excpet 异常类型 as e(临时变量,保存异常的信息描述):
如果代码发生异常会执行这个语句
as e 可以获取异常对象,print(e)可以打印异常信息
print(type(e))可以查看异常的类型
<5>捕获所有异常
如果不需要保存异常信息描述就用上面的方法,如果需要保存异常描述就用下面的方法。
注意:
以后不确定异常类型,可以统一使用Exception去捕获,因为多数异常类型都是继承Exception
<6> else 和 try...finally...
咱们应该对else并不陌生,在if中,它的作用是当条件不满足时执行的实行;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情
try...finally...语句用来表达这样的情况:在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
格式:
try:
执行可能会发生异常的代码
excpet 异常类型 as e: #as e 可以获取异常对象,print(e)可以打印异常信息
如果代码发生异常会执行这个语句
else:
如果程序没有异常会执行这个语句
finally: # finally语句必须放到异常捕获代码的最后面
有没有异常都会执行这个语句
<7>异常的传递
如果当期代码块没有捕获异常,那么异常信息会往上抛出,如果最外面也没有去捕获这个异常那么程序会崩溃,抛出这个异常
扩展:
异常传递的应用场景,如果里面的代码出现异常抛出信息打印显示不方便,我们可以在最外层进行捕获,然后进行处理
<8> 抛出自定义的异常
你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
raise不仅可以抛出自定义异常,还可以抛出系统的异常
<9> 异常处理中抛出异常
异常处理中抛出异常:就是使用except捕获住异常,然后不对异常进行处理,然后在抛出异常让外界进行处理这个异常。但是最外层一定要有try...except进行捕获处理,不然程序会报错。
2.判断语句(判断程序的入口)
if __name__ == '__main__':
main()
如果在本模块内打印__name__输出__main__
如果在其他模块导入后打印__name__输出导入的模块名
如果自测 应该调用main函数 (__name__ = __main__)
如果被其他模块正常使用的时候 不允许调用 (__name__ == 模块名)
3.模块
模块(module),就是.py文件,就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。
模块包括三大元素 全局变量 函数 类
模块的命名规则遵循标识符的命名规则,由字母、数字、下划线组成,不可以数字开头,并区分大小写
导入模块:
在一个模块导入另一个模块 会把这个模块中的内容都会执行一遍(也叫做扫描)
导入模块import
<1>import (全部导入)
导入格式: import 模块名
可以导入多个模块
导入格式: import 模块名1, 模块名2, 模块名3
调用格式:模块名.全局变量名 模块名.函数名 模块名.类名
<2>from…import (选择性导入)
导入格式: from 模块名 import 全局变量名, 函数名, 类名
调用格式:直接调用即
注意:
使用from导入指定功能代码,如果在当前模块提供相同的代码,那么会把导入模块的代码覆盖
<3>from … import * (全部导入 使用的时候不需要写模块名)
导入格式: from 模块名 import *
调用格式:直接调用即
<4> as 对全局变量名 函数名 类名 模块名 进行重命名
对全局变量名 函数名 类名 进行重命名
from 模块名 import 原全局变量名as 新全局变量名
对模块名 进行重命名
import 原模块名 as 新模块名
<5>定位模块
import sys
print(sys.path)
导入sys模块,使用sys.path查看模块导入的顺序,默认在当前目录下查找,如果找到了就直接使用
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
1. 当前目录
2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
4. 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
<6>模块中的__all__
模块中的__all__ 是配合其他模块中导入模块格式(from 模块名 import *)使用
只有在__all__里面的字符串标识符才可以被导入使用
__all__ = ["name", "add2num", "Person"]
4.python中的包
变量 -> 函数 -> 类 -> 模块 -> 包
包的定义:
把不同模块(.py文件)放到文件夹里面进行管理就是一个包,但是要有一个前提是文件夹里面必须有一个__init__.py的文件
包的作用:
包是管理不同模块的
注意:
直接导入包名的时候,默认不可以使用包里面的模块,但是可以在__init__文件里面进行配置使用
从包里面导入指定模块:from 包名(当前包可以用.(点)代替) import 模块名
在包外面的模块中如何访问包内部模块中的元素 (全局变量 函数 类)
格式1:
import 包名.模块名
调用格式:
包名.模块名.全局变量 | 函数名 | 类名
格式2:
from 包名 import 模块名
调用格式:
模块名.全局变量 | 函数名 | 类名
格式3:
from 包名 import *
调用格式:
模块名.全局变量 | 函数名 | 类名
必须和包中的__init__.py配合 只有在__init__.py中的__all__存在的字符串模块名 才可以导入使用
总结:
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
有效避免模块名称冲突问题,让应用组织结构更加清晰
<1>__init__.py文件有什么用
__init__.py 控制着包导入模块的行为
<2> __init__.py为空
仅仅是把这个包导入,不会导入包中的模块
<3> __all__
在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块
<4> 可以在__init__.py文件中编写内容
可以在这个文件中编写语句,当导入时,这些语句就会被执行
__init__.py文件