學習python -- 第022天 偏函式
阿新 • • 發佈:2021-09-28
本文例項講述了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()
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' ]
|