argument-unpacking - python double asterisk math - **(双星/星号)和*(星号/星号)对参数有什么作用?

Python dict / python / syntax / parameter-passing / variadic-functions

在以下方法定义中, ***param2 有何作用?

def foo(param1, *param2):
def bar(param1, **param2):

ShadowRanger



Answer #1

首先让我们了解什么是位置参数和关键字参数。下面是带有位置参数的函数定义的示例

def test(a,b,c):
     print(a)
     print(b)
     print(c)

test(1,2,3)
#输出:
1
2
3

所以这是一个带有位置参数的函数定义。你也可以用关键字/命名参数来调用它。

def test(a,b,c):
     print(a)
     print(b)
     print(c)

test(a=1,b=2,c=3)
#输出:
1
2
3

现在让我们研究一个带有关键字参数的函数定义示例:

def test(a=0,b=0,c=0):
     print(a)
     print(b)
     print(c)
     print('-------------------------')

test(a=1,b=2,c=3)
#输出 :
1
2
3
-------------------------

你也可以用位置参数来调用这个函数。

def test(a=0,b=0,c=0):
    print(a)
    print(b)
    print(c)
    print('-------------------------')

test(1,2,3)
# 输出 :
1
2
3
---------------------------------

我们直接进入一个例子,然后再讨论。

def sum(a,b):  #receive args from function calls as sum(1,2) or sum(a=1,b=2)
    print(a+b)

my_tuple = (1,2)
my_list = [1,2]
my_dict = {'a':1,'b':2}

#让我们借助'*'运算符将列表或元组或字典的数据结构解压缩为参数
sum(*my_tuple)   # becomes same as sum(1,2) after unpacking my_tuple with '*'
sum(*my_list)    # becomes same as sum(1,2) after unpacking my_list with  '*'
sum(**my_dict)   # becomes same as sum(a=1,b=2) after unpacking by '**' 

在sum函数的所有三个调用中,#输出均为3。

现在让我们研究函数定义中使用'*'运算符。例子:

def sum(*args): #将收到的位置args包装到元组的数据结构中。应用'*'之后-def sum((1,2,3,4))
    sum = 0
    for a in args:
        sum+=a
    print(sum)

sum(1,2,3,4)  #positional args发送到函数sum
#输出:
10

现在让我们看看函数定义中使用'**'的例子。

def sum(**args): 应用'**'-def sum({a:1,b:2,c:3,d:4})后将#arg关键字args放入dict的数据结构中
    sum=0
    for k,v in args.items():
        sum+=v
    print(sum)

sum(a=1,b=2,c=3,d=4) #positional args发送到函数sum