异常捕获
异常:当python无法正常处理程序的时候就会发生异常。异常是python对象,表示错误。
要整数1的时候如果输入浮点数1.0会报错,改成转为浮点数的时候能够执行,但是如果失误多输入了一个点的时候又会报错,这样就可以发现要实现一个内容的时候,可能会存在多种失误从而引发异常导致报错,此时如果用判断可以实现,但是需要很多判断条件过于复杂。
通过捕获异常避免报错问题后程序的终止。
异常捕获代码块
try:
正常程序执行此块代码
except:
抛出欧五执行此代码块
例:
通过上图可以发现当发生报错的时候也能有异常的时候的执行程序,但是,并没有显示发生的异常类型。
所以需要 异常类型捕获
异常类型捕获语法
try:
正常代码
except 当异常对象【Excepttion】 as e: #e=当前异常对象
print(e)
细分错误一般用于载入日志。
图中的ValueError 就是细分错误的一种。如果知道错误类型。可以替代Exception。
在细分错误的时候,Exception一般放在最后,避免其他错误没有考虑到的情况。
try except else
如果抛出异常 执行 except内部代码
如果程序正常执行 else内部代码
注意:不能有多个else,只能有一个。
try finally
不管程序有无发生异常,都执行finally内部代码
注意:不能有多个finally,只能有一个。
主动触发异常
在实际开发中,在程序不满足某条件时,通常会主动抛出异常。
语法:
raise Excepton()【()内部填写异常要抛出的信息】
例:
煎饼时间如果小于5则主动触发没熟异常,否则就是熟了。
主动触发异常的常用情况:
例如:
假设场景
1、连接数据库的函数【假设连接数据库函数为db()】如果db函数内部有地方会报错,则主动报出异常。
2、自身错误则载入日志
自定义异常
当需要自定义满足一些规则时候,就可以自定义异常。
自定义异常 常通过创建一个新的异常类,自定义名字与内容,并且需要继承Exception类实现。
例:
首先创建了自定义的错误类:在类的内部编写了自定义和返回对象。
之后进入捕获异常程序:在try中设置主动触发异常传入实参太老了。此时就会发生异常,那么就进入了Except内部。之后在自定义类中捕获错误,发现错误是太老了。则打印输出结果太老了。
断言
assert断言用于判断一个表达式,当表达式条件为False时触发断言异常 AssertionError。
条件成立的时候会往下执行代码,条件不成立的时候会直接抛出异常 AssertionError提示。
语法:
assert 断言【条件】
断言一般用于故意的时候。 故意要条件不成立的时候报错。强制用户服从
注意:断言用于强制用户服从,可以捕获,但是一般不捕获。
模块
模块是一个包含所有你定义的函数和变量的文件,其扩展名为 .py 。模块可以被其他程序引入,以使用该模块中的函数等功能。这也是使用python标准库的方法。
导入模块的方式
-
import module_name(模块名称)
例:
第一步创建一个modu1的py文件。第二步在创建modu2的py文件并导入modu1模块。
调低命令错误等级。操作如图所示。在pycharm的右下角。
模块中的方法调用既:通过导入模块后,模块名+ . +模块中的方法名调用 -
from module_name import name1, name2…(从模块中导入模块内的函数或者类等)
例:以函数为例:
第一步:创建modu1模块
第二步:在modu2中导入模块中的函数
-
from module_name import *(“ *”在这里代表通配符,表示导入所有的意思)
例:
在modu2模块中调用modu1中的函数
注意⚠️:一般不建议使用该方法。1、容易消耗费内存,因为是导入了modu1模块中的所有内容。可能会有所不需要的内容。2、会存在命名冲突从而覆盖的情况。 -
from module_name import func as demo_func(解决导入模块后发生命名冲突问题还能精简函数名)【as 相当于重命名】
例:
注意:该方法不能将函数名连着书写,如果需要的使用,则from使用多次。
常用内置模块
sys模块
sys模块是与python解释器交互模块
sys模块常用方法
-
sys.argv[] :从程序外部获取参数的桥梁
-
sys.argv[0]:程序本身文件路径
-
sys.argv[1]:外部运行时传递的参数
第一步:在pycharm中创建demo5,res=sys.argv[1] 通过1来获取参数。创建判断语句
第二步:在pycharm中复制路径
第三步:打开命令行【mac即终端】,切换盘符,比如当前是在c盘,需要切换到d盘则直接d:之后回车运行即切换成功。然后cd 路径就会进入。
第四步:在外部运行模块并传参。
-
-
sys.verson:用来显示解释器版本信息【verson就是版本的意思】
-
sys.path:用来显示模块搜索路径
-
sys.exit():用来退出程序
也可以直接用内置的exit() 效果是一致的。
os模块
os模块是与操作系统相关的模块
操作系统就是Mac、windows等系统。
os模块常用方法
- os.getcwd():用来打印当前工作目录
- os.chdir():改变当前工作目录
更改后可以在切换后的盘下去新建文件夹。 - os.makedirs():以递归方式创建多个文件夹【括号内填写路径】
- os.removedirs():以递归方式删除多个空文件夹
注意⚠️:只能删除空文件夹
- os.mkdir:创建单个文件夹【和makedirs的区别是这个创建单个文件夹】
- os.rmdir():删除单个空文件夹【同mkdir一样只能删除单个文件夹,同时要求是空文件夹】
- os.path.exists():判断该路径下的文件或文件夹是否存在
这个可以和判断语句结合。判断路径是否存在,如果存在则没事。不存在则进行创建路径。
- os.path.join():拼接路径
time模块
time模块是与时间相关的模块
time模块常用方法
-
time.sleep():延迟执行时间
先导入time模块,之后调用time.sleep()【括号内传的参数是数字代表 秒 ,指休息传入的秒数】
注意:这是一个强势等待,传入的参数可以为整数,也可以为浮点数 -
time.time():秒时间戳【返回的是一个浮点数,返回的是当前的时间,并且单位是秒】
-
time.localtime():本地时间【括号内传入秒的时间】以元组形式返回
不传入参数的时候,默认为当前本地时间,并且以元组的形式返回。 -
time.strftime():接收以时间元组,并返回以可读字符串表示的当地时间,格式有参数format决定【time.strftime(format, p_tuple=None)该方法内部有两个参数,第一个format代表格式,第二个为可选参数,可以传入元组】
format格式要求:
格式样式 | 代表含义 |
---|---|
%Y | 年,四位数的年份表示(00-99) |
%y | 年,两位数的年份表示(000-9999) |
%m | 月(01-12) |
%d | 日,月中的一天(0-31) |
%H | 时,24小时制小时数(0-23) |
%I | 时,12小时制小时数(01-12) |
%M | 分钟(00-59) |
%S | 秒(00-59) |
%Z | 当前时区的名称 |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M或P.M的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%% | %的本身 |
format中不能拼接中文,会报错。
补充datetime模块
- datetime.datetime.now():获取当前时间。【比time.strftime(format, time.localtime())的运行速度要快】
第一个datetime:模块
第二个datetime:类
now:类中的方法
- datetime.timedelta():实现日期时间的相加相减
random 模块
random模块是随机模块
random模块常用方法
-
random.random():随机生成 [0-1)的数【左闭右开,永远取不到1】。
在random.random的基础上取0-9的数【0-10】,第一步导入random模块。之后,乘以10【扩发范围作用】 -
random.randint():随机生成整数[ ]。【闭合区间】。
取1-10 的整数。第一步导入模块,之后使用randint方法。注意:该方法是闭合区间所以直接取值为1-10即可。 -
random.choice():随机在列表去元素。【非空序列中取元素】
随机在列表中取出元素。第一步:导入模块,并创建列表在列表中填写元素。 -
random.shuffle():打乱传入的容器内部顺序并返回。该方法只能洗列表。元组、集合都会报错,不能使用。
定义一个列表li=[1, 2, 3, 4, 5, 6]
将列表打乱随机洗牌再传入。
注意⚠️:这个是直接打乱列表,所以直接打印列表即可。如果打印调用的方法会返回None。 -
random.sample():随机取样。
join()函数:连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔号)连接成一个新的字符串。
语法:‘sep’.join(seq)。
sep:分隔号,可以为空
seq:要连接的元素序列、字符串、元组、字典
字母可以通过ascii用数字来表示。比如ord(‘A’)得到的ascii为65 就是字符转ascii值
chr(65)得到字母’A’ 通过ascii值转为字符
-
random.randrange():随机取整数 [ )。【左闭右开区间】 和range使用方法基本一致。默认是从0开始取值,步长默认为1。是左闭右开区间。
Json模块
Json是一种使用广泛的轻量数据格式。python标准库中Json模块提供了Json数据的处理功能。
由于Json与python的字典格式非常像。所以python中的Json模块也相当于用来使Json与字典做转换,但要注意的是,Json中的数据必须使用双引号包裹。
Json模块常用方法
-
json.loads():jspn转为字典(适用于语句)
注意⚠️:json数据内部的值必须要用双引号包裹,用单引号会报错。
-
json.dumps():字典转为json(适用于语句)
将字典转为字符串: -
json.load():json转为字典(适用于文件)
json.load(fp):
fp:文件对象
先导入json模块。之后调用json.load()函数,将json文件转为字典。
-
json.dump():字典转为json(适用于文件)
json.dump(obj, fp)
fp:文件对象
obj:写入的数据
如图所示:
包
包是管理python模块命名空间的形式,任然是以 x.y的形式。【x:是包。 y:是模块名称】
管理py文件。
创建包
pycharm:New中Python Package
创建包后,包内部自动包含init文件
如果是创建的文件夹,则内部没有init文件,只能手动创建py文件。
包的使用
1、from 包的名称 import 所需要导入的包中的模块名
1、在包 pack02中创建两个py模块文件,分别为demo和demo1
2、在test文件夹中创建bao.py文件。
3、在文件bao中导入demo和demo1模块。
通过从包中导入模块名可以正常运行。
2、from 包的名称 import * 【包中所有的模块代表*】
但是,from pack02 import * 会报错。【正常情况下,import * 代表导入全部模块的含义,是能够运行的】此处报错原因在于:没有权限。
设置包的权限
__ all__: 暴露接口。 提供了哪些公开接口的约定。
在包自动生成的init 文件中设置主动暴露接口。
即:
在init文件中创建all语句
之后发现在创建的bao文件中能够正常运行程序了。
3、 import 包的名称
导入方式: 直接导入包
通过包.模块名.函数()访问。
但是,当没在包的init文件中设置的话会报错无法访问,错误为没有demo模块
解决方法:
在init文件中 输入
from . import 需要导入的模块。
from后面的‘ . '点代表当前文件。
再度运行发现可以正常运行。