如果你在看python代码的时候,会在一些代码中看到assert
关键字的语句。本文重点介绍Assert语句的作用以及什么时候应该使用该语句。
什么是断言
- 程序运行过程中,所有变量的当前值组合构成了“状态”;
- 每执行一段程序,状态就发生变化;
- 如果程序有逻辑错误的bug,必定在某处变量值的组合不符合预期,处于错误状态;
- 将对变量的预期写为断言,可以定位复杂的逻辑错误
assert语句的基础语法
基于语法:
assert <表达式>[,<打印信息>]
上述语句,如果表达式为True,assert语句不会产生任何效果,我们可以像往常一样继续往下执行。如果表达式为False,程序终止,AssertionError,并显示<打印信息>。
Traceback (most recent call last):
File "/your/path/a.py", line 2, in <module>
assert False
AssertionError
不加打印信息的assert的使用
例一:寻找一个列表中的最小值
# 断言的例子: 最小值
alist = [23,12,33,55]
amin = min(alist)
# 列表中最小值: 列表中的数,不大于任何一个数
assert amin in alist and all(amin <= x for x in alist)
print("min=",amin)
上述代码中,语句assert amin in alist and all(amin <= x for x in alist)
主要用于检查amin是不是列表中的数并且不大于列表中任何一个数。如果不满足上述条件,则会发生断言错误并停止运行程序。
例二:判断是否是排好序的列表
# 断言的例子:排好序的列表
alist = [12,34,56,78,73]
# 排好序的列表:任何一个数都不会超过它的下一个数
assert all(alist[i] <= alist[i+1] for i in range(len(alist)-1))
print("sorted:",alist)
上述代码中,语句assert all(alist[i] <= alist[i+1] for i in range(len(alist)-1))
主要用于检查alist列表中任何一个数都不会超过它的下一个数。如果不满足上述条件(也就是alist列表没有排好序),则会发生断言错误并停止运行程序。
加打印信息的assert的使用
更进一步,我们可以添加断言消息,该消息与断言错误一起显示。
# 断言的例子: 与类型注解配合
def half(n: int) -> int:
assert isinstance(n,int),"参数n必须是整数"
return n // 2
print(half(12))
print(half(1.2)) # 其它部分错误使用了half,或者参数错置
输出结果:
6
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_2268\2357812243.py in <module>
----> 1 print(half(1.2))
~\AppData\Local\Temp\ipykernel_2268\475170792.py in half(n)
1 def half(n: int) -> int:
----> 2 assert isinstance(n,int),"参数n必须是整数"
3 return n // 2
AssertionError: 参数n必须是整数
上述代码中,语句assert isinstance(n,int),"参数n必须是整数"
主要用于检查参数n必须是整数。如果不满足上述条件(也就是half函数参数错置),则会发生断言错误并停止运行程序。
什么时候用/不用断言
-
assert语句是一种调试程序的手段,仅用于定位可能的错误;
-
断言不能视作算法的一部分;
- 删去所有的assert语句也不影响程序功能和特性
-
try语句提高程序健壮性,assert不能;
-
程序正式运行可以跳过所有assert语句
- python -o main.py