Python 函数基础知识快速入门(3)

在python的函数中,还可以定义可变参数。可变参数就是传入的参数个数是可变的。

In[6]: def cacl(*numbers):    ...:     sum = 0    ...:     for n in numbers:    ...:         sum = sum + n * n    ...:     return sum    ...:  In[7]: nums = [1, 2, 3] In[8]: cacl(*nums) # 这里如果不在nums前面加*,有问题吗? Out[8]: 14

6. 可变关键字参数

可变关键字参数使用**定义,在函数体内,可变关键字参数是一个字典。可变关键字参数的key都是字符串,并且符合标识符定义规范。

def fn(**kwargs):     print(kwargs) dict01 = {'name': 'Laven Liu', 'age': 29} fn(**dict01) # fn(dict01) fn(name='Laven Liu', age=29) {'name': 'Laven Liu', 'age': 29} {'name': 'Laven Liu', 'age': 29}

可变位置参数只能以位置参数的形式调用

可变关键字参数只能以关键字参数的形式调用

可变位置参数必须在可变关键字参数之前

In[18]: def fn(*args, **kwargs):     ...:     print(args)     ...:     print(kwargs)     ...:      In[19]: fn(1, 2, 3, a=1, b=2) (1, 2, 3) {'a': 1, 'b': 2} In[20]: def fn(*args, x, y):     ...:     print(args)     ...:     print(x, y)     ...:      In[21]: fn(1, 2, 3, 4) --------------------------------------------------------------------------- TypeError                                 Traceback (most recent call last) <ipython-input-21-0ab4fbc96a17> in <module>() ----> 1 fn(1, 2, 3, 4) TypeError: fn() missing 2 required keyword-only arguments: 'x' and 'y' In[22]: fn(1, 2, x=3, y=4) (1, 2) 3 4

可变参数后置

可变参数不和默认参数一起出现

7. 参数组合

在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是: 必选参数、默认参数、可变参数和关键字参数

比如定义一个函数,包含上述4种参数:

>>> def func(a, b, c=0, *args, **kwargs): ...    print('a =', a, 'b =', b, 'c =', c, 'args = ', args, 'kwargs = ', kwargs)

在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

>>> func(1, 2) a = 1 b = 2 c = 0 args =  () kwargs =  {} >>> func(1, 2, c=3) a = 1 b = 2 c = 3 args =  () kwargs =  {} >>> func(1, 2, 3, 'a', 'b') a = 1 b = 2 c = 3 args =  ('a', 'b') kwargs =  {} >>> func(1, 2, 3, 'a', 'b', x=99) a = 1 b = 2 c = 3 args =  ('a', 'b') kwargs =  {'x': 99} >>>

最神奇的是通过一个tuple和dict,我们也可以调用该函数:

>>> args = (1, 2, 3, 4) >>> kwargs = {'x': 99} >>> func(*args, **kwargs) a = 1 b = 2 c = 3 args =  (4,) kwargs =  {'x': 99}

所以,对于任意函数,都可以通过类似func(*args, **kwargs)的形式调用它,无论它的参数是如何定义的。

8. 参数解构

参数解构发生在函数调用时,可变参数发生函数定义的时候。参数解构分为两种形式,一种是位置参数解构,另一种是关键字参数解构。

参数结构的两种形式:

位置参数解构,使用一个星号。解构的对象为可迭代对象,解构的结果为位置参数。

关键字参数解构,使用两个星号。解构的对象为字典,解构的结果为关键字参数。

位置参数解构的一个例子:

In[23]: def fn(a, b, c):     ...:     print(a, b, c)     ...:      In[24]: lst = [1, 2, 3] In[25]: fn(lst[0], lst[1], lst[2]) 1 2 3 # 也可以进行如下形式的调用 In[26]: fn(*lst)  # 这种做法就叫参数解构 1 2 3 # *号可以把线性结构解包成位置参数 lst = [1, 2, 3, 4] fn(*lst) # -> fn(lst[0], lst[1], lst[2], lst[3]) TypeError: fn() takes 3 positional arguments but 4 were given # 这里就报错了,本来这个函数只能接收3个位置参数,lst有四个元素,通过参数解构之后,就变成了4个参数,所以就报错了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/39b94f074e74b4ba92dff4f03ab4b723.html