2012-01-12 57 views
3

我一直在通過Python的partial函數。我發現它很有趣,但如果我能夠用一些真實世界的例子來理解它,而不是將它學習爲另一種語言特徵,那將會很有幫助。真實世界的部分函數示例

回答

-1

在這裏看看我的問題:Does python have a built-in function for interleaving generators/sequences?

from itertools import * 
from functional import * 

compose_mult = partial(reduce, compose) 
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args)) 

你會看到,我已經使用部分應用程序來創建可以傳遞到迭代器函數(Map和Reduce)單參數的函數。

+9

「從模塊導入*」是壞的風格,不要在例如片段給周圍的人。 – ddaa 2012-01-12 12:24:54

+0

@ddaa:我不同意。它可以經常是合適的,例如當輸入一般實用程序的「管道」時。 – Marcin 2012-01-12 12:31:10

+2

在某些情況下它很有用(例如從tkinter導入所有對象來編寫應用程序),但最好在示例代碼片段中避免它。從兩個圖書館做它是特別令人困惑的,因爲它掩蓋了每件事來自哪裏:我可以找到哪個圖書館?哦,你是不是指'functools',而不是'functional'? – 2012-01-12 12:51:25

11

我經常使用的一種用法是打印到stderr而不是默認的stdout

from __future__ import print_function 
import sys 
from functools import partial 

print_stderr = partial(print, file=sys.stderr) 
print_stderr('Help! Little Timmy is stuck down the well!') 

然後,可以使用與由print函數採取的任何其他參數:

print_stderr('Egg', 'chips', 'beans', sep=' and ') 
6

另一個例子是用於,寫Tkinter的代碼,例如當以一個標識符數據添加到回調函數,因爲Tkinter回調被調用時沒有參數。

因此,假設我想創建一個數字鍵盤,要知道被按下哪個按鈕:

import Tkinter 
from functools import partial 

window = Tkinter.Tk() 
contents = Tkinter.Variable(window) 
display = Tkinter.Entry(window, textvariable=contents) 

display.pack() 

def clicked(digit): 
    contents.set(contents.get() + str(digit)) 

counter = 0 

for i, number in enumerate("7894561230"): 
    if not i % 3: 
     frame = Tkinter.Frame(window) 
     frame.pack() 
    button = Tkinter.Button(frame, text=number, command=partial(clicked, number)) 
    button.pack(side="left", fill="x") 

Tkinter.mainloop() 
+1

+1對於其他GUI庫(如PyQt,wx)也很方便。 – reclosedev 2012-01-12 15:33:58