Урок 7 из 8 · 20 мин · обновлено

Функции: как не повторять код

Зачем нужны функции, как их создавать, передавать параметры и возвращать результат, и почему return — это не то же самое, что print.

Зачем нужны функции

Представьте, что в программе пять раз нужно посчитать цену со скидкой. Можно пять раз скопировать одну и ту же формулу. Но если правило скидки поменяется, придётся искать и исправлять все копии — и где-нибудь обязательно ошибиться.

Функция решает эту проблему: вы один раз описываете действие, даёте ему имя и дальше вызываете по имени. Вы уже пользовались готовыми функциями: print(), len(), round(). Теперь научимся создавать свои.

Как создать функцию

Python
def greet():
    print("Добро пожаловать!")

greet()   # Добро пожаловать!
greet()   # Добро пожаловать!
  • def — ключевое слово для создания функции;
  • greet — её имя, по тем же правилам, что и у переменных;
  • код внутри выделен отступом и выполняется только при вызове.

Параметры

Функции можно передать данные — параметры:

Python
def greet(name):
    print(f"Здравствуйте, {name}!")

greet("Анна")    # Здравствуйте, Анна!
greet("Иван")    # Здравствуйте, Иван!

Параметров может быть несколько, а некоторым можно дать значение по умолчанию — тогда их разрешено не передавать:

Python
def greet(name, greeting="Здравствуйте"):
    print(f"{greeting}, {name}!")

greet("Анна")             # Здравствуйте, Анна!
greet("Иван", "Привет")   # Привет, Иван!

return: вернуть результат

Самое важное в уроке. Сравните две функции:

Python
def discount_print(price):
    print(price * 0.9)

def discount_return(price):
    return price * 0.9

Первая только показывает число на экране. Вторая возвращает его программе — результат можно сохранить и использовать дальше:

Python
total = discount_return(1000) + 300   # 900 + 300
print(total)                          # 1200.0

total = discount_print(1000)          # на экране 900.0
print(total)                          # None — функция ничего не вернула

None — специальное значение «ничего». Его возвращает любая функция без return. Отсюда простое правило: если результат функции нужен дальше в программе — используйте return.

return также сразу завершает функцию:

Python
def check_age(age):
    if age < 18:
        return "Доступ запрещён"
    return "Добро пожаловать"

Видимость переменных

Переменные, созданные внутри функции, живут только пока она работает:

Python
def calc():
    total = 100
    return total

calc()
print(total)   # NameError: name 'total' is not defined

Это защищает от путаницы: функции не мешают друг другу, даже если используют одинаковые имена. Чтобы получить значение наружу, его возвращают через return и сохраняют: total = calc().

Попробуйте сами. Напишите функцию order_total(prices, discount=0), которая принимает список цен и скидку в процентах и возвращает итог. Проверьте: order_total([450, 150, 300]) должна вернуть 900.0, а order_total([450, 150, 300], 10) — 810.0.

Решение
Python
def order_total(prices, discount=0):
    total = sum(prices)
    return total * (100 - discount) / 100

print(order_total([450, 150, 300]))       # 900.0
print(order_total([450, 150, 300], 10))   # 810.0

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

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Что делает ключевое слово def?

  2. Функция считает сумму со скидкой, но вместо return в ней стоит print. Что получится, если написать result = discount(1000)?

  3. Как вызвать функцию def greet(name, greeting='Привет'), чтобы получить «Привет, Анна»?

  4. Внутри функции создана переменная total. Что будет, если обратиться к ней после функции?