💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
按照一般的学习思路,掌握了前两节内容,已经足够编程所需了。但是,我还想再多一步,还是因为本教程的读者是要from beginner to master。 ## [](https://github.com/qiwsir/StarterLearningPython/blob/master/218.md#assert)assert ~~~ >>> assert 1==1 >>> assert 1==0 Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError ~~~ 从上面的举例中可以基本了解了assert的特点。 assert,翻译过来是“断言”之意。assert是一句等价于布尔真的判定,发生异常就意味着表达式为假。 assert的应用情景就有点像汉语的意思一样,当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出错误。 ~~~ #!/usr/bin/env python # coding=utf-8 class Account(object): def __init__(self, number): self.number = number self.balance = 0 def deposit(self, amount): assert amount > 0 self.balance += balance def withdraw(self, amount): assert amount > 0 if amount <= self.balance: self.balance -= amount else: print "balance is not enough." ~~~ 上面的程序中,deposit()和withdraw()方法的参数amount值必须是大于零的,这里就用断言,如果不满足条件就会报错。比如这样来运行: ~~~ if __name__ == "__main__": a = Account(1000) a.deposit(-10) ~~~ 出现的结果是: ~~~ $ python 21801.py Traceback (most recent call last): File "21801.py", line 22, in <module> a.deposit(-10) File "21801.py", line 10, in deposit assert amount > 0 AssertionError ~~~ 这就是断言assert的引用。什么是使用断言的最佳时机?有文章做了总结: 如果没有特别的目的,断言应该用于如下情况: * 防御性的编程 * 运行时对程序逻辑的检测 * 合约性检查(比如前置条件,后置条件) * 程序中的常量 * 检查文档 (上述要点来自:[Python 使用断言的最佳时机](http://www.oschina.net/translate/when-to-use-assert) ) 不论是否理解,可以先看看,请牢记,在具体开发过程中,有时间就回来看看本教程,不断加深对这些概念的理解,这也是master的成就之法。 最后,引用危机百科中对“异常处理”词条的说明,作为对“错误和异常”部分的总结(有所删改): > 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 > > 各种编程语言在处理异常方面具有非常显著的不同点(错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束)。某些编程语言有这样的函数:当输入存在非法数据时不能被安全地调用,或者返回值不能与异常进行有效的区别。例如,C语言中的atoi函数(ASCII串到整数的转换)在输入非法时可以返回0。在这种情况下编程者需要另外进行错误检测(可能通过某些辅助全局变量如C的errno),或进行输入检验(如通过正则表达式),或者共同使用这两种方法。 > > 通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。 > > 从进程的视角,硬件中断相当于可恢复异常,虽然中断一般与程序流本身无关。 > > 从子程序编程者的视角,异常是很有用的一种机制,用于通知外界该子程序不能正常执行。如输入的数据无效(例如除数是0),或所需资源不可用(例如文件丢失)。如果系统没有异常机制,则编程者需要用返回值来标示发生了哪些错误。 > > 一段代码是异常安全的,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。 > > Python语言对异常处理机制是非常普遍深入的,所以想写出不含try, except的程序非常困难。