天天看點

python 函數 預設值更改使用的三種方法前言1.直接修改預設值2. _defaults_ 修改預設值并儲存預設值3. partial 偏函數固定部分參數

文章目錄

  • 前言
  • 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)