Главная Сборник задач

Урок 15. Функции: def и return

Вы уже активно пользуетесь встроенными функциями Python: print() выводит текст, input() читает клавиатуру, len() считает длину списка. Но настоящая суперсила программиста открывается тогда, когда он начинает создавать собственные функции.

⚙️

Что такое функция?

Функция — это именованный мини-блок кода (подпрограмма), который можно создать один раз, а затем вызывать по имени в любом месте программы сколько угодно раз. Это как кнопка на кофемашине: вы один раз настроили рецепт «Капучино», и теперь для приготовления напитка достаточно нажать одну кнопку.

1. Как создать и вызвать функцию: ключевое слово def

Чтобы объявить свою функцию, используется ключевое слово def (от англ. define — определить). После него пишется название функции, круглые скобки () и двоеточие :. Весь код внутри функции обязательно сдвигается вправо на 4 пробела.

# 1. СОЗДАНИЕ (объявление) функции
def greet_player():
    print("--- Добро пожаловать в игру! ---")
    print("Загрузка мира завершена.")

# 2. ВЫЗОВ функции (запускаем её дважды)
greet_player()
greet_player()
--- Добро пожаловать в игру! --- > Загрузка мира завершена. > --- Добро пожаловать в игру! --- > Загрузка мира завершена.
💡 Главное правило: Само по себе описание def ничего не запускает! Компьютер просто запоминает ваш «рецепт» в памяти. Чтобы код внутри функции сработал, функцию нужно вызвать — написать её имя со скобками: greet_player().

2. Параметры и аргументы (Входные данные)

Функция из прошлого примера всегда печатает одно и то же. Чтобы сделать её умной и гибкой, мы можем передавать внутрь скобок переменные — параметры.

# name и level — это ПАРАМЕТРЫ функции
def show_hero(name, level):
    print(f"Герой: {name} | Уровень: {level}")

# "Артур", 10 и "Елена", 25 — это АРГУМЕНТЫ
show_hero("Артур", 10)
show_hero("Елена", 25)
Герой: Артур | Уровень: 10 > Герой: Елена | Уровень: 25

Параметры по умолчанию

Иногда нам хочется, чтобы у параметра было стандартное («запасное») значение на случай, если пользователь ничего не передал при вызове. Для этого в строке def параметру сразу присваивают значение через знак =:

# Если при вызове не указать bonus, он автоматически станет равен 10
def attack(weapon, bonus=10):
    print(f"Удар оружием: {weapon} (Бонус к урону: +{bonus})")

attack("Двуручный меч", 50)  # Передали оба аргумента
attack("Кинжал")             # Второй аргумент не передали, сработает bonus=10
Удар оружием: Двуручный меч (Бонус к урону: +50) > Удар оружием: Кинжал (Бонус к урону: +10)

Симодулятор: Конвейер параметров функции

Меняйте аргументы вызова функции. Попробуйте стереть поле «Бонус», чтобы увидеть, как сработает значение по умолчанию!

3. Возврат результата: ключевое слово return

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

Для возврата результата используется команда return (вернуть).

# Функция принимает два числа, складывает их и ВОЗВРАЩАЕТ сумму
def add_numbers(a, b):
    result = a + b
    return result

# Теперь вызов функции можно сохранить в переменную!
my_sum = add_numbers(15, 25)
print(f"Результат сложения: {my_sum}")

# И мы можем использовать этот результат дальше в математике:
double_sum = my_sum * 2
print(f"Удвоенный результат: {double_sum}")
Результат сложения: 40 > Удвоенный результат: 80

Схема движения данных через функцию с return

Аргументы 15, 25 def add_numbers(a, b): result = 15 + 25 return 40 Переменная my_sum = 40

Главная ошибка новичков: В чем разница между print() и return?

Начинающие часто путают эти две команды. Запомните простое сравнение:

Симодулятор: Что попадет в переменную без return?

Переключайте вкладки ниже, чтобы увидеть, почему замена return на print() ломает программу при попытке использовать результат.

Что сохранилось в коробке price:
Попытка посчитать: price * 2

4. Область видимости: Локальные и глобальные переменные

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

# Глобальная переменная (видна везде)
game_title = "Космический Рейнджер"

def start_mission():
    # Локальная переменная (существует ТОЛЬКО внутри start_mission)
    secret_code = 777
    print(f"Игра: {game_title}, Код миссии: {secret_code}")

start_mission()

# ❌ Если раскомментировать строку ниже, будет ошибка NameError!
# Программа снаружи понятия не имеет, что такое secret_code:
# print(secret_code)
Игра: Космический Рейнджер, Код миссии: 777

5. Практика: 10 задач с разбором

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

Задача 1. Персональное приветствие

Напишите функцию say_hello(name), которая принимает имя человека и выводит на экран строку: "Привет, [имя]! Удачного дня!". Вызовите её для имени "Алексей".

Показать решение и разбор
def say_hello(name):
    print(f"Привет, {name}! Удачного дня!")

say_hello("Алексей")
Разбор: Мы создали функцию с одним параметром name. При вызове say_hello("Алексей") строка "Алексей" попадает в переменную name и подставляется в f-строку.

Задача 2. Площадь прямоугольника (с return)

Создайте функцию get_area(width, height), которая принимает ширину и высоту прямоугольника и возвращает его площадь через return. Сохраните результат для сторон 5 и 8 в переменную и выведите её.

Показать решение и разбор
def get_area(width, height):
    return width * height

room_area = get_area(5, 8)
print(f"Площадь комнаты: {room_area} кв.м.")
Разбор: Вместо того чтобы создавать лишнюю переменную внутри функции, мы можем написать математическое выражение прямо после слова return: return width * height.

Задача 3. Проверка на чётность (Логическая функция)

Напишите функцию is_even(number), которая возвращает True, если число чётное, и False, если нечётное.

Показать решение и разбор
def is_even(number):
    if number % 2 == 0:
        return True
    else:
        return False

print(is_even(10))  # Выведет True
print(is_even(7))   # Выведет False
Разбор: Функция проверяет остаток от деления на 2. Профессионалы часто записывают тело такой функции еще короче — в одну строчку: return number % 2 == 0, так как само сравнение == уже дает `True` или `False`.

Задача 4. Поиск большего из двух чисел

Не используя встроенную функцию max(), напишите свою функцию find_max(a, b), которая принимает два числа и возвращает то, которое больше (если они равны — возвращает любое из них).

Показать решение и разбор
def find_max(a, b):
    if a >= b:
        return a
    return b

print(find_max(42, 19))
Разбор: Обратите внимание: здесь даже не обязательно писать else! Если сработает условие a >= b, команда return a мгновенно завершит функцию. А если не сработает — выполнение дойдет до строки return b.

Задача 5. Конвертер температуры

Напишите функцию celsius_to_fahrenheit(c), которая переводит градусы Цельсия в градусы Фаренгейта по формуле: c * 1.8 + 32 и возвращает результат.

Показать решение и разбор
def celsius_to_fahrenheit(c):
    return c * 1.8 + 32

temp_f = celsius_to_fahrenheit(25)
print(f"25°C по Фаренгейту: {temp_f}°F")
Разбор: Вычисление по формуле упаковано внутрь функции. Теперь в любой части программы мы можем переводить температуру одним вызовом без риска ошибиться в коэффициентах.

Задача 6. Интернет-магазин (Параметр по умолчанию)

Создайте функцию total_cost(price, delivery=300), которая возвращает итоговую стоимость заказа (цена товара плюс доставка). Если стоимость доставки не указана при вызове, она должна равняться 300 рублям.

Показать решение и разбор
def total_cost(price, delivery=300):
    return price + delivery

print(total_cost(1500))       # Доставка по умолчанию (300) -> 1800
print(total_cost(1500, 0))    # Бесплатная доставка (0) -> 1500
Разбор: Параметр delivery=300 срабатывает автоматически при вызове с одним аргументом, но легко перезаписывается, если передать второй аргумент (например, `0`).

Задача 7. Сумма только положительных чисел из списка

Напишите функцию sum_positive(numbers), которая принимает список разных чисел и возвращает сумму только тех из них, которые строго больше нуля.

Показать решение и разбор
def sum_positive(numbers):
    total = 0
    for num in numbers:
        if num > 0:
            total += num
    return total

data = [10, -5, 20, -12, 5]
print(sum_positive(data))
Разбор: Очень важно расположить return total после цикла (на одном уровне отступа с `for`), чтобы функция сначала перебрала все числа, и только в самом конце вернула готовую сумму.

Задача 8. Расчет урона с критическим ударом

Напишите функцию calc_damage(base_dmg, is_crit=False). Если is_crit равен True, функция возвращает удвоенный базовый урон, иначе — обычный базовый урон.

Показать решение и разбор
def calc_damage(base_dmg, is_crit=False):
    if is_crit:
        return base_dmg * 2
    return base_dmg

print(calc_damage(40))        # Обычный удар: 40
print(calc_damage(40, True))  # Критический удар: 80
Разбор: Так как is_crit уже хранит булево значение (`True` или `False`), в условии достаточно написать просто if is_crit: (без `== True`).

Задача 9. Фильтр коротких паролей

Напишите функцию is_strong_password(password), которая проверяет длину строки. Если в пароле 8 или больше символов, функция возвращает True, иначе — False.

Показать решение и разбор
def is_strong_password(password):
    return len(password) >= 8

user_pass = input("Придумайте пароль: ")
if is_strong_password(user_pass):
    print("Пароль надежный!")
else:
    print("Пароль слишком короткий.")
Разбор: Поскольку функция возвращает `True` или `False`, её вызов можно подставлять прямо внутрь условия if is_strong_password(user_pass): — код читается как обычное английское предложение!

Задача 10. Поиск самого длинного слова

Создайте функцию get_longest_word(words), которая принимает список слов и возвращает самое длинное слово из этого списка.

Показать решение и разбор
def get_longest_word(words):
    longest = ""
    for w in words:
        if len(w) > len(longest):
            longest = w
    return longest

items = ["Кот", "Программирование", "Питон", "Код"]
print(get_longest_word(items))
Разбор: Мы заводим переменную longest = "". В цикле сравниваем длину текущего слова len(w) с длиной лучшего найденного слова len(longest). Если нашли слово длиннее — перезаписываем лидера.

🧠 Проверь себя

Закрепим понимание функций:

1. Какое ключевое слово используется для создания собственной функции в Python?
Показать правильный ответ
Ключевое слово def (от англ. define — определить).
2. Что вернет функция и что сохранится в переменную, если внутри функции нет слова return?
Показать правильный ответ
Если в функции нет return, она по умолчанию возвращает специальное пустое значение None (Ничто).
3. Выполнится ли строка print("Пока!"), если она написана внутри функции сразу под строкой return 100?
Показать правильный ответ
Нет, никогда не выполнится. Команда return работает как мгновенный выход из функции — всё, что написано после неё внутри этого же блока, игнорируется.
4. Можно ли обратиться к переменной, созданной внутри функции, из основной программы снаружи?
Показать правильный ответ
Нет, такая переменная является локальной и существует только внутри своей функции. Попытка прочитать её снаружи вызовет ошибку NameError. Чтобы передать её значение наружу, нужно использовать return.