Документация по Python

*args и **kwargs

В: Документация по Python

Использование * args при написании функций

Вы можете использовать звездочку * при написании функции, чтобы собрать все позиционные (т.е. безымянные) аргументы в кортеже:

def print_args(farg, *args):
   print("formal arg: %s" % farg)
   for arg in args:
       print("another positional arg: %s" % arg)

 

Метод вызова:

 print_args(1, "two", 3)

 

В этом вызове farg будет назначен как всегда, а два других будут переданы в кортеж args в порядке их получения.

Использование ** kwargs при написании функций

Вы можете определить функцию , которая принимает произвольное количество ключевых слов (называемые) аргументов, используя двойную звезду ** перед именем параметра:

def print_kwargs(**kwargs):
    print(kwargs)

 

При вызове метода Python создаст словарь всех аргументов ключевого слова и сделает его доступным в теле функции:

print_kwargs(a="two", b=3)
# prints: "{a: "two", b=3}"

Обратите внимание, что параметр ** kwargs в определении функции всегда должен быть последним параметром, и он будет соответствовать только аргументам, переданным после предыдущих.

def example(a, **kw):
    print kw

example(a=2, b=3, c=4) # => {'b': 3, 'c': 4}

Внутри тела функции, kwargs манипулируют таким же образом , как словарь; для того , чтобы получить доступ к отдельным элементам в kwargs вы просто цикл через них , как вы бы с нормальным словарем:

def print_kwargs(**kwargs):
    for key in kwargs:
        print("key = {0}, value = {1}".format(key, kwargs[key])) 

Теперь, вызывая print_kwargs(a="two", b=1) показывает следующий вывод:

print_kwargs(a = "two", b = 1)
key = a, value = "two"
key = b, value = 1 

Использование ** kwargs при вызове функций

Вы можете использовать словарь для присвоения значений параметрам функции; используя имя параметра в качестве ключей в словаре и значение этих аргументов, привязанных к каждому ключу:

def test_func(arg1, arg2, arg3): # Usual function with three arguments
   print("arg1: %s" % arg1)
   print("arg2: %s" % arg2)
   print("arg3: %s" % arg3)

# Note that dictionaries are unordered, so we can switch arg2 and arg3. Only the names matter.
kwargs = {"arg3": 3, "arg2": "two"}

# Bind the first argument (ie. arg1) to 1, and use the kwargs dictionary to bind the others
test_var_args_call(1, **kwargs)  

Использование * args при вызове функций

Эффект использования * оператора на аргумент при вызове функции является то , что распаковывать списка или кортежа аргумент

def print_args(arg1, arg2):
    print(str(arg1) + str(arg2))

a = [1,2]
b = tuple([3,4])

print_args(*a)
# 12
print_args(*b)
# 34

Обратите внимание, что длина помеченного аргумента должна быть равна числу аргументов функции.

Обычный Python идиомы является использование оператора распаковки * с zip функции ликвидировать ее последствия:

a = [1,3,5,7,9]
b = [2,4,6,8,10]

zipped = zip(a,b)
# [(1,2), (3,4), (5,6), (7,8), (9,10)]

zip(*zipped)
# (1,3,5,7,9), (2,4,6,8,10) 

Только ключевые слова и ключевые слова обязательные аргументы

Python 3 позволяет вам определять аргументы функции, которые могут быть назначены только по ключевому слову, даже без значений по умолчанию. Это делается с помощью звезды , чтобы потреблять дополнительные позиционные параметры без установки параметров ключевых слов. Все аргументы после того , как это ключевое слово-только (т.е. не позиционные) аргументы. Обратите внимание, что если для аргументов только для ключевых слов не задано значение по умолчанию, они все равно необходимы при вызове функции.

def print_args(arg1, *args, keyword_required, keyword_only=True):
    print("first positional arg: {}".format(arg1))
    for arg in args:
        print("another positional arg: {}".format(arg))
    print("keyword_required value: {}".format(keyword_required))
    print("keyword_only value: {}".format(keyword_only))

print(1, 2, 3, 4) # TypeError: print_args() missing 1 required keyword-only argument: 'keyword_required'
print(1, 2, 3, keyword_required=4) 
# first positional arg: 1
# another positional arg: 2
# another positional arg: 3
# keyword_required value: 4
# keyword_only value: True 

Заполнение значений kwarg словарем

def foobar(foo=None, bar=None):
    return "{}{}".format(foo, bar)

values = {"foo": "foo", "bar": "bar"}

foobar(**values) # "foobar" 

** kwargs и значения по умолчанию

Использовать значения по умолчанию с ** kwargs

def fun(**kwargs):
    print kwargs.get('value', 0)

fun()
# print 0
fun(value=1)
# print 1 
Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.