1. 特殊方法
在類中有一些特殊的方法具有特殊的意義,如__init__和__del__方法。通常,特殊方法都被用來模仿某個行為。如果你要為你的類使用x[key]這樣的索引操作,那麼你只需要實現__getitem__()方法即可。
名稱 |
說明 |
__init__(self, ...) |
這個方法在建立對象恰好要被返回使用之前被調用。 |
__del__(self) |
恰好在對象要被刪除之前調用。 |
__str__(self) |
在我們對對象使用print語句或是使用str()的時候調用。 |
__lt__(self, other) |
當使用 小於 運算子(<)的時候調用。類似地,對於所有的運算子(+,>等等)都有特殊的方法。 |
__getitem__(self, key) |
使用x[key]索引操作符的時候調用。 |
__len__(self) |
對序列對象使用內建的len()函數的時候調用。 |
2. 單語句塊
一般,每個語句塊都是通過它的縮排層次與其他語句塊分開的。然而,有時候你的語句塊只包含一句語句,那麼你可以在條件陳述式或迴圈語句的同一行指明它。
flag = Trueif flag: print("Yes")
雖然這樣做可以使你的程式變得小一些 ,但是除了檢驗錯誤之外我強烈建議你不要使用這種縮減方法。不使用它的一個主要的理由是一旦你使用了恰當的縮排,你就可以很方便地添加一個額外的語句。
3. 列表綜合
通過列表綜合,可以從一個已有的列表匯出一個新的列表。例如,你有一個數的列表,而你想要得到一個對應的列表,使其中所有大於2的數都是原來的2倍。對於這種應用,列表綜合是最理想的方法。
listone = [2, 3, 4]listtwo = [2 * i for i in listone if i > 2]print(listtwo)
這段話的意思是:將listone中的所有大於2的數分別乘以2,得出一個新的listtwo。運行結果:
[6, 8]
4. 在函數中接收元組和列表
當要使函數接收元組或字典形式的參數的時候,有一種特殊的方法,它分別使用*和**首碼。這種方法在函數需要擷取可變數量的參數的時候特別有用。
def powersum(power, *args): '''Return the sum of each argument raised to specified power.''' total = 0 for i in args: total += pow(i, power) return total
由於在args變數前有*首碼,所有多餘的函數參數都會作為一個元組儲存在args中。如果使用的是**首碼,多餘的參數則會被認為是一個字典的鍵/值對。
5. lambda形式
lambda語句被用來建立新的函數對象,並且在運行時返回它們。
def make_repeater(n): return lambda s : s * ntwice = make_repeater(2)print(twice("ha"))print(twice(5))
運行結果:
haha
10
這裡,我們使用了make_repeater函數在運行時建立新的函數對象,並且返回它。lambda語句用來建立函數對象。本質上,lambda需要一個參數,後面僅跟單個運算式作為函數體,而運算式的值被這個建立的函數返回。注意,即便是print語句也不能用在lambda形式中,只能使用運算式。
6. exec和eval語句
exec語句用來執行儲存在字串或檔案中的Python語句。例如,我們可以在運行時產生一個包含Python代碼的字串,然後使用exec語句執行這些語句。
exec("print('Hello World')")
運行結果:
Hello World
eval語句用來計算儲存在字串中的有效Python運算式。
eval("2 * 3")
運行結果:
6
7. assert語句
assert語句用來聲明某個條件是真的。例如,如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,並且在它非真的時候引發一個錯誤,那麼assert語句是應用在這種情形下的理想語句。當assert語句失敗的時候,會引發一個AssertionError。
>>> mylist = ["item"]>>> assert(len(mylist) >= 1)>>> mylist.pop()'item'>>> assert(len(mylist) >= 1)Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> assert(len(mylist) >= 1)AssertionError
8. repr函數
repr函數用來取得對象的規範字串表示。注意,在大多數時候有eval(repr(object)) == object。
>>> i = []>>> i.append("item")>>> repr(i)"['item']"
基本上,repr函數和反引號用來擷取對象的可列印的表示形式。你可以通過定義類的__repr__方法來控制你的對象在被repr函數調用的時候返回的內容。