讓自己的類實現python中內建的特別方法,就可以讓你的自定義類物件也能被python的特別方法呼叫。這裡體現了python的一致性。
如自定義類中實現以下特別方法:
len(), 可以使用len()
add(), 可以使用 +
repr(), 可以使用print()
就是過載的意思,但是因此使得python中所有的類保持著一致的能被內建特殊方法呼叫的性質。
示例:實現vector類, 複寫特別方法
class
vector
:def
__init__
(self, x=
0, y=0)
:self.x = x
self.y = y
def__repr__
(self)
:return
'vector(%r, %r)'
%(self.x, self.y)
def__abs__
(self)
:return hypot(self.x, self.y)
def__bool__
(self)
:return
bool
(abs
(self)
)def
__add__
(self, other)
:x = self.x + other.x
y = self.y + other.y
return vector(x, y)
def__mul__
(self, scalar)
:return vector(self.x * scalar, self.y * scalar)
例子:
代替for 迴圈
codes = [ord(symbol) for symbol in symbols]
加上判斷語句
beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
雙重迴圈
tshirts = [(color, size) for color in colors for size in sizes]
為了避免錯誤, 列表的作用應該只能有乙個:生成新的列表。
與列表推導的最大區別在於:生成器不會直接生成整個列表,而是可以根據需要逐個地產出元素。
例子:用生成器生成元組tuple
tuple(ord(symbol) for symbol in symbols)
當生成器ord(symbol) for symbol in symbols
為唯一引數時,不需要再加一對圓括號。
for迴圈中使用生成器
for tshirt in
('%s %s'
%(c, s)
for c in colors for s in sizes)
:print
(tshirt)
生成器表示式逐個產出元素,從來不會一次性產出乙個含有 6 個 t 恤樣式的列表。
第一天,但感覺這本書真的很好,希望可以堅持下來。
自己寫python的時候就感受到了元組拆包 平行賦值的便捷。
如:
lax_coordinates =
(33.9425,-
118.408056
)latitude, longitude = lax_coordinates
*拆包作為函式引數
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
用*處理剩下的元素(不重要的)
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
還包括了著名的*args. 生成器,生成器推導式和列表推導式
python社群,大部分生成器和迭代器是一種 生成器的本質是迭代器 唯一區別 生成器是我們自己用python 構建的資料結構 迭代器都是提供的,或者轉化得來的 生成器函式 生成器表示式 python提供的 yield 乙個next 對應乙個yield yield和下乙個yield中間有 的話只執行乙...
生成器及列表推導式
迭代器 內部含有 iter next 方法的物件 可迭代物件不能取值,因為內部沒有 next 的方法 迭代器的優點 1 節省記憶體 2 惰性機制 3 單向 不可逆 如何判斷可迭代物件 迭代器 1 iter in dir obj 2 引用乙個模組 from collections import ite...
python中的列表推導與生成器
def t1 func1 lambda x x i for i in range 10 result1 f1 2 for f1 in func1 print result1 def t2 func2 lambda x,i i x i for i in range 10 result2 f2 2 fo...