Правильно ли вы указываете аргументы функции Python?

Аргументы в Python могут быть указаны четырьмя различными способами.

Они могут быть указаны как:

  • Позиционные аргументы
  • Аргументы ключевых слов
  • Произвольные списки аргументов
  • Словари произвольных аргументов ключевых слов

Вот как их правильно использовать.

Позиционные аргументы

Позиционные аргументы — это, очевидно, аргументы, определяемые своей позицией.

Они обязательны и не имеют значений по умолчанию.

Указание аргументов в качестве позиционных аргументов является наиболее часто используемым и наиболее простым способом установки аргументов функции.

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

def calculate_distance(start, end):
     distance = end - start
     return(distance)

Если вы затем вызовете эту функцию без включения позиционных аргументов, вы получите сообщение об ошибке.

Конечно, это потому, что вы потребовали два позиционных аргумента в своей функции, но не предоставили их при вызове.

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

def calculate_distance(end = 10, start = 5:
     distance = end - start
     return(distance)

И это сработает. Но это многословно, бессмысленно и просто немного глупо. Итак, не делайте этого.

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

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

def calculate_distance(start, end, units = km):
     distance = end - start
     return(str(distance) + units)

Например, если мы все еще хотим рассчитать пройденное расстояние, мы также можем включить единицу измерения. Часто мы можем работать в километрах, но иногда работать в других единицах измерения. Поэтому мы можем указать «км» в качестве аргумента ключевого слова по умолчанию, который при необходимости можно заменить. Поэтому,

calculate_distance(5,10)
#returns '5km'
calculate_distance(5,10, units = "m")
#returns '5m'

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

calculate_distance(5,10, units = "m")

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

Произвольные списки аргументов

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

def example(name, birthday, *args):
    print(name)
    print(birthday)
    print(args)
    print(args[1])
    return
example("James", "september 4th", "something else", "another thing")

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

Как уже говорилось, «args» — это кортеж всех других необходимых позиционных аргументов. Вы можете извлечь из этого кортежа позиционную индексацию. Здесь мы указали два позиционных аргумента, поэтому args[1] равен второму элементу в кортеже из-за нулевой индексации Python.

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

Словарь аргументов произвольного ключевого слова

Точно так же, как позиционные аргументы связаны с аргументами ключевого слова, *args имеет аналог в **kwargs. По сути, он делает то же самое, что и *args, но вместо позиционных аргументов они являются именованными аргументами. Поэтому, если мы запустим функцию ниже:

def testing_function_two(name, birthday, **kwargs):
    print(name)
    print(birthday)
    print(kwargs)
    print(kwargs['kwarg2'])
return
testing_function_two("James", "september 4th", kwarg1 = "something else", kwarg2 = "another thing")

Мы получаем вывод ниже:

Как видно, **kwargs — это словарь всех переданных именованных аргументов, которые не были перехвачены другими аргументами ключевого слова.

Подобно своему аналогу *args, его следует использовать экономно и только при необходимости.

Краткое содержание

Если можете, придерживайтесь позиционных и ключевых аргументов. Используйте аргументы ключевого слова, когда нет естественного порядка. *args и **kwargs — отличные инструменты, но используйте их экономно и только при необходимости.

Другие программисты больше всего оценят простоту, поэтому не используйте *args и **kwargs, когда они многословны.

Удачного спора.

Спасибо за чтение, и я надеюсь, что это поможет вам.

If I’ve inspired you to join medium I would be really grateful if you did it through this link — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout 365 data science through my affiliate link.

Вот еще кое-что, что я написал: