發表文章

目前顯示的是 8月, 2016的文章

Python assert 斷言使用方式

使用 assert 所謂斷言(Assertion),指的是程式進行到某個時間點,斷定其必然是某種狀態,具體而言,也就是斷定該時間點上,某變數必然是某值,或某物件必具擁有何種特性值。 如果你在Python中要進行斷言測試,則可以使用assert陳述句: assert <test>, <message> test是狀態測試,而message是斷言失敗時所要呈現訊息。例如,在 定義類別 中定義的Account類別,存款的時候不能提負數,提款的時候也不能是負數(真正的提款機也不會有負數鍵),所以呼叫deposit()或withdraw()時傳入的值必然是大於0,這時你可以使用斷言檢查: class Account:     def __init__(self, number, name):         self.number = number         self.name = name         self.balance = 0             def deposit(self, amount):         assert amount > 0, '必須是大於 0 的正數'         self.balance += amount             def withdraw(self, amount):         assert amount > 0, '必須是大於 0 的正數'         if amount <= self.balance:             self.balance -= amount         else:             raise RuntimeError('balance not enough') a = Account('E122', 'Justin') a.deposit(-1)    # AssertionError: 必須是大於 0 的正數 類似的,在一個if判斷中,如果x大於0,就執行if區塊,否則x必須是等於0,這時也可使用斷言測試: if x > 0:     # do some     ... else:     assert x == 0

Python 物件導向的__init__方法

在Python的類中有很多方法的名字有特殊的重要意義。現在我們將學習__init__方法的意義。 __init__方法在類的一個物件被建立時,馬上執行。這個方法可以用來對你的物件做一些你希望的 初始化 。注意,這個名稱的開始和結尾都是雙下劃線。 使用__init__方法 例:使用__init__方法 #!/usr/bin/python # Filename: class_init.py class Person:     def __init__(self, name):         self.name = name     def sayHi(self):         print 'Hello, my name is', self.name p = Person('Swaroop') p.sayHi() # This short example can also be written as Person('Swaroop').sayHi() (源文件:code/class_init.py) 輸出 $ python class_init.py Hello, my name is Swaroop 它如何工作 這裡,我們把__init__方法定義為取一個參數name(以及普通的參數self)。在這個__init__裡,我們只是新增一個新的域,也稱為name。注意它們是兩個不同的變數,儘管它們有相同的名字。點號使我們能夠區分它們。 最重要的是,我們沒有專門呼叫__init__方法,只是在新增一個類的新範例的時候,把參數包括在圓括號內跟在類名後面,從而傳遞給__init__方法。這是這種方法的重要之處。 現在,我們能夠在我們的方法中使用self.name域。這在sayHi方法中得到了驗證。

Python if __name__ == '__main__': 用法

 Python 程式裡的 __name__ 可以用來分辨程式是直接執行還是被 import 的 剛開始寫 python 的時候,看到幾乎每個程式的最後面都有一段 code: if __name__ == '__main__':  doSomething() 一直都不懂那是什麼意思,只知道要照抄然後執行程式時那段就會被執行。後來深入研究之後才比較瞭解 __name__ 的意思了。 原來如果一個 python script 是被別的 python script 當成 module 來 import 的話,那麼這個被 import 的 python script 的 __name__ 就會是那個 python script 的名稱。而如果這個 python script 是直接被執行的話,__name__ 就會是 __main__。 舉例來說,如果我有一個程式叫做 myModule.py,內容就是一行顯示自己的 __name__: print '__name__:' + __name__ 那麼我直接執行它的話,結果會顯示 __main__: bash-3.2$ python myModule.py __name__:__main__ 但如果我準備了另一個程式叫做 testModule.py,裡面就這麼一行去 import myModule: import myModule 然後我去執行 testModule.py 的話,則會顯示 myModule: bash-3.2$ python testModule.py __name__:myModule 結論: 1.直接執行與被執行 2.直接執行 __name__ == '__main__': 3.被執行 import myModule 4.所以用 __name__ 就可以分辨我的程式是被 import 當成模組還是被直接執行的。這樣附帶的好處就是如果我寫的程式平常可以被 import 來使用,但有時它自己也可以直接執行。其它語言的話,可能就要區分 library 跟使用 library 的程式,而 python 的話這兩者的界線就很模糊。