Python之類方法,lambda,閉包簡談
阿新 • • 發佈:2019-02-09
def turn 函數 pass strong tro cme fun 直接
類方法,lambda,閉包
- 類方法
- lambda
- 閉包
類方法
- classmethod
- staticmethod
- instancemethod
類方法
類方法,通過裝飾器@classmethod
來標明,可以通過實例對象或類對象直接調用的方法。
class MyClass(object):
def __init__(self):
pass
def imethod(self):
pass
@classmethod
def cmethod(cls):
pass
__init__
方法是實例方法,其只在實例化對象的時候才會調用。而類方法cmethod()
則是在實例對象時可以調用,直接用類調用也可以調用。
m = MyClass() # __init__ 初始化方法調用
MyClass.cmethod() # 通過類即可調用 類方法
m.cmethod() # 實例對象也可以調用 類方法
m.imethod() # 實例方法僅能對象實例對象調用
實例方法
實例方法相比於類方法,因為其僅能在通過實例對象來調用,無法直接通過類對象調用,即不加@classmethod
和@staticmethod
的方法
class Myclass(object): def __init__(self): pass def test1(self): pass def test2(self): pass
上面demo中__init__
、test1
、test2
都是實例方法,僅能通過實例對象來調用
靜態方法
靜態方法如同普通的函數,其調用可以直接通過類、實例對象來調用,不可以直接調用,即直接使用方法名來調用是不可以的。
# coding: utf-8 class MyClass(object): def __init__(self): pass @staticmethod def smethod1(): pass def test(): self.smethod1() if __name__ == ‘__main__‘: MyClass.smethod1() # 通過類對象來調用 m = MyClass() m.smethod1() # 通過實例對象來調用 m.test() # 另一種通過實例對象來調用靜態方法
類方法,實例方法和靜態方法的調用區別
- 類方法:通過 實例對象和類調用
- 實例方法: 僅能通過實例對象調用
- 靜態方法:通過類或實例對象調用,不可以直接調用
lambda
from functools import reduce
def myadd(x, y):
return x+y
mlist = list(map(lambda x: x**2, [i for i in range(20)]))
flist = list(filter(lambda x: (x%3) == 0, [i for i in range(20)]))
r = reduce(myadd, [i for i in range(20)])
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
print(mlist)
# [0, 3, 6, 9, 12, 15, 18]
print(flist)
# 190
print(r)
lambda
匿名函數,其短小精悍,現寫現用,不用另外編寫一個函數。如上所示
map
返回是一個叠代器,list
負責將生成器轉變為列表
filter
返回的是一個生成叠代器,其將函數裏荷合條件的數據拿出來,換成map
執行以上代碼,將返回bool
值
reduce
返回也是一個叠代器,在這個例子中,數據在myadd
不斷叠代相加,得到數值190
。python2
是可以直接使用,python3
其在functools
中。
閉包
理解:後面會補充
參考資料
# coding: utf-8
def close(mss):
def hello(name):
print(mss, name)
return hello
h = close("你好!")
h("小偉")
h("小小偉")
"""
你好! 小偉
你好! 小小偉
"""
Python之類方法,lambda,閉包簡談