argument-unpacking - getlasterror python - Что **(двойная звезда/память)и*(звезда/память)делают для параметров?

ctypes pass array / python / syntax / parameter-passing / variadic-functions

Что делают param2 * и ** для 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

Теперь давайте изучим пример определения функции с ключевыми словами arguments :

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 '**' 

# вывод 3 во всех трех вызовах функции суммирования.

Теперь давайте изучим использование оператора '*' в определении функции . Пример:

def sum(*args): # запаковать полученные позиционные аргументы в структуру данных кортежа. после применения '*' - def sum ((1,2,3,4))
    sum = 0
    for a in args:
        sum+=a
    print(sum)

sum(1,2,3,4)  # позиционные аргументы, отправленные в функцию sum
#выход:
10

Теперь рассмотрим пример '**',используемого в определении функции:

def sum(**args): # упаковать аргументы ключевого слова в структуру данных dict после применения '**' - def sum ({a: 1, b: 2, c: 3, d: 4})
    sum=0
    for k,v in args.items():
        sum+=v
    print(sum)

sum(a=1,b=2,c=3,d=4) # позиционные аргументы, отправленные в функцию sum