Глиф Учебники

Урок 8. Функции

Курс «Python» · урок 8 из 10 · 3 минуты чтения

Функция — именованный кусок программы, который можно вызвать сколько угодно раз. Готовыми функциями вы уже пользовались: print, input, len, sum. В этом уроке — как писать свои. Функции избавляют от повторения кода: одно действие описывается один раз, а вызывается там, где нужно. Программа из функций с понятными именами и читается легче.

Как объявить функцию

Python
def greet(name):
    print("Привет,", name)

greet("Аня")
greet("Борис")
Вывод
Привет, Аня
Привет, Борис

Строки def сами ничего не выполняют: они только описывают функцию. Код внутри работает, когда функцию вызывают — пишут её имя и в скобках значения, аргументы. При вызове greet("Аня") параметр name получает значение "Аня".

Функцию нужно объявить раньше, чем она вызывается: Python читает программу сверху вниз, и вызов до def даст NameError. Поэтому функции обычно пишут в начале файла.

Результат функции: return

Чтобы функция вернула значение, в ней пишут return. Результат можно сохранить в переменную или сразу использовать в выражении:

Python
def square(x):
    return x * x

result = square(5)
print(result)
print(square(3) + square(4))
Вывод
25
25
вызов result = square(5) result 25 функция def square(x): x 5 параметр return x * x 5 * 5 = 25 аргумент 5 результат 25
При вызове square(5) аргумент 5 попадает в параметр x, функция считает x * x, и return отдаёт результат 25 обратно — он сохраняется в переменной result.

Это самая частая путаница у начинающих. print выводит значение на экран, а return отдаёт его тому, кто вызвал функцию. Функция без return возвращает особое значение None — «ничего»:

Python
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.

x = show_sum(2, 3) def show_sum(a, b): print(a + b) 5 экран x None в переменную y = get_sum(2, 3) def get_sum(a, b): return a + b пусто экран y 5 в переменную
show_sum выводит 5 на экран, но возвращает None, поэтому в x попадает None; get_sum ничего не выводит, а возвращает 5, и это число попадает в y.

Несколько параметров и значения по умолчанию

У параметра может быть значение по умолчанию — оно используется, если аргумент не передали. Аргументы можно передавать и по имени, тогда порядок не важен:

Python
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 может вернуть несколько значений через запятую. На деле это один кортеж — неизменяемый набор значений, который можно сразу разложить по переменным:

Python
def min_max(nums):
    return min(nums), max(nums)

low, high = min_max([4, 8, 1, 9])
print(low, high)
Вывод
1 9

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

Как только выполнился return, функция заканчивает работу — строки после него не выполняются. Это удобно для проверок. Пример — простое ли число: делители достаточно искать до квадратного корня из n, и при первом найденном сразу ответить «нет»:

Python
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.

Локальные и глобальные переменные

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

Python
count = 0

def add():
    count = 10
    print("внутри:", count)

add()
print("снаружи:", count)
Вывод
внутри: 10
снаружи: 0

Читать внешнюю (глобальную) переменную функция может, а изменить — только если объявить её словом global. Но так делают редко: функция, которая меняет переменные снаружи, путает программу. Лучше передавать значения в параметрах и возвращать результат через return.

программа глобальная переменная count 0 снаружи: 0 def add(): локальная переменная — своя count 10 внутри: 10 исчезает после вызова параметры return
Переменная count внутри add() — своя, локальная, и не меняет глобальную count снаружи; данные в функцию лучше передавать через параметры, а обратно — через return.

Описание функции

Первой строкой тела можно написать строку в тройных кавычках — описание (docstring). Её показывает help, а редакторы — в подсказке при вызове:

Python
def average(nums):
    """Среднее арифметическое списка чисел."""
    return sum(nums) / len(nums)

print(average([8, 9, 10]))
Вывод
9.0

Пустая функция

Тело функции не может быть пустым. Если функция пока не написана, ставят слово pass — «ничего не делать»:

Python
def todo():
    pass

print(todo())
Вывод
None

Коротко

Проверьте себя

1. Что выведет программа?
Python
def double(x):
    x * 2

print(double(5))
2. Что выведет программа?
Python
def f(a, b=10):
    return a + b

print(f(1), f(1, 2))
3. Что произойдёт, если вызвать функцию строкой выше, чем стоит её def?
4. Как функции передать данные и получить результат правильно?