1. 程式人生 > 其它 >學習python -- 第022天 偏函式

學習python -- 第022天 偏函式

本文例項講述了Python中偏函式用法。分享給大家供大家參考,具體如下:

python中偏函式

當一個函式有很多引數時,呼叫者就需要提供多個引數。如果減少引數個數,就可以簡化呼叫者的負擔。

比如,int()函式可以把字串轉換為整數,當僅傳入字串時,int()函式預設按十進位制轉換:

1 2 >>> int('12345') 12345

int()函式還提供額外的base引數,預設值為10。如果傳入base引數,就可以做 N 進位制的轉換:

1 2 3 4 >>> int('12345', base=8)
5349 >>> int('12345', 16) 74565

假設要轉換大量的二進位制字串,每次都傳入int(x, base=2)非常麻煩,於是,我們想到,可以定義一個int2()的函式,預設把base=2傳進去:

1 2 def int2(x, base=2): return int(x, base)

這樣,我們轉換二進位制就非常方便了:

1 2 3 4 >>> int2('1000000') 64 >>> int2('1010101') 85

functools.partial就是幫助我們建立一個偏函式的,不需要我們自己定義int2()

,可以直接使用下面的程式碼建立一個新的函式int2:

1 2 3 4 5 6 >>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1000000') 64 >>> int2('1010101') 85

所以,functools.partial可以把一個引數多的函式變成一個引數少的新函式,少的引數需要在建立時指定預設值,這樣,新函式呼叫的難度就降低了。

任務

我們在sorted這個高階函式中傳入自定義排序函式就可以實現忽略大小寫排序。請用functools.partial把這個複雜呼叫變成一個簡單的函式:

1 sorted_ignore_case(iterable)

要固定sorted()的cmp引數,需要傳入一個排序函式作為cmp的預設值。

參考程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/usr/bin/python #coding: utf-8 import functools # cmp = lambda s1, s2: cmp(s1.upper(), s2.upper()) 最左邊一定要有cmp = , 這樣執行print的時候會執行 # 匿名函式中的cmp函式,關於為什麼使用cmp = ,請看上面的例子中,base = 2, 如果說沒有base = 的話,結果 # 肯定會出錯 # cmp函式釋義: # cmp(x,y) 函式用於比較2個物件,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1 # 用於排序中,預設從小到大 sorted_ignore_case = functools.partial(sorted, cmp = lambda s1, s2: cmp(s1.upper(), s2.upper())) print(sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])) # 不使用偏函式的時候 ''' def cmp_ignore_case(s1, s2): u1 = s1.upper() u2 = s2.upper() if u1 > u2: return 1 if u1 < u2: return -1 return 0 print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case) '''

執行結果:

1 ['about', 'bob', 'Credit', 'Zoo']
認清現實,放棄幻想。 細節決定成敗,心態放好,認真學習與工作。