Аргументы по умолчанию и позиционные аргументы

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

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

Позиционные аргументы передаются в функцию строго в том порядке, в котором они указаны при её вызове. Когда функция вызывается, значения передаются в соответствии с их позицией.


Пример:

def greet(first_name, last_name):
    print(f"Привет, {first_name} {last_name}!")
    
greet("Анна", "Иванова")  # Выведет: Привет, Анна Иванова!

В этом примере:

  • Аргумент first_name принимает значение "Анна", так как это первый аргумент при вызове функции.
  • Аргумент last_name принимает значение "Иванова", так как он стоит на втором месте.

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


Особенности:

  • Все аргументы, переданные в функцию, должны соответствовать объявлению функции.
  • Неправильное количество аргументов вызовет ошибку.

Пример ошибки:

greet("Анна")  # Ошибка: отсутствует 1 обязательный аргумент: 'last_name'

Аргументы по умолчанию

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


Пример:

def greet(first_name, last_name="Петров"):
    print(f"Привет, {first_name} {last_name}!")
    
greet("Анна")           # Выведет: Привет, Анна Петров!
greet("Анна", "Иванова")  # Выведет: Привет, Анна Иванова!

В этом примере:

  • Если аргумент last_name не указан, он автоматически примет значение "Петров".
  • Если last_name передан, используется указанное значение.

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


Важные моменты:

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

Пример ошибки:

def greet(last_name="Петров", first_name):
    print(f"Привет, {first_name} {last_name}!")
    
# Ошибка: аргументы с значением по умолчанию должны стоять после позиционных аргументов

Комбинирование позиционных аргументов и аргументов по умолчанию

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


Пример:

def make_coffee(size, sugar=1, milk=False):
    coffee = f"Кофе размером {size}, сахара {sugar} ложка(-и)"
    if milk:
        coffee += ", с молоком"
    else:
        coffee += ", без молока"
    print(coffee)

make_coffee("маленький")             # Выведет: Кофе размером маленький, сахара 1 ложка(-и), без молока
make_coffee("средний", sugar=2)      # Выведет: Кофе размером средний, сахара 2 ложка(-и), без молока
make_coffee("большой", 3, True)      # Выведет: Кофе размером большой, сахара 3 ложка(-и), с молоком

Здесь:

  • size — позиционный аргумент, который всегда нужно указывать при вызове функции.
  • sugar и milk — аргументы по умолчанию. Их можно не указывать, если они вас устраивают, или изменить при необходимости.

Переопределение аргументов по умолчанию

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


Пример:

def greet(first_name, last_name="Петров"):
    print(f"Привет, {first_name} {last_name}!")

greet("Мария", "Смирнова")  # Выведет: Привет, Мария Смирнова!

Здесь мы переопределили аргумент last_name, передав новое значение "Смирнова".


Как избежать ошибок с аргументами по умолчанию


Проблема с изменяемыми типами данных

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

Пример ошибки:

def add_to_list(item, my_list=[]):
    my_list.append(item)
    return my_list

print(add_to_list(1))  # Выведет: [1]
print(add_to_list(2))  # Выведет: [1, 2] — неожиданный результат

 

Правильный способ:

def add_to_list(item, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(item)
    return my_list

print(add_to_list(1))  # Выведет: [1]
print(add_to_list(2))  # Выведет: [2] — ожидаемый результат

 

Вот таблица, обобщающая концепции позиционных аргументов, аргументов по умолчанию и их комбинаций:

РазделОписаниеПримерыОшибки и корректировки
Позиционные аргументыАргументы передаются в функцию в том порядке, в котором они указаны при вызове.def greet(first_name, last_name): print(f"Привет, {first_name} {last_name}!") 
greet("Анна", "Иванова")
greet("Анна") 
Ошибка: отсутствует 1 обязательный аргумент: 'last_name'
Аргументы по умолчаниюАргументы могут иметь значения по умолчанию, что позволяет сделать их необязательными.def greet(first_name, last_name="Петров"): print(f"Привет, {first_name} {last_name}!") 
greet("Анна") 
greet("Анна", "Иванова")
def greet(last_name="Петров", first_name): 
Ошибка: аргументы с значением по умолчанию должны стоять после позиционных аргументов
Комбинирование позиционных аргументов и аргументов по умолчаниюФункции могут использовать как позиционные аргументы, так и аргументы по умолчанию.def make_coffee(size, sugar=1, milk=False): ... 
make_coffee("маленький") 
make_coffee("средний", sugar=2) 
make_coffee("большой", 3, True)
-
Переопределение аргументов по умолчаниюПередача значений для аргументов по умолчанию при вызове функции заменяет значения по умолчанию.def greet(first_name, last_name="Петров"): print(f"Привет, {first_name} {last_name}!") 
greet("Мария", "Смирнова")
-
Проблема с изменяемыми типами данныхИспользование изменяемых объектов (списки, словари) в качестве аргументов по умолчанию может вызвать неожиданные результаты.def add_to_list(item, my_list=[]): my_list.append(item); return my_list 
print(add_to_list(1)) 
print(add_to_list(2))
def add_to_list(item, my_list=None): if my_list is None: my_list = []; my_list.append(item); return my_list 
print(add_to_list(1)) 
print(add_to_list(2))

Эта таблица охватывает основные аспекты работы с позиционными аргументами и аргументами по умолчанию в Python, а также включает примеры и возможные ошибки.

 

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

Перейти к следующему шагу

Комментарии