Программирование и IT
Python: функции
Функция — именованный кусок кода, который принимает значения и возвращает результат. В Python объявление занимает одну строку, но у аргументов есть тонкости: умолчания вычисляются один раз, именованные и позиционные смешиваются по правилам, а без return функция всё равно что-то возвращает.
В этой статье
Объявление и возврат#
Функция начинается со слова def, имени, скобок со списком параметров и
двоеточия. Тело — с отступом в четыре пробела.
"""Вернуть приветствие для имени."""
return f
# Привет, Аня!
Строка в тройных кавычках сразу под def — документация функции, она доступна
через help(greet) и greet.__doc__. Писать её полезно даже для себя: через
месяц это единственный способ вспомнить, что функция обещает.
Если return не выполнился, функция возвращает None — ничего не «падает»,
просто результат пустой:
# печатает, но не возвращает
= # 5
# None
Эта путаница print и return — ошибка номер один у начинающих. print
показывает значение человеку, return отдаёт его коду.
Аргументы: позиционные, именованные, со значением по умолчанию#
return **
# 9
# 27
# 8
Позиционные аргументы сопоставляются по порядку, именованные — по имени и
могут идти в любом порядке. Параметры со значением по умолчанию объявляются
только после обычных: def f(a=1, b) — синтаксическая ошибка.
Звёздочка в списке параметров делает всё, что за ней, «только по имени» — это
спасает от нечитаемых вызовов вроде save(data, True, False):
return f
# отчёт / перезапись: True
Переменное число аргументов#
*args собирает лишние позиционные аргументы в кортеж, **kwargs — именованные
в словарь.
return
# (1, 2, 3) {'скидка': 5}
# 6
Та же звёздочка работает и при вызове — она раскрывает готовую
последовательность или словарь в аргументы:
=
# 8
# 125
Изменяемое значение по умолчанию#
Выражение в умолчании вычисляется один раз — в момент объявления функции, а не
при каждом вызове. Поэтому список или словарь в умолчании живёт между вызовами:
return
# ['a']
# ['a', 'b'] — не то, чего ждали
Лечится одинаково всегда: умолчанием ставят None, а настоящее значение
создают внутри.
=
return
# ['a']
# ['b']
Область видимости#
Имя, которому присвоили внутри функции, считается локальным для всей функции —
даже если присваивание стоит в последней строке.
= 0
global
+= 1
# 1
Без строки global counter тот же код упал бы с UnboundLocalError. Но
global — плохая привычка: чаще нужно принять значение аргументом и вернуть
новое. Читать глобальные значения внутри функции можно и без объявления.
Небольшая практика: напиши функцию stats(*numbers), которая возвращает
кортеж из минимума, максимума и среднего, и проверь, что она работает и от
stats(1, 2, 3), и от stats(*[1, 2, 3]). Дальше пригодятся
декораторы — они как раз надстройки над функциями,
и исключения, чтобы аккуратно сообщать об
ошибочных аргументах.
План по этапам
- Простая функция с returnНаписать функцию, которая принимает два числа и возвращает их сумму; вывести результат через print.
- Умолчания и именованные аргументыДобавить параметр со значением по умолчанию и вызвать функцию тремя способами.
- Собрать *argsФункция с переменным числом аргументов, которая считает среднее; вызвать её с раскрытием списка.
- Воспроизвести ловушкуВыполнить пример с box=[] дважды подряд и убедиться, что список накапливает значения.
- Переписать безопасноЗаменить умолчание на None и проверить, что вызовы больше не влияют друг на друга.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Что выведет: def f(a, b=2): return a * b; print(f(3))?
2.Что напечатает: def f(x): print(x); r = f(1); print(r)?
3.Что выведет второй вызов: def c(i, box=[]): box.append(i); return box; c('a'); print(c('b'))?
4.Что вернёт: def t(*args): return len(args); t(1, 2, 3, 4)?
Источники
-
Учебник Python: определение функцийРаздел про def, умолчания, *args и **kwargsбесплатно
-
Справочник встроенных функцийsum, min, max, sorted и другие функции для проверки своих решенийбесплатно
-
PEP 8 — стиль кодаКак называть функции и параметрыбесплатно
Было полезно?