1 簡介
偏函數在Python 2.5 版本中添加進來,是函數式編程一系列重要改進中的一部分。使用偏函數,可以通過有效地“凍結”那些預先確定的參數來緩存函數參數,然后在運行時,當獲得需要的剩余參數后,可以將它們解凍,傳遞到最終的參數中,從而使用最終確定的所有參數去調用函數。
偏函數最好的一點是它不只局限于函數。偏函數可以用于可調用對象(任何包括函數接口的對象),只需要通過使用圓括號即可,包括類、方法或可調用實例。對于有很多可調用對象,并且許多調用都反復使用相同參數的情況,使用偏函數會非常合適。
# 2 路牌提示實例
我們要做以下路牌:

點擊每一個按鈕會有相應的提示信息,每一個按鈕形式上基本相同,可以考慮用偏函數,而不用去單獨實現每一個按鈕。
以下是代碼:
!/usr/bin/env python
coding=utf-8
import pdb
from functools import partial as pto
from Tkinter import Tk, Button, X
from tkMessageBox import showinfo, showwarning, showerror
WARN = 'warn'
CRIT = 'crit'
REGU = 'regu'
SIGNS = {
'do not enter': CRIT,
'railroad crossing': WARN,
'55\nspeed limit': REGU,
'wrong way':CRIT,
'merging traffic':WARN,
'one way': REGU,
}
critCB = lambda: showerror('Error','Error Button Pressed!')
warnCB = lambda: showwarning('warning','Warning Button Pressed!')
infoCB = lambda: showinfo('Info','Info Button Pressed')
top = Tk()
top.title('Road Signs')
Button(top, text='QUIT',command=top.quit,bg='red',fg='white').pack()
MyButton = pto(Button,top)
CritButton = pto(MyButton, command=critCB, bg='white',fg='red')
WarnButton = pto(MyButton, command=warnCB, bg='goldenrod1')
ReguButton = pto(MyButton, command=infoCB, bg='white')
for eachSign in SIGNS:
pdb.set_trace()
signType = SIGNS[eachSign]
cmd = '%sButton(text=%r%s).pack(fill=X,expand=True)'%
(signType.title(),eachSign,'.upper()' if signType==CRIT else '.title()')
eval(cmd)
top.mainloop()
## 2.1 搞清楚`title()`,`upper()`函數的作用

>str.title()
Return a titlecased version of the string where words start with an uppercase character and the remaining characters are lowercase.
The algorithm uses a simple language-independent definition of a word as groups of consecutive letters. The definition works in many contexts but it means that apostrophes in contractions and possessives form word boundaries, which may not be the desired result:
`>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
`
## 2.2 三元組選擇功能以及`%r`和`%s`的區別

注意其中`%r`的使用,如果換成`%s`會出錯:

同時,可以看到`text=%r%s`的值為`eachSign.upper()`或者`eachSign.title()`,由`signType`是否為`CRIT`決定。
# 3 運行結果
注意不同類別的按鈕,顯示的界面不太相同,字體是否全為大寫也不一樣。這都是偏函數的應用。
