Аргументы функции: позиционные и именованные

Аргументы функции: позиционные и именованные Функции

Привет! В прошлой статье мы научились создавать и вызывать функции. Но что, если функция принимает несколько параметров? Как правильно передавать значения? Можно ли не указывать какой-то аргумент?

В этой статье мы разберём:

  • Что такое позиционные аргументы
  • Что такое именованные аргументы
  • В чём разница между ними
  • Значения по умолчанию
  • Как смешивать разные типы аргументов

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание функций (defreturn)

Совет: Аргументы — это то, что делает функции гибкими. Чем лучше ты их освоишь, тем мощнее будут твои программы.

Основная часть

Что такое аргументы

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

def greet(name):          # name — параметр
    print(f"Привет, {name}!")

greet("Анна")            # "Анна" — аргумент
greet("Иван")            # "Иван" — аргумент

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

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

def info(name, age, city):
    print(f"{name}, {age}, {city}")

info("Анна", 25, "Москва")   # Анна, 25, Москва

Важно: Порядок имеет значение!

info(25, "Москва", "Анна")   # 25, Москва, Анна (неправильно!)

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

Именованные аргументы — это аргументы, которые передаются с указанием имени параметра. Порядок не имеет значения.

def info(name, age, city):
    print(f"{name}, {age}, {city}")

info(name="Анна", age=25, city="Москва")
info(city="Москва", name="Анна", age=25)   # Тот же результат

Совет: Именованные аргументы делают код более читаемым — сразу понятно, что за значение передаётся.

Смешивание позиционных и именованных аргументов

Можно смешивать оба типа, но есть правило: сначала позиционные, потом именованные.

def info(name, age, city):
    print(f"{name}, {age}, {city}")

info("Анна", 25, city="Москва")   # Правильно
# info(age=25, "Анна", city="Москва")   # Ошибка!

Совет: Сначала позиционные, потом именованные — это правило, которое нужно запомнить.

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

Параметры могут иметь значения по умолчанию. Тогда при вызове их можно не указывать.

def greet(name, greeting="Привет"):
    print(f"{greeting}, {name}!")

greet("Анна")              # Привет, Анна!
greet("Анна", "Здравствуйте")  # Здравствуйте, Анна!
greet("Анна", greeting="Здравствуйте")  # Здравствуйте, Анна!

Совет: Параметры с значениями по умолчанию должны идти после обязательных параметров.

# Правильно
def func(a, b=10):
    pass

# Неправильно
def func(a=10, b):
    pass

Примеры из реальной жизни

Пример 1. Создание профиля пользователя:

def create_profile(name, age, city="Не указан", phone="Не указан"):
    print(f"Имя: {name}")
    print(f"Возраст: {age}")
    print(f"Город: {city}")
    print(f"Телефон: {phone}")

create_profile("Анна", 25)
create_profile("Иван", 30, "Москва")
create_profile("Петр", 35, phone="+7-123-456-78-90")

Пример 2. Расчёт стоимости товара:

def calculate_price(price, tax=0.05, discount=0):
    total = price * (1 + tax)
    total = total * (1 - discount)
    return total

print(calculate_price(100))                  # 105.0
print(calculate_price(100, tax=0.2))         # 120.0
print(calculate_price(100, discount=0.1))    # 94.5
print(calculate_price(100, tax=0.2, discount=0.1))  # 108.0

Пример 3. Логирование сообщений:

def log_message(message, level="INFO", timestamp=None):
    if timestamp is None:
        from datetime import datetime
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] {level}: {message}")

log_message("Приложение запущено")
log_message("Ошибка!", level="ERROR")

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

Важно: Если значение по умолчанию — изменяемый тип (список, словарь), оно создаётся один раз при определении функции и используется для всех вызовов!

def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item(1))   # [1]
print(add_item(2))   # [1, 2] — неожиданность!

Правильно:

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item(1))   # [1]
print(add_item(2))   # [2]

Задачи для закрепления

Задача 1. Напиши функцию greet_user(name, greeting="Привет"), которая выводит приветствие.

Задача 2. Напиши функцию get_info(name, age, city="Не указан"), которая возвращает строку с информацией.

Задача 3. Напиши функцию pow_with_default(base, exponent=2), которая возвращает степень числа.

Задача 4. Напиши функцию create_greeting(name, *, age=None), где age — только именованный аргумент.

Задача 5. Напиши функцию add_item, которая принимает список и элемент, но если список не передан, создаёт новый.

Ответы:

Задача 1.

def greet_user(name, greeting="Привет"):
    print(f"{greeting}, {name}!")

Задача 2.

def get_info(name, age, city="Не указан"):
    return f"Имя: {name}, Возраст: {age}, Город: {city}"

Задача 3.

def pow_with_default(base, exponent=2):
    return base ** exponent

Задача 4.

def create_greeting(name, *, age=None):
    if age is None:
        return f"Привет, {name}!"
    return f"Привет, {name}! Тебе {age} лет."

Задача 5.

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

Нюансы и подводные камни

Ошибка: путаница в порядке

def info(name, age, city):
    print(f"{name}, {age}, {city}")

info(city="Москва", "Анна", 25)   # Ошибка! Именованные после позиционных
info("Анна", 25, city="Москва")   # Правильно

Ошибка: изменяемые типы в значениях по умолчанию

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

add_to_list(1)   # [1]
add_to_list(2)   # [1, 2] — баг!

Как исправить:

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

Ошибка: передача аргументов в неправильном порядке

def divide(a, b):
    return a / b

divide(2, 10)   # 0.2, а не 5
divide(b=10, a=2)   # 0.2

Частые ошибки и как их избежать

Ошибка 1: Неправильный порядок

Всегда сначала позиционные, потом именованные.

Ошибка 2: Изменяемые типы в значениях по умолчанию

Используй None для изменяемых типов.

Ошибка 3: Путаница между параметрами и аргументами

Параметры — в определении, аргументы — при вызове.

Шпаргалка

Что нужноКак пишется
Позиционный аргументfunc(1, 2)
Именованный аргументfunc(a=1, b=2)
Значение по умолчаниюdef func(a=10):
Обязательный параметрdef func(a, b):
Необязательный параметрdef func(a, b=10):
Всегда именованныйdef func(*, a):

Заключение / Выводы

Сегодня мы узнали:

  • Позиционные аргументы — порядок важен
  • Именованные аргументы — порядок не важен
  • Значения по умолчанию — можно не передавать
  • Смешивание позиционных и именованных

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×