按照一般的學習思路,掌握了前兩節內容,已經足夠編程所需了。但是,我還想再多一步,還是因為本教程的讀者是要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的程序非常困難。
- 第零章 預備
- 關于Python的故事
- 從小工到專家
- Python安裝
- 集成開發環境
- 第壹章 基本數據類型
- 數和四則運算
- 除法
- 常用數學函數和運算優先級
- 寫一個簡單的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符編碼
- 列表(1)
- 列表(2)
- 列表(3)
- 回顧list和str
- 元組
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第貳章 語句和文件
- 運算符
- 語句(1)
- 語句(2)
- 語句(3)
- 語句(4)
- 語句(5)
- 文件(1)
- 文件(2)
- 迭代
- 練習
- 自省
- 第叁章 函數
- 函數(1)
- 函數(2)
- 函數(3)
- 函數(4)
- 函數練習
- 第肆章 類
- 類(1)
- 類(2)
- 類(3)
- 類(4)
- 類(5)
- 多態和封裝
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 錯誤和異常
- 錯誤和異常(1)
- 錯誤和異常(2)
- 錯誤和異常(3)
- 第陸章 模塊
- 編寫模塊
- 標準庫(1)
- 標準庫(2)
- 標準庫(3)
- 標準庫(4)
- 標準庫(5)
- 標準庫(6)
- 標準庫(7)
- 標準庫(8)
- 第三方庫
- 第柒章 保存數據
- 將數據存入文件
- mysql數據庫(1)
- MySQL數據庫(2)
- mongodb數據庫(1)
- SQLite數據庫
- 電子表格
- 第捌章 用Tornado做網站
- 為做網站而準備
- 分析Hello
- 用tornado做網站(1)
- 用tornado做網站(2)
- 用tornado做網站(3)
- 用tornado做網站(4)
- 用tornado做網站(5)
- 用tornado做網站(6)
- 用tornado做網站(7)
- 第玖章 科學計算
- 為計算做準備
- Pandas使用(1)
- Pandas使用(2)
- 處理股票數據
- 附:網絡文摘
- 如何成為Python高手
- ASCII、Unicode、GBK和UTF-8字符編碼的區別聯系