特別方法,列表推導與生成器

2021-09-10 12:55:31 字數 2063 閱讀 4704

讓自己的類實現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...