簡明Python教程 --- 15.更多Python的內容
特殊的方法
在類中,某些方法是有特殊含義的,這在前面也提到過。例如__init__方法和__del__方法。
這些特殊的方法是非常有用的,例如,你想讓你的類的對象可以使用索引,比如obj[key],那麼只要你的類中實現了__getitem__方法就可以了。
一些特殊的方法:
名稱 |
說明 |
__init__(self,...) |
這個方法在建立對象恰好要被返回使用之前被調用。 |
__del__(self) |
恰好在對象要被刪除之前調用。 |
__str__(self) |
在我們對對象使用 print 語句或是使用 str() 的時候調用。 |
__lt__(self,other) |
當使用 小於 運算子(<)的時候調用。類似地,對於所有的運算子(+,>等等)都有特殊的方法。 |
__getitem__(self,key) |
使用 x[key] 索引操作符的時候調用。 |
__len__(self) |
對序列對象使用內建的 len() 函數的時候調用。 |
單語句塊
在之前的介紹中,你已經看到,在Python中,語句塊是通過縮排來表示它們屬於同一層次,並且是上一層次的子層次。
但是,並不是所有情況下,都需要換行縮排。如果一個語句塊中只有一條語句。並且它的上一層次是判斷條件陳述式或迴圈語句,那麼這個語句塊可以和上一層次寫到同一行中。例如:
flag = True;
if flag : print 'flag is True.';
列表綜合
通過列表綜合,你可以使用迴圈語句初始化一個列表:
list1 = [1, 2, 5, 3, 7, 8];
list2 = [i for i in list1 if i > 3];
讓函數接收列表或元群組類型的參數
當要使函數接收元組或字典形式的參數的時候,有一種特殊的方法,它分別使用*和**首碼。
def method(arg1, *args)
由於在args變數前有*首碼,所有多餘的函數參數都會作為一個元組儲存在args中。如果使用的是**首碼,多餘的參數則會被認為是一個字典的鍵/值對。
lambda形式
lambda語句被用來建立新的函數對象,並且在運行時返回它們。
def method(prefix) :
return lambda s : prefix + ":" + s;
newMethod = method("abc");
print newMethod("111");
print newMethod("222");
lambda語句用來建立函數對象。本質上,lambda需要一個參數,後面僅跟單個運算式作為函數體,而運算式的值被這個建立的函數返回。
注意,即便是print語句也不能用在lambda形式中,只能使用運算式。
exec和eval語句
exec語句用來執行儲存在字串或檔案中的Python語句。
例如,我們可以在運行時產生一個包含Python代碼的字串,然後使用exec語句執行這些語句。
exec 'print "Hello World"';
eval語句用來計算儲存在字串中的有效Python運算式。例如:
eval("2*3");
assert語句
assert語句用來聲明某個條件是真的。
例如,如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,並且在它非真的時候引發一個錯誤,那麼assert語句是應用在這種情形下的理想語句。
當assert語句失敗的時候,會引發一個AssertionError。
list = ["abc"];
assert len(list) > 1;
repr函數
repr函數用來取得對象的規範字串表示。
list = ["item1", "item2"];
print repr(list);
執行上面的程式,將會輸出:["item1", "item2"]。
注意,在大多數時候有eval(repr(object)) == object。你可以通過定義類的__repr__方法來控制你的對象在被repr函數調用的時候返回的內容。