Урок 7 из 8 · 20 мин · обновлено
Функции: как не повторять код
Зачем нужны функции, как их создавать, передавать параметры и возвращать результат, и почему return — это не то же самое, что print.
Зачем нужны функции
Представьте, что в программе пять раз нужно посчитать цену со скидкой. Можно пять раз скопировать одну и ту же формулу. Но если правило скидки поменяется, придётся искать и исправлять все копии — и где-нибудь обязательно ошибиться.
Функция решает эту проблему: вы один раз описываете действие, даёте ему имя и дальше вызываете по имени. Вы уже пользовались готовыми функциями: print(), len(), round(). Теперь научимся создавать свои.
Как создать функцию
def greet():
print("Добро пожаловать!")
greet() # Добро пожаловать!
greet() # Добро пожаловать!
def— ключевое слово для создания функции;greet— её имя, по тем же правилам, что и у переменных;- код внутри выделен отступом и выполняется только при вызове.
Параметры
Функции можно передать данные — параметры:
def greet(name):
print(f"Здравствуйте, {name}!")
greet("Анна") # Здравствуйте, Анна!
greet("Иван") # Здравствуйте, Иван!
Параметров может быть несколько, а некоторым можно дать значение по умолчанию — тогда их разрешено не передавать:
def greet(name, greeting="Здравствуйте"):
print(f"{greeting}, {name}!")
greet("Анна") # Здравствуйте, Анна!
greet("Иван", "Привет") # Привет, Иван!
return: вернуть результат
Самое важное в уроке. Сравните две функции:
def discount_print(price):
print(price * 0.9)
def discount_return(price):
return price * 0.9
Первая только показывает число на экране. Вторая возвращает его программе — результат можно сохранить и использовать дальше:
total = discount_return(1000) + 300 # 900 + 300
print(total) # 1200.0
total = discount_print(1000) # на экране 900.0
print(total) # None — функция ничего не вернула
None — специальное значение «ничего». Его возвращает любая функция без return. Отсюда простое правило: если результат функции нужен дальше в программе — используйте return.
return также сразу завершает функцию:
def check_age(age):
if age < 18:
return "Доступ запрещён"
return "Добро пожаловать"
Видимость переменных
Переменные, созданные внутри функции, живут только пока она работает:
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.
Решение
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
Функция ничего не печатает сама — она возвращает число. Поэтому её результат можно сложить с доставкой, сравнить с лимитом или вывести в любом формате.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что делает ключевое слово def?
def (от define — «определить») создаёт функцию. Код внутри неё выполнится только тогда, когда функцию вызовут по имени.
-
Функция считает сумму со скидкой, но вместо return в ней стоит print. Что получится, если написать result = discount(1000)?
print() только показывает значение. Если функция ничего не возвращает через return, Python возвращает специальное значение None.
-
Как вызвать функцию def greet(name, greeting='Привет'), чтобы получить «Привет, Анна»?
У параметра greeting есть значение по умолчанию, поэтому его можно не передавать. Обязателен только name.
-
Внутри функции создана переменная total. Что будет, если обратиться к ней после функции?
Переменные внутри функции локальные: они существуют только во время её работы. Чтобы получить результат наружу, его возвращают через return.