Функции — это не просто блоки кода, которые выполняют действия. Они — основа организации программ, позволяющая писать эффективный, читаемый и универсальный код. Чтобы сделать функции по-настоящему гибкими, нам нужно уметь передавать им данные. Это возможно благодаря аргументам, которые выступают "мостом" между вызовом функции и ее внутренним кодом.
Аргументы — это значения, передаваемые в функцию при ее вызове. Они позволяют параметризовать работу функции и сделать её универсальной.
Основные виды аргументов:
- Позиционные аргументы.
- Именованные аргументы.
- Аргументы по умолчанию.
Аргументы позволяют управлять входными данными функции, задавать поведение по умолчанию и создавать более читаемый код.
Позиционные аргументы — это те, которые передаются в функцию в строгом порядке.
Давайте представим, что мы пишем программу для расчета стоимости товара:
def calculate_price(price, quantity):
total = price * quantity
print(f"Цена за {quantity} единиц(ы) товара: {total} руб.")Эта функция ожидает два аргумента:
- price — цена одной единицы товара.
- quantity — количество.
Порядок передачи важен! Давайте посмотрим, что произойдет, если перепутать местами значения:
calculate_price(100, 2) # Вывод: Цена за 2 единицы товара: 200 руб.
calculate_price(2, 100) # Вывод: Цена за 100 единиц товара: 200 руб.Ошибки нет, но логика нарушена. Если вы передаёте аргументы позиционно, убедитесь, что их порядок соответствует определению функции.
Позиционные аргументы особенно полезны, если их немного и их порядок очевиден.
Именованные аргументы позволяют избежать путаницы с порядком. Вместо передачи значений по позициям, вы явно указываете, какому параметру какое значение соответствует.
Вернёмся к примеру с ценой товара, но теперь используем именованные аргументы:
calculate_price(price=100, quantity=2) # Вывод: Цена за 2 единицы товара: 200 руб.
calculate_price(quantity=2, price=100) # Вывод: Цена за 2 единицы товара: 200 руб.Как видите, порядок перестал быть важным. Это особенно удобно, когда в функции много параметров, и важно явно указать, за что отвечает каждое значение.
Пример: Представьте форму заказа, где клиент может заполнить несколько полей, но не обязательно все. Использование именованных аргументов помогает сделать вызов функции более наглядным:
def place_order(dish, drink="вода", dessert=None):
order = f"Ваш заказ: {dish} и {drink}"
if dessert:
order += f", десерт: {dessert}"
print(order)
place_order("паста", dessert="мороженое")
# Вывод: Ваш заказ: паста и вода, десерт: мороженоеАргументы по умолчанию — это параметры, для которых можно заранее задать значение. Если при вызове функции эти аргументы не указаны, используется значение по умолчанию.
Пример: Представьте программу для создания визитных карточек. Если пользователь не указывает компанию, мы считаем, что он — "Фрилансер". Это позволяет упростить создание визиток для частных специалистов.
def create_business_card(name, phone, company="Фрилансер"):
print(f"Имя: {name}")
print(f"Телефон: {phone}")
print(f"Компания: {company}")
# Если компания не указана, значение по умолчанию — "Фрилансер"
create_business_card("Анна", "+7-900-123-45-67")
# Пользователь явно указывает компанию
create_business_card("Иван", "+7-900-765-43-21", company="ТехноСтар")Аргументы со значением по умолчанию всегда указываются после обязательных аргументов.
def incorrect_function(a=10, b): # Ошибка!
passНужно поменять порядок аргументов:
def correct_function(b, a=10):
passЗначения по умолчанию делают функцию универсальной и удобной, особенно в случаях, когда большинство вызовов используют стандартные параметры.
Чтобы функции оставались удобными и универсальными, часто приходится комбинировать позиционные, именованные и аргументы по умолчанию. Давайте напишем функцию для оформления заказа в ресторане:
def order_food(main_course, drink="вода", dessert=None):
print(f"Основное блюдо: {main_course}")
print(f"Напиток: {drink}")
if dessert:
print(f"Десерт: {dessert}")
# Сценарии вызова:
order_food("пицца") # Вывод: Напиток: вода, Десерт: отсутствует
order_food("паста", dessert="пирожное") # Задаём только десерт
order_food("суши", drink="сок") # Указываем только напитокРаботая с аргументами, важно понимать, какие ошибки могут возникнуть:
-
Пропущенные аргументы: Если обязательные аргументы не переданы, Python выдаст ошибку:
def greet(name, age): print(f"Привет, {name}! Тебе {age} лет.") greet("Андрей") # Ошибка: аргумент age не передан
-
Дублирование аргументов: Если один и тот же аргумент передан и позиционно, и как именованный, Python не сможет понять, какое значение использовать:
greet("Андрей", age=25, name="Иван") # Ошибка
- Что такое позиционные аргументы? Как они передаются в функцию? Приведите пример.
- Чем именованные аргументы отличаются от позиционных? Какой из способов вызова функции лучше использовать для читабельности кода?
- Почему нельзя размещать обязательные аргументы после аргументов со значением по умолчанию в объявлении функции?
- Что произойдёт, если вы попытаетесь передать значение именованного аргумента дважды: один раз как позиционный и второй раз как именованный?
-
Напишите функцию
check_registration, которая принимает имя и возраст пользователя. Если возраст меньше 18, функция возвращает строку:"Регистрация запрещена."Иначе:"Вы успешно зарегистрированы!"Аргумент age должен быть по умолчанию равен 17. Проверить работу функции. -
Создайте словарь с продуктами и их ценами
products = {"Яблоко": 100, "Банан": 80, "Виноград": 150}. Напишите функциюapply_discount(products, discount=10), которая принимает название продукта и скидку в процентах. Значение скидки по умолчанию должно быть10процентов. Функция возвращает словарь с названиями продуктов и их итоговыми ценами. Проверить работу функции. -
Объявите в программе функцию с именем
check_password, которая первым параметром принимает строку (пароль) и имеет второй параметрcharsс начальным значением в виде строки"$%!?@#". Функция должна проверять, есть ли в пароле хотя бы один символ из chars и что длина пароля не менее 8 символов. Если проверка проходит, то функция возвращает булевоTrue, иначеFalse. -
На вход программе подается строка. Напишите функцию
character_statistics(text, ignore_spaces=True), которая считает количество букв, цифр и остальных символов. Аргументignore_spacesопределяет, учитывать ли пробелы. Пример входных данных:Python 3.8 is awesome!. -
На вход программе подается строка со словами записанными через пробел и минимальная длина строки. Напишите функцию
filter_strings(strings, min_length=5), которая возвращает список строк, длина которых больше или равна минимальной длине. -
Напишите функцию
generate_password, которая создает пароль заданной длины из цифр, букв и символов. Используйте цикл для генерации символов. -
Создайте словарь курсов валют. Напишите функцию
convert_currency(amount, currency="USD"), которая конвертирует сумму в указанную валюту. Курсы:{"USD": 60, "EUR": 70}. -
Объявите в программе функцию, которая первым параметром принимает строку, а второй формальный параметр
tagс начальным значением в виде строки"h1"определяет тег, в который должна заключаться первая переданная строка. Например, мы передаем строку"Hello Python"и заключаем в тег"h1". Функция должна вернуть строку (без кавычек):<h1>Hello Python</h1>. После объявления функции далее в программе прочитайте из входного потока строку и дважды вызовите функцию (с выводом результата ее работы на экран): первый раз только со строкой, второй раз со строкой и именованным аргументомtagсо значением'div'.