文章目錄
- 前言
- 1.直接修改預設值
- 2. \__defaults__ 修改預設值并儲存預設值
- 3. partial 偏函數固定部分參數
前言
python中函數的參數有兩種:位置參數和關鍵字參數,其中又分為固定長度的位置參數、關鍵字參數和不定長位置參數、關鍵字參數。
固定長度參數:
In [01]: def fun1(a, b, c, d=1, e=2):
print(a, b, c, d, e)
In [02]: fun1(1, 2, 3)
Out[02]: 1 2 3 1 2
不定長參數:
In [04]: def fun1(*args, **kwargs):
print(args)
print(kwargs)
In [05]: l1 = ['a', 'b', 'c']
In [06]: l2 = {'a':1, 'b':2, 'c':3}
In [07]: fun1(l1, **l2)
Out[07]: (['a', 'b', 'c'],)
{'a': 1, 'b': 2, 'c': 3}
而在固定長度參數中需要設定關鍵字參數的預設值,
d=1, e=2
就是設定的預設值,不傳入關鍵字參數的時候就是使用該預設值,也可以根據需要更改預設值,然後就有了下面的三種重新設定預設值的方法
1.直接修改預設值
這種方法很常見,也是衆所周知的,那就是直接在傳參的時候修改預設值
In [08]: fun1(1, 2, 3, d=11, e=22)
Out[08]: 1 2 3 11 22
直接傳入這次要更改的預設值即可,但是如果有100個預設值,而更改預設值後的函數我要使用100次,那不就是
fun1(1, 2, 3, d=11, e=22 · · · · · ·)
fun1(23432, 3423,4324, d=11, e=22 · · · · · ·)
然後這樣100次,這不還是重複造輪子嘛,不符合函數式程式設計的思想,有沒有能修改預設值并且儲存修改後預設值的方法呢?下面就是!
2. _defaults_ 修改預設值并儲存預設值
如下函數,計算輸入資料的多次項數,但是根據需求會計算3次方、10次方或其他項數的,這時候使用函數的自帶屬性
__defaults__
就可以修改預設的項數并且在之後也是使用該項數計算資料。
In [09]: def fun2(x:"輸入資料", dim:"項數"=2)->"傳回一個數的多項數":
"這是一個幂函數"
print(x**dim)
In [10]: fun2(3)
Out[10]: 27
In [11]: fun2(4)
Out[11]: 64
修改函數的
__defaults__
屬性
In [12]: fun2.__defaults__ = 3,
In [13]: fun2(3)
Out[13]: 27
In [14]: fun2(4)
Out[14]: 64
這樣就可以巧妙的一次重置預設值,以後友善使用。但是有個問題就是如果要再次使用之前的預設值還得改回來,那有沒有什麼方法可以複制函數并且更改預設值,然後就有了多個參數的預設值呢?下面就有!
3. partial 偏函數固定部分參數
現有位元組轉換函數
In [15]: def calc(bytesizes, trans='KB'):
if trans == 'KB': size=1024
if trans == 'MB': size=1024**2
if trans == 'GB': size=1024**3
if trans == 'TB': size=1024**4
return str(bytesizes//size)+' '+trans
随意輸入數字就可以按照指定的機關輸出大小
In [16]: calc(1024)
Out[16]: '1 KB'
In [17]: calc(1024*1024, trans='MB')
Out[17]: '1 MB'
如果是要另外使用功能TB的轉換函數就可以使用
functools.partial
更改預設值,然後傳回的仍然是函數,這樣就可以建立一個新預設值的函數了,而且原函數并沒有改變。
In [18]: import functools
In [19]: calc_tb = functools.partial(calc, trans='TB')
Out[19]: calc_tb(1024**5)