1.partial
首先是partial函式,它可以重新繫結函式的可選引數,生成乙個callable的partial物件:
>>> int('10') # 實際上等同於int('10', base=10)和int('10', 10)
10 >>> int('10', 2) # 實際上是int('10', base=2)的縮寫
2 >>> from functools import partial
>>> inwww.cppcns.comt2 = partial(int, 2) # 這裡我沒寫base,結果就出錯了
>>> int2('10')
traceback (most recent call last):
file "", line 1, in
typeerror: an integer is required
>>> int2 = partial(int, base=2) # 把base引數繫結在int2這個函式裡
>>> int2('10') # 現在預設引數base被設為2了
2 >>> int2('10', 3程式設計客棧) # 沒加base,結果又出錯了
traceback (most recent call last):
file "", line 1, in
typeerror: keyword parameter 'base' was given by position and by name
>>> int2('10', base=3)
3 >>> type(int2)
從中可以看出,唯一要注意的是可選引數必須寫出引數名。
2.update_wrapper
接著是update_wrapper函式,它可以把被封裝函式的__name__、__module__、__doc__和 __dict__都複製到封裝函式去:
#-*- coding: gbk -*-
def thisisliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + '活著就是吃嘛。'
return living
@thisisliving
def whatisliving():
"什麼是活著"
return '對啊,怎樣才算活著呢?'
print whatisliving()
print whatisliving.__doc__
from functools import update_wrapper
def thisisliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + '活著就是吃嘛。'
return update_wrapper(living, fun)
mbrqklxa
@thisisliving
def whatisliving():
"什麼是活著"
return '對啊,怎樣才算活著呢?'
print whatisliving()
print whatisliving.__doc__
結果:對啊,怎樣才算活著呢?活著就是吃嘛。
none
對啊,怎樣才算活著呢?活著就是吃嘛。
什麼是活著
不過也沒多大用處,畢竟只是少寫了4行賦值語句而已。
3.wraps
再有是w函式,它將update_wrapper也封裝了進來:
#-*- coding: gbk -*-
from functools import wraps
def thisisliving(fun):
@wraps(fun)
def living(*args, **kw):
return fun(*args, **kw) + '活著就是吃嘛。'
return living
@thisisliving
def whatisliving():
"什麼是活著"
return '對啊,怎樣才算活著呢?'
print whatisliving()
print whatisliving.__doc__
結果還是一樣的:
對啊,怎樣才算活著呢?活著就是吃嘛。
什麼是活著
4.total_ordering
最後至於total_ordering函式則給予類豐富的排序方法,使用裝飾器簡化了操作。如果使用必須在類裡面定義乙個__lt__(),__le__(), __gt__(), 或__ge__()。應該給類新增乙個__eq__() 方法。
from functools import total_ordering
@total_ordering
class student(object):
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name.lower() == other.name.lower()
def __lt__(self, other):
return self.name.lower() < other.name.lower()
a = student('dan'
b = student('mink')
print a > b
print a
print sorted([b, a])
列印結果
false
<__main__.student object at>
[<__main__.student object at>, <__main__.student object at>]
本文標題: python中functools模組的常用函式解析
本文位址:
python中 python中的 與
這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...
python中否定for 在python中否定函式
有沒有一種方法可以否定乙個函式,使它返回負數。在我的函式中,我有條件句,每個條件句都讓這個 烏龜 移動。有沒有一種方法可以否定這一點,所以烏龜的每乙個動作都是否定的。我說的是 狀況 在def ttinterpret program interpret program as a tinyturtle ...
python中雙重迴圈 加速Python中的雙迴圈
有沒有辦法加快從上一次迭代更新其值的雙迴圈?在 中 def calc n,m x 1.0 y 2.0 container np.zeros n,2 for i in range n for j in range m x np.random.gamma 3,1.0 y y 4 y np.random....