Функции: def, return, параметры
Зачем функции
Функция — именованный кусок кода, который можно вызывать много раз. Функции:
- убирают повторы (принцип DRY — Don't Repeat Yourself);
- дают имя действию:
calculate_tax(price)понятнее десяти строк формул; - разбивают программу на части, которые легко тестировать по отдельности.
def square(x):
"""Вернуть квадрат числа."""
return x * x
print(square(5))
print(square(square(3)))
Нажмите 👣 Пошагово: визуализатор покажет, как при вызове появляется новый кадр square() со своей переменной x, а после return кадр исчезает.
Параметры и return
def rectangle(width, height):
area = width * height
perimeter = 2 * (width + height)
return area, perimeter # возвращается кортеж
a, p = rectangle(3, 4) # распаковка
print(a, p)
print(rectangle(3, 4))
returnзавершает функцию и возвращает значение.- Можно вернуть «несколько значений» — на самом деле это один кортеж.
- Без
return(или с пустымreturn) функция возвращаетNone.
def sign(x):
if x > 0:
return "плюс"
if x < 0:
return "минус"
# здесь return нет → None
print(sign(5), sign(-1), sign(0))
print — не return
print выводит на экран, но функция при этом возвращает None. Если результат нужен дальше в программе — используйте return. Частая ошибка новичков в тестовых заданиях.
Аргументы: позиционные, именованные, по умолчанию
def order(item, qty=1, price=100):
return f"{item}: {qty} шт × {price} = {qty * price}"
print(order("ручка")) # qty и price по умолчанию
print(order("тетрадь", 3)) # позиционно
print(order("карандаш", price=20)) # по имени — можно пропустить qty
print(order(price=50, item="ластик", qty=2)) # порядок именованных не важен
Параметры со значением по умолчанию идут после обязательных.
Не используйте изменяемые значения по умолчанию
def add(item, items=[]): — список создаётся один раз при определении функции и общий для всех вызовов. Пишите items=None и внутри if items is None: items = []. Это одна из самых частых ловушек на собеседованиях — разберём её подробно в уроке «Классические ловушки».
Docstring
Первая строка-литерал в теле — строка документации. Её показывают help(), IDE и генераторы документации.
def celsius_to_fahrenheit(c):
"""Перевести температуру из градусов Цельсия в Фаренгейты.
>>> celsius_to_fahrenheit(100)
212.0
"""
return c * 9 / 5 + 32
print(celsius_to_fahrenheit.__doc__)
help(celsius_to_fahrenheit)
Функции — это объекты
Функцию можно положить в переменную, список, словарь, передать в другую функцию:
def hello():
return "привет"
say = hello # без скобок — сам объект функции
print(say(), say.__name__, type(say))
operations = {"+": lambda a, b: a + b, "*": lambda a, b: a * b}
print(operations["*"](6, 7))
def apply_twice(func, x):
return func(func(x))
print(apply_twice(lambda n: n * 10, 3))
Это основа для функций высшего порядка и декораторов — мы вернёмся к ним в модуле «Функции глубже».
Локальные переменные
Переменные, созданные внутри функции, локальны: снаружи их не видно, и они исчезают после возврата.
def f():
secret = 42
return secret
print(f())
print(secret) # NameError: name 'secret' is not defined
Хорошая функция
- Делает одну вещь, и её имя — глагол, описывающий эту вещь:
parse_date,send_email. - Небольшая — обычно до 20–30 строк.
- Получает данные через параметры и отдаёт через
return, а не через глобальные переменные. - Не печатает, если её задача — вычислить (так её проще тестировать и переиспользовать).
Итог
def имя(параметры):+ тело с отступом;returnвозвращает значение и завершает функцию.- Без
returnфункция возвращаетNone; несколько значений — это кортеж. - Аргументы: позиционные, именованные, со значением по умолчанию (не изменяемым!).
- Docstring — документация функции; функции — объекты, их можно передавать.
Практика решено 0 из 5
Напишите функцию bmi(weight, height), которая возвращает индекс массы тела:
вес (кг), делённый на квадрат роста (м), округлённый до 1 знака.
Какие тесты проверяют код (2)
assert bmi(70, 1.75) == 22.9 assert bmi(90, 1.8) == 27.8
def bmi(weight, height):
return round(weight / height ** 2, 1)
Напишите функцию min_max(nums), которая возвращает два значения — минимум и максимум списка —
не используя встроенные min и max. Для пустого списка верните (None, None).
Какие тесты проверяют код (4)
assert min_max([3, 1, 4, 1, 5, 9, 2]) == (1, 9) assert min_max([7]) == (7, 7) assert min_max([]) == (None, None) assert min_max([-5, -2]) == (-5, -2)
def min_max(nums):
if not nums:
return None, None
lo = hi = nums[0]
for x in nums[1:]:
if x < lo:
lo = x
if x > hi:
hi = x
return lo, hi
Что вернёт функция без return?
def greet(name):
print(f"Привет, {name}")
result = greet("Аня")
Напишите функцию make_greeting(name, greeting="Привет", punctuation="!"), которая возвращает
строку "<greeting>, <name><punctuation>". Параметры greeting и punctuation имеют значения по умолчанию.
Какие тесты проверяют код (3)
assert make_greeting("Оля") == "Привет, Оля!"
assert make_greeting("Оля", "Здравствуйте") == "Здравствуйте, Оля!"
assert make_greeting("Оля", punctuation="?") == "Привет, Оля?"
def make_greeting(name, greeting="Привет", punctuation="!"):
return f"{greeting}, {name}{punctuation}"
Чем параметр отличается от аргумента?
Войдите, чтобы отмечать пройденные уроки.