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

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

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

Позиционные аргументы передаются функции в строго определенном порядке. Вот пример, где мы создаем простую функцию для формирования полного имени:
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'  # Объединяем имя и фамилию

print(full_name('Anna', 'Brown'))       # Выводит 'Anna Brown'
В приведенном примере Anna — первый аргумент, а Brown — второй. Если мы поменяем порядок аргументов, получим другой результат:
print(full_name('Brown', 'Anna'))       # Выводит 'Brown Anna'

Именованные Аргументы

Именованные аргументы позволяют указывать имя аргумента при его передаче функции, что повышает читаемость кода. Кроме того, они позволяют задавать значения по умолчанию для необязательных аргументов.
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'

print(full_name(last_name='Brown', first_name='Anna'))  # Выводит 'Anna Brown'
print(full_name(first_name='Anna', last_name='Brown'))  # Выводит 'Anna Brown'
Это дает тот же результат, что и в первом примере, независимо от порядка аргументов.
 
💡
Важно отметить, что при вызове функции позиционные аргументы всегда должны предшествовать именованным аргументам.
Если именованные аргументы используются перед позиционными при вызове функции, Python вызовет синтаксическую ошибку. Это правило помогает интерпретатору понимать, какие аргументы передаются. Если позиционные аргументы следуют за именованными, интерпретатор путается, так как ожидает, что все позиционные аргументы уже переданы. Вот пример неверного вызова функции, который приведет к SyntaxError:
def greet(first_name, last_name):
    print('Hello', first_name, last_name)

greet(last_name='Doe', 'John')
# SyntaxError: positional argument follows keyword argument
Это правило обеспечивает однозначность вызовов функций, делая код более понятным и менее подверженным ошибкам.

Комбинирование Позиционных и Именованных Аргументов

Рассмотрим функцию, которая формирует полное имя, включая отчество:
# Значения по умолчанию для отчества и фамилии установлены как пустые строки
def full_name(first, middle='', last=''):
    return first + ' ' + middle + ' ' + last

print(full_name('Anna', last='Brown'))                   # 'Anna  Brown'
print(full_name('Anna', middle='Louise', last='Brown'))  # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', last='Brown'))         # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', 'Brown'))              # 'Anna Louise Brown'
print(full_name(first='Anna', 'Louise', last='Brown'))   # SyntaxError
В этом примере имя передается как позиционный аргумент, а фамилия — как именованный. Отчество не указано, поэтому используется значение по умолчанию (пустая строка).
Еще одно важное правило: как только вы начали использовать именованные аргументы, все последующие аргументы также должны быть именованными. Например, print(full_name(first='Anna', 'Louise', last='Brown')) вызовет ошибку, потому что позиционный аргумент (Louise) следует после именованного (first='Anna').
Наконец, рассмотрим более сложный пример: функцию, которая вычисляет общую стоимость покупки с необязательными параметрами для налога и скидки.
# Значения по умолчанию для налога и скидки установлены в 0
def calculate_total_cost(price, tax=0.0, discount=0.0):
    return price + price * tax - discount

print(calculate_total_cost(100, tax=0.05))                # 105.0
print(calculate_total_cost(100, discount=10))             # 90.0
print(calculate_total_cost(100, tax=0.05, discount=10))   # 95.0
В этом случае цена является обязательным позиционным аргументом, а налог и скидка — необязательными именованными аргументами. Если они не указаны, то примут значения по умолчанию, равные 0.
 
To check your solution you need to sign in
Sign in to continue