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
就是设置的默认值,不传入关键字参数的时候就是使用该默认值,也可以根据需要更改默认值,然后就有了下面的三种重新设置默认值的方法
这种方法很常见,也是众所周知的,那就是直接在传参的时候修改默认值
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次,这不还是重复造轮子嘛,不符合函数式编程的思想,有没有能修改默认值并且保存修改后默认值的方法呢?下面就是!
如下函数,计算输入数据的多次项数,但是根据需求会计算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
这样就可以巧妙的一次重置默认值,以后方便使用。但是有个问题就是如果要再次使用之前的默认值还得改回来,那有没有什么方法可以复制函数并且更改默认值,然后就有了多个参数的默认值呢?下面就有!
现有字节转换函数
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)