Язык программирования Python

Аргументы в функциях (*args и **kwargs)

В Python существует два типа аргументов: обычные и те, которые имеют определенное имя, обычно обозначаемые как args (аргументы) и kwargs (аргументы ключевых слов) соответственно. Найти термин для последнего немного сложно, он был бы эквивалентен “аргументам ключевого слова”, поэтому мы просто будем называть их по их оригинальному названию.

def f(a, b, c): return a + b*c
Code language: JavaScript (javascript)

Это обычная нотация, где требуются все три аргумента. Если они не указаны, Python выбрасывает исключение.

>>> f(2, 5) TypeError: f() takes exactly 3 arguments (2 given) >>> f() TypeError: f() takes exactly 3 arguments (0 given) >>> f(2, 5, 3) 17
Code language: JavaScript (javascript)

Однако все аргументы могут иметь значение по умолчанию, если они не указаны.

def h(a, b=4, c=2): return a + b*c
Code language: JavaScript (javascript)

В этом случае Python выдаст исключение только тогда, когда a не имеет значения.

>>> h(1) # a=1, b=4 y c=2 9 >>> h(1, 5, 6) # a=1, b=5 y c=6 31 >>> h() TypeError: h() takes at least 1 argument (0 given)
Code language: PHP (php)

Когда один из аргументов функции имеет значение по умолчанию, он автоматически становится аргументом ключевого слова, например, словаря. Поэтому их можно уточнить, указав их имя при вызове. Например, если вы хотите передать значение в аргументе c, в то время как b сохраняет значение по умолчанию.

>>> h(1, c=10) 41

И наоборот, поэтому оба приведенных ниже примера приводят к одному и тому же результату.

>>> h(1, b=5) 11 >>> h(1, 5) 11

При именовании аргументов ключ-значение позиции аргументов ключ-значение безразличны.

>>> h(1, c=10, b=6) 61 >>> h(1, 6, 10) 61

Аргументы могут иметь любое значение по умолчанию, включая None и вызовы других функций.

>>> def a(c=None): ... return 100 ... >>> def b(n=a()): ... return n + 50 ... >>> b() 150
Code language: PHP (php)

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

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

>>> def f(*args): ... return args ... >>> f(1, 5, True, False, "Hello, world!") (1, 5, True, False, 'Hello, world!')
Code language: PHP (php)

В данном случае args – это кортеж, содержащий все значения, переданные функции. Звездочка (*) используется для обозначения такой функциональности; в противном случае в args будет храниться только первый аргумент.

Поскольку все аргументы будут храниться в первом параметре (args), Python выдаст исключение при попытке указать что-либо после него.

def f(*args, b): ^ SyntaxError: invalid syntax
Code language: JavaScript (javascript)

Аргументы ключевых слов, которые представлены двумя звездочками (**) и именем kwargs, работают подобным образом. Обратите внимание, что названия этих параметров безразличны; арги и карги используются просто по условию.

>>> def f(**kwargs): ... return kwargs ... >>> f(a=1, b=True, h=50, z="Hello, world!") {'a': 1, 'h': 50, 'b': True, 'z': 'Hello, world!'}
Code language: PHP (php)

В данном случае kwargs – это словарь, содержащий имя каждого из аргументов вместе с их значением. При этом порядок аргументов неясен.

Оба метода могут быть реализованы в одной и той же функции в качестве исключения синтаксической ошибки.

>>> def f(*args, **kwargs): ... return args, kwargs ... >>> args, kwargs = f(True, False, 3.5, message="Hello, world!", year=2014) >>> args (True, False, 3.5) >>> kwargs {'message': 'Hello, world!', 'year': 2014}
Code language: PHP (php)

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

def f(a, b, c): return a*b**c
Code language: JavaScript (javascript)

Следующий код…

>>> arguments = (5, 10, 2) >>> f(*arguments) 500
Code language: JavaScript (javascript)

…похожа на:

>>> f(5, 10, 2) 500

Аргументы ключевых слов работают точно так же.

>>> def f(message="Hello", name=None): ... print("{0}, {1}!".format(message, name)) ... >>> kwargs = {"message": "Hello", "name": "world"} >>> f(**kwargs) Hello, world!
Code language: PHP (php)

В момент наблюдения не имеет смысла хранить аргументы функции заранее. Однако я уверяю вас, что он еще не раз пригодится вам в различных проектах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *