Привет! В прошлой статье мы научились создавать и вызывать функции. Но что, если функция принимает несколько параметров? Как правильно передавать значения? Можно ли не указывать какой-то аргумент?
В этой статье мы разберём:
- Что такое позиционные аргументы
- Что такое именованные аргументы
- В чём разница между ними
- Значения по умолчанию
- Как смешивать разные типы аргументов
- Что нужно знать перед началом
- Основная часть
- Что такое аргументы
- Позиционные аргументы
- Именованные аргументы
- Смешивание позиционных и именованных аргументов
- Значения по умолчанию
- Примеры из реальной жизни
- Аргументы по умолчанию и изменяемые типы
- Задачи для закрепления
- Нюансы и подводные камни
- Ошибка: путаница в порядке
- Ошибка: изменяемые типы в значениях по умолчанию
- Ошибка: передача аргументов в неправильном порядке
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный порядок
- Ошибка 2: Изменяемые типы в значениях по умолчанию
- Ошибка 3: Путаница между параметрами и аргументами
- Шпаргалка
- Заключение / Выводы
- КВИЗ
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание функций (
def,return)
Совет: Аргументы — это то, что делает функции гибкими. Чем лучше ты их освоишь, тем мощнее будут твои программы.
Основная часть
Что такое аргументы
Аргументы — это данные, которые мы передаём в функцию при вызове. Они позволяют функции работать с разными значениями.
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): |
Заключение / Выводы
Сегодня мы узнали:
- Позиционные аргументы — порядок важен
- Именованные аргументы — порядок не важен
- Значения по умолчанию — можно не передавать
- Смешивание позиционных и именованных
КВИЗ
Что дальше?








