Объяснение аргументов, состоящих только из ключевых слов (VarArgs) в Python

Пожалуйста, смотрите код ниже: -

#!/usr/bin/python
# Filename: total.py

def total(initial=5, *numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

Может кто-нибудь объяснить, как *числа и **ключевые слова собирают аргументы? Простое объяснение очень ценится Заранее спасибо


person rgolwalkar    schedule 23.11.2010    source источник
comment
Какая часть docs.python.org/reference/expressions.html#calls запутал вас? Не могли бы вы уточнить, какой абзац был недостаточно полным?   -  person S.Lott    schedule 23.11.2010


Ответы (2)


В вашем коде numbers назначается кортеж (1,2,3). keywords назначается словарь, содержащий vegetables и fruits.

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

Две звездочки (**) определяют аргументы ключевых слов.

Справочный материал доступен здесь.

Примеры

Python 2.x (до аргументов, состоящих только из ключевых слов)

def foo(x, y, foo=None, *args): print [x, y, foo, args]

foo(1, 2, 3, 4)            --> [1, 2, 3, (4, )]  # foo == 4
foo(1, 2, 3, 4, foo=True)  --> TypeError

Python 3.x (с аргументами только из ключевых слов)

def foo(x, y, *args, foo=None): print([x, y, foo, args])

foo(1, 2, 3, 4)           --> [1, 2, None, (3, 4)]  # foo is None
foo(1, 2, 3, 4, foo=True) --> [1, 2, True, (3, 4)]

def combo(x=None, *args, y=None): ...  # 2.x and 3.x styles in one function

Хотя опытный программист понимает, что произошло в 2.x, это противоречит интуиции (позиционный аргумент привязывается к foo= независимо от аргументов ключевого слова, если позиционных аргументов достаточно)

В Python 3.x представлены более интуитивно понятные аргументы, состоящие только из ключевых слов, с PEP-3102 ( аргументы ключевого слова после varargs могут быть связаны только по имени)

person kgiannakakis    schedule 23.11.2010
comment
Спасибо - подробнее об этом - значит ли это, что первый аргумент всегда является списком/кортежем, а второй - словарем? - person rgolwalkar; 23.11.2010
comment
Привет, С.Лотт. Я прочитал объяснение кгианнакакиса, а затем прочитал docs.python. org/py3k/tutorial/ — это рассеяло мои сомнения — спасибо за проверку - person rgolwalkar; 23.11.2010
comment
@kgiannakakis: foo после запуска вашего примера Python 2.x должно быть 3, не так ли? - person Treefish Zhang; 27.01.2017

Сначала разберем функцию.

Эта суммарная функция принимает три параметра.

  1. initial=5 => это аргумент ключевого слова.
  2. *numbers => это также известно как *args. Вы можете передать любое количество аргументов по своему усмотрению.
  3. **keywords => это аргумент ключевого слова, такой как словарь, каждый ключ связан с заданным значением.

==========================================

счет = начальный

*мы знаем, что initial — это аргумент ключевого слова, который содержит значение 5. Таким образом, значение 5 теперь присваивается переменной с именем count.

для числа в цифрах:

* число является переменной-заполнителем для чисел.

* мы знаем, что числа — это произвольный параметр, поэтому он может принимать любое количество аргументов или значений.

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

количество += число

* каждый раз, когда он перебирает аргументы чисел, добавляет счетчик к числу и возвращает счет

* когда count равен 5, он перебирает аргумент и добавляет первый экземпляр аргумента. Это будет повторяться до тех пор, пока цикл не будет исчерпан.

для ключевых слов:

* это сложно, потому что на этот раз параметр является типом словаря, который содержит ключи и соответствующие значения для этих ключей.

количество += ключевые слова[ключ]

количество возвратов

100 + 50 + (10, 1, 2, 3) => 166.

Я знаю, что этот ответ слишком велик, но понимание основной концепции каждой функции является основной силой всестороннего программиста.

person Shiva    schedule 27.02.2020