Skip to content

Latest commit

 

History

History
168 lines (110 loc) · 13.5 KB

File metadata and controls

168 lines (110 loc) · 13.5 KB

Урок 29: Аргументы функции (позиционные и именованные аргументы, аргументы по умолчанию)

Функции — это не просто блоки кода, которые выполняют действия. Они — основа организации программ, позволяющая писать эффективный, читаемый и универсальный код. Чтобы сделать функции по-настоящему гибкими, нам нужно уметь передавать им данные. Это возможно благодаря аргументам, которые выступают "мостом" между вызовом функции и ее внутренним кодом.

29.1 Обзор типов аргументов

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

Основные виды аргументов:

  • Позиционные аргументы.
  • Именованные аргументы.
  • Аргументы по умолчанию.

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

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

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

Давайте представим, что мы пишем программу для расчета стоимости товара:

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 руб.

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

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

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

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

Вернёмся к примеру с ценой товара, но теперь используем именованные аргументы:

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="мороженое")
# Вывод: Ваш заказ: паста и вода, десерт: мороженое

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

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

Пример: Представьте программу для создания визитных карточек. Если пользователь не указывает компанию, мы считаем, что он — "Фрилансер". Это позволяет упростить создание визиток для частных специалистов.

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

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

29.5 Комбинирование разных типов аргументов

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

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="сок")          # Указываем только напиток

29.6 Ошибки и тонкости

Работая с аргументами, важно понимать, какие ошибки могут возникнуть:

  • Пропущенные аргументы: Если обязательные аргументы не переданы, Python выдаст ошибку:

    def greet(name, age):
        print(f"Привет, {name}! Тебе {age} лет.")
    
    greet("Андрей")  # Ошибка: аргумент age не передан
  • Дублирование аргументов: Если один и тот же аргумент передан и позиционно, и как именованный, Python не сможет понять, какое значение использовать:

    greet("Андрей", age=25, name="Иван")  # Ошибка

Вопросы:

  1. Что такое позиционные аргументы? Как они передаются в функцию? Приведите пример.
  2. Чем именованные аргументы отличаются от позиционных? Какой из способов вызова функции лучше использовать для читабельности кода?
  3. Почему нельзя размещать обязательные аргументы после аргументов со значением по умолчанию в объявлении функции?
  4. Что произойдёт, если вы попытаетесь передать значение именованного аргумента дважды: один раз как позиционный и второй раз как именованный?

Задачи:

  1. Напишите функцию check_registration, которая принимает имя и возраст пользователя. Если возраст меньше 18, функция возвращает строку: "Регистрация запрещена." Иначе: "Вы успешно зарегистрированы!" Аргумент age должен быть по умолчанию равен 17. Проверить работу функции.

  2. Создайте словарь с продуктами и их ценами products = {"Яблоко": 100, "Банан": 80, "Виноград": 150}. Напишите функцию apply_discount(products, discount=10), которая принимает название продукта и скидку в процентах. Значение скидки по умолчанию должно быть 10 процентов. Функция возвращает словарь с названиями продуктов и их итоговыми ценами. Проверить работу функции.

  3. Объявите в программе функцию с именем check_password, которая первым параметром принимает строку (пароль) и имеет второй параметр chars с начальным значением в виде строки "$%!?@#". Функция должна проверять, есть ли в пароле хотя бы один символ из chars и что длина пароля не менее 8 символов. Если проверка проходит, то функция возвращает булево True, иначе False.

  4. На вход программе подается строка. Напишите функцию character_statistics(text, ignore_spaces=True), которая считает количество букв, цифр и остальных символов. Аргумент ignore_spaces определяет, учитывать ли пробелы. Пример входных данных: Python 3.8 is awesome!.

  5. На вход программе подается строка со словами записанными через пробел и минимальная длина строки. Напишите функцию filter_strings(strings, min_length=5), которая возвращает список строк, длина которых больше или равна минимальной длине.

  6. Напишите функцию generate_password, которая создает пароль заданной длины из цифр, букв и символов. Используйте цикл для генерации символов.

  7. Создайте словарь курсов валют. Напишите функцию convert_currency(amount, currency="USD"), которая конвертирует сумму в указанную валюту. Курсы: {"USD": 60, "EUR": 70}.

  8. Объявите в программе функцию, которая первым параметром принимает строку, а второй формальный параметр tag с начальным значением в виде строки "h1" определяет тег, в который должна заключаться первая переданная строка. Например, мы передаем строку "Hello Python" и заключаем в тег "h1". Функция должна вернуть строку (без кавычек): <h1>Hello Python</h1>. После объявления функции далее в программе прочитайте из входного потока строку и дважды вызовите функцию (с выводом результата ее работы на экран): первый раз только со строкой, второй раз со строкой и именованным аргументом tag со значением 'div'.


Предыдущий урок | Следующий урок