一、编写可接受任意数量参数的函数:*、**
>>> def test(x, *args, y, **kwargs): ... pass ... >>> test(1, 2, 3, 4 ,5 ,5, y=9, aa=99, bb=88,cc=900) >>> test(1, 2, 3, 4 ,5 ,5, 9, aa=99, bb=88,cc=900) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: test() missing 1 required keyword-only argument: 'y'
#以*打头的参数只能作为最后一个位置参数出现,以**打头的参数只能作为最后一个参数出现;*args之后仍然可以有其它的参数出现,但只能是关键字参数(keyword_only)
二、编写只接受关键字参数的函数
>>> def test(*, x, y): ... pass ... >>> test(8, 9) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: test() takes 0 positional arguments but 2 were given >>> test(x=9, y=8)
#星号*之后的参数都是keyword_only参数
三、函数注解
>>> def add(x:int ,y:int) ->int: ... return x + y ... add.__annotations__ {'x': <class 'int'>, 'return': <class 'int'>, 'y': <class 'int'>}
#函数注解只会保存在函数的__annotations__属性中;因为Python中没有类型声明,函数注解可以用于提示
四、从函数中返回多个值:各返回值之间以逗号“,”分隔,本质上是返回一个tuple,可通过tuple解包实现返回多个值的目的
>>> def myfun(): ... return 1, 2, 3 ... >>> x, y, z = myfun() >>> x 1 >>> y 2 >>> z 3 >>> a = myfun() >>> a (1, 2, 3)
五、定义带有默认参数的函数
默认参数只会在函数定义时被绑定一次
>>> x = 44 >>> def sample(a=x): ... print(a) ... >>> sample() 44 >>> x = 88 >>> sample() 44
默认参数的默认值通常应该是不可变对象;若设置可变对象,应参照如下方式:
>>> def test(a, b=None): ... if b is None: ... b = [] ... pass ...
六、嵌套函数
>>> def xxx(m): ... def yyy(n): ... return m + n ... return yyy ... >>> xxx(20) #可对比嵌套列表的逻辑进行理解 <function xxx.<locals>.yyy at 0x7f68c3aef0d0> >>> xxx(20)(20) #给内嵌的函数参数赋值 40
>>> def test(m): ... return lambda n: m + n #实现原理上,lambda可以理解为嵌套函数 ... >>> test(20)(20) 40
七、让带有N个参数的可调用对象以较少的参数形式调用
即:给一部分参数预先斌予固定值,相当于转化成一个带有默认值的函数
>>> def sum(a, b, c, d): ... return a + b + c + d ... >>> sum(1, 2, 3, 4) 10 >>> import functools >>> test_0 = functools.partial(sum, b=2, c=3, d=4) >>> test_0(1) 10 >>> test_0(100) 109
也可使用lambda函数实现
>>> test_1 = lambda a, b=2, c=3, d=4: sum(a, b, c, d) >>> test_1(1) 10 >>> test_1(100) 109