Параметры и аргументы

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

Различие между параметрами и аргументами
def моя_функция(параметр1, параметр2):  # параметры
    print(параметр1, параметр2)

моя_функция("аргумент1", "аргумент2")  # аргументы

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

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

Позиционные аргументы
def информация_о_человеке(имя, возраст, город):
    print(f"Имя: {имя}, Возраст: {возраст}, Город: {город}")

# Порядок важен!
информация_о_человеке("Анна", 25, "Москва")
информация_о_человеке("Москва", "Анна", 25)  # Неправильный порядок

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

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

Именованные аргументы
def информация_о_человеке(имя, возраст, город):
    print(f"Имя: {имя}, Возраст: {возраст}, Город: {город}")

# Порядок не важен при использовании именованных аргументов
информация_о_человеке(город="Москва", имя="Анна", возраст=25)
информация_о_человеке(имя="Петр", город="Санкт-Петербург", возраст=30)

Значения по умолчанию

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

Параметры со значениями по умолчанию
def приветствие(имя, приветствие="Привет", знак="!"):
    print(f"{приветствие}, {имя}{знак}")

приветствие("Анна")                           # Привет, Анна!
приветствие("Петр", "Здравствуй")              # Здравствуй, Петр!
приветствие("Мария", "Добрый день", ".")      # Добрый день, Мария.
приветствие(имя="Сергей", знак="?")           # Привет, Сергей?

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

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

*args - произвольное количество позиционных аргументов
def сумма_чисел(*числа):
    print(f"Переданы числа: {числа}")  # числа - это кортеж
    return sum(числа)

print(сумма_чисел(1, 2, 3))           # 6
print(сумма_чисел(1, 2, 3, 4, 5))     # 15
print(сумма_чисел())                    # 0
**kwargs - произвольное количество именованных аргументов
def информация_о_пользователе(**данные):
    print(f"Получены данные: {данные}")  # данные - это словарь
    for ключ, значение in данные.items():
        print(f"{ключ}: {значение}")

информация_о_пользователе(имя="Анна", возраст=25, город="Москва")
информация_о_пользователе(логин="user123", email="user@example.com")
Комбинирование разных типов параметров
def пример(обязательный, опциональный="по умолчанию", *args, **kwargs):
    print(f"Обязательный: {обязательный}")
    print(f"Опциональный: {опциональный}")
    print(f"Дополнительные позиционные: {args}")
    print(f"Дополнительные именованные: {kwargs}")

пример("обязательное", "новое значение", "доп1", "доп2", ключ1="знач1", ключ2="знач2")

Распаковка аргументов

Можно распаковать последовательности и словари при передаче их в функцию.

Распаковка аргументов
def приветствие(имя, возраст, город):
    print(f"Привет, {имя}! Тебе {возраст} лет, и ты из {города}.")

# Распаковка списка/кортежа
данные = ["Анна", 25, "Москва"]
приветствие(*данные)

# Распаковка словаря
данные_словарь = {"имя": "Петр", "возраст": 30, "город": "Санкт-Петербург"}
приветствие(**данные_словарь)

Практические задания

Задания
  1. Напишите функцию, которая принимает имя и необязательное приветствие (по умолчанию "Привет"), и выводит персонализированное сообщение.
  2. Создайте функцию, которая принимает произвольное количество чисел и возвращает их среднее значение.
  3. Напишите функцию, которая принимает информацию о студенте (имя, возраст, курс) и выводит её в форматированном виде.
  4. Создайте функцию, которая может принимать как позиционные, так и именованные аргументы для создания профиля пользователя.
Решения:

Задание 1:

def персональное_приветствие(имя, приветствие="Привет"):
    print(f"{приветствие}, {имя}!")

персональное_приветствие("Анна")
персональное_приветствие("Петр", "Здравствуйте")

Задание 2:

def среднее_значение(*числа):
    if not числа:
        return 0
    return sum(числа) / len(числа)

print(среднее_значение(1, 2, 3, 4, 5))
print(среднее_значение(10, 20))

Задание 3:

def информация_о_студенте(имя, возраст, курс):
    print("=" * 30)
    print(f"Имя студента: {имя}")
    print(f"Возраст: {возраст}")
    print(f"Курс: {курс}")
    print("=" * 30)

информация_о_студенте("Анна", 20, "Программирование")

Задание 4:

def профиль_пользователя(имя, *хобби, **контакты):
    print(f"Имя: {имя}")
    
    if хобби:
        print("Хобби:")
        for hobby in хобби:
            print(f"  - {hobby}")
    
    if контакты:
        print("Контактная информация:")
        for тип, значение in контакты.items():
            print(f"  {тип}: {значение}")

профиль_пользователя("Анна", "чтение", "плавание", 
                   email="anna@example.com", телефон="+7(123)456-78-90")
Предыдущий урок Следующий урок