天天看点

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)