python 函數 默認值更改使用的三種方法

前言

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章