Урок 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. Параметры и аргументы (Входные данные)
Функция из прошлого примера всегда печатает одно и то же. Чтобы сделать её умной и гибкой, мы можем передавать внутрь скобок переменные — параметры.
- Параметр — это переменная в круглых скобках при создании функции (в строке с
def). - Аргумент — это конкретное значение (число или текст), которое мы передаем в скобки при вызове функции.
# name и level — это ПАРАМЕТРЫ функции
def show_hero(name, level):
print(f"Герой: {name} | Уровень: {level}")
# "Артур", 10 и "Елена", 25 — это АРГУМЕНТЫ
show_hero("Артур", 10)
show_hero("Елена", 25)
Параметры по умолчанию
Иногда нам хочется, чтобы у параметра было стандартное («запасное») значение на случай, если пользователь ничего не передал при вызове. Для этого в строке def параметру сразу присваивают значение через знак =:
# Если при вызове не указать bonus, он автоматически станет равен 10
def attack(weapon, bonus=10):
print(f"Удар оружием: {weapon} (Бонус к урону: +{bonus})")
attack("Двуручный меч", 50) # Передали оба аргумента
attack("Кинжал") # Второй аргумент не передали, сработает bonus=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}")
Схема движения данных через функцию с return
Главная ошибка новичков: В чем разница между print() и return?
Начинающие часто путают эти две команды. Запомните простое сравнение:
print()— просто рисует пиксели на мониторе для глаз человека. В саму программу она ничего не отдает (возвращает пустоту — специальный типNone).return— отдает реальные данные обратно в руки программе, чтобы их можно было сохранить в переменную. Кроме того, командаreturnмгновенно завершает работу функции (любой код внутри функции на строчках ниже `return` никогда не выполнится).
Симодулятор: Что попадет в переменную без return?
Переключайте вкладки ниже, чтобы увидеть, почему замена return на print() ломает программу при попытке использовать результат.
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)
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
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("Пароль слишком короткий.")
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). Если нашли слово длиннее — перезаписываем лидера.🧠 Проверь себя
Закрепим понимание функций:
Показать правильный ответ
def (от англ. define — определить).return?
Показать правильный ответ
return, она по умолчанию возвращает специальное пустое значение None (Ничто).print("Пока!"), если она написана внутри функции сразу под строкой return 100?
Показать правильный ответ
return работает как мгновенный выход из функции — всё, что написано после неё внутри этого же блока, игнорируется.Показать правильный ответ
NameError. Чтобы передать её значение наружу, нужно использовать return.