2012-01-12 102 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