Урок 8. Функции
Функция — именованный кусок программы, который можно вызвать сколько угодно раз. Готовыми функциями вы уже пользовались: print, input, len, sum. В этом уроке — как писать свои. Функции избавляют от повторения кода: одно действие описывается один раз, а вызывается там, где нужно. Программа из функций с понятными именами и читается легче.
Как объявить функцию
def greet(name):
print("Привет,", name)
greet("Аня")
greet("Борис")Привет, Аня
Привет, Борисdef— служебное слово «определить функцию»;greet— имя функции, по тем же правилам, что имена переменных;- в скобках — параметры: имена, под которыми функция получит значения при вызове;
- после двоеточия — тело функции с отступом.
Строки def сами ничего не выполняют: они только описывают функцию. Код внутри работает, когда функцию вызывают — пишут её имя и в скобках значения, аргументы. При вызове greet("Аня") параметр name получает значение "Аня".
Функцию нужно объявить раньше, чем она вызывается: Python читает программу сверху вниз, и вызов до def даст NameError. Поэтому функции обычно пишут в начале файла.
Результат функции: return
Чтобы функция вернула значение, в ней пишут return. Результат можно сохранить в переменную или сразу использовать в выражении:
def square(x):
return x * x
result = square(5)
print(result)
print(square(3) + square(4))25
25print и return — не одно и то же
Это самая частая путаница у начинающих. print выводит значение на экран, а return отдаёт его тому, кто вызвал функцию. Функция без return возвращает особое значение None — «ничего»:
def show_sum(a, b):
print(a + b)
def get_sum(a, b):
return a + b
x = show_sum(2, 3)
y = get_sum(2, 3)
print(x)
print(y)5
None
5Первая пятёрка — это print внутри show_sum. Но в x ничего не попало, поэтому print(x) выводит None. Если результат функции нужен дальше в программе, функция должна его возвращать через return.
Несколько параметров и значения по умолчанию
У параметра может быть значение по умолчанию — оно используется, если аргумент не передали. Аргументы можно передавать и по имени, тогда порядок не важен:
def power(base, exp=2):
return base ** exp
print(power(3))
print(power(2, 10))
print(power(exp=3, base=2))9
1024
8Параметры со значением по умолчанию ставят после обычных: def power(exp=2, base) — ошибка.
Несколько результатов
return может вернуть несколько значений через запятую. На деле это один кортеж — неизменяемый набор значений, который можно сразу разложить по переменным:
def min_max(nums):
return min(nums), max(nums)
low, high = min_max([4, 8, 1, 9])
print(low, high)1 9return завершает функцию
Как только выполнился return, функция заканчивает работу — строки после него не выполняются. Это удобно для проверок. Пример — простое ли число: делители достаточно искать до квадратного корня из n, и при первом найденном сразу ответить «нет»:
def is_prime(n):
if n < 2:
return False
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
return False
return True
for n in range(1, 20):
if is_prime(n):
print(n, end=" ")
print()2 3 5 7 11 13 17 19Функция, которая отвечает «да» или «нет», обычно называется с is_ или has_ и возвращает True или False.
Локальные и глобальные переменные
Переменные, созданные внутри функции, — локальные: они существуют только пока функция работает и снаружи не видны. Переменная, которой присвоили значение внутри функции, — новая локальная, даже если снаружи есть переменная с тем же именем:
count = 0
def add():
count = 10
print("внутри:", count)
add()
print("снаружи:", count)внутри: 10
снаружи: 0Читать внешнюю (глобальную) переменную функция может, а изменить — только если объявить её словом global. Но так делают редко: функция, которая меняет переменные снаружи, путает программу. Лучше передавать значения в параметрах и возвращать результат через return.
Описание функции
Первой строкой тела можно написать строку в тройных кавычках — описание (docstring). Её показывает help, а редакторы — в подсказке при вызове:
def average(nums):
"""Среднее арифметическое списка чисел."""
return sum(nums) / len(nums)
print(average([8, 9, 10]))9.0Пустая функция
Тело функции не может быть пустым. Если функция пока не написана, ставят слово pass — «ничего не делать»:
def todo():
pass
print(todo())NoneКоротко
def имя(параметры):и тело с отступом; функцию объявляют до вызова.returnвозвращает результат и завершает функцию; безreturnфункция возвращаетNone.printвыводит на экран,returnотдаёт значение программе — это разные вещи.- Параметр со значением по умолчанию:
def f(x, y=2); аргументы можно передавать по имени. - Переменные внутри функции локальные; данные в функцию — через параметры, из неё — через
return.