Python

Функции в Python шаг за шагом.

Тема этой статьи – функции в языке программирования Python. Функция – это отдельная, независимая часть программы, которая выполняет определенную задачу. Прежде вы уже могли использовать встроенные в Python функции: print(), input(), len(), range(). А сегодня мы научимся создавать собственные функции.

Функции без параметров

Давайте для начала напишем небольшую программу. Эта программа должна вывести на экран прямоугольник из звездочек 3 на 5 (3 строки, 5 столбцов):

for _ in range(3):
    print('*' * 5)

# Выводит:
# *****
# *****
# *****

А теперь представим, что таких прямоугольников нужно изобразить не один а несколько, например 3. Можно сделать так:

for _ in range(3):
    print('*' * 5)
print()
for _ in range(3):
    print('*' * 5)
print()
for _ in range(3):
    print('*' * 5)

# Выводит:
# *****
# *****
# *****
#
# *****
# *****
# *****
#
# *****
# *****
# *****

Этот код полностью решает поставленную задачу, но у него есть недостатки. Во-первых, он громоздкий из-за повторения части кода. Во-вторых, если потребуется изменить размеры прямоугольника, их потребуется менять трижды, в каждой части кода, выводящей прямоугольник.

Вместо повторения кода для вывода прямоугольника, можно перенести его в отдельную функцию. Функцию можно будет вызвать 3 раза. Для создания функции напишем код:

# Объявление функции
def draw_box():
    for _ in range(3):
        print('*' * 5)

# Вызвать функцию можно по ее имени
draw_box()
print()
draw_box()
print()
draw_box()

# Выводит:
# *****
# *****
# *****
#
# *****
# *****
# *****
#
# *****
# *****
# *****

Код стал короче, читабельнее (за счет удачного названия функции), а главное, если потребуются другие размеры прямоугольника, достаточно будет изменить только саму функцию draw_box().

Имена функциям назначаются точно так же, как переменным. Имя функции должно быть достаточно понятным, чтобы любой читающий ваш код, мог догадаться, что именно делает функция. Также, названия функций обычно содержал глагол, так как функция – это какое-то действие. Для имен функций действуют такие же правила, как при именовании переменных:

  • можно использовать большие и маленькие буквы латинского алфавита, цифры и символ нижнего подчеркивания;
  • имя не может начинаться с цифры;
  • большие и маленькие буквы различаются.

Объявление функции

Итак, функция – отдельная, независимая часть программы, выполняющая определенную задачу. Функции объявляются с помощью ключевого слова def (от англ. define – определять). Вот общий синтаксис объявления функции:

def название_функции():
    блок кода

Первая строка объявления функции называется заголовком. Со следующей строки идет блок кода – его называют тело функции. Это набор инструкций, который выполняется каждый раз, когда вызывается функция. Обратите внимание, что каждая строка в теле функции выделена отступом.

Рассмотрим объявление функции:

def print_message():
    print('Я - Артур,')
    print('король британцев.')

Этот фрагмент кода определяет функцию с именем print_message(). Ее тело состоит из двух инструкций. Вызов функции приведет к исполнению этих инструкций.

Вызов функции

Для вызова функции пишут ее название и круглые скобки. Часто начинающие программисты забывают вызывать функцию. Помните, что объявление функции не вызывает ее.

# Объявление функции
def print_message():
    print('Я - Артур,')
    print('король британцев.')

# Вызов функции
print_message()

# Выводит:
# Я - Артур,
# король британцев.

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

# Вызов функции
print_message()  # Получим ошибку - NameError: name 'print_message' is not defined

# Объявление функции
def print_message():
    print('Я - Артур,')
    print('король британцев. ')

При объявлении функции следует убедиться, что каждая строка тела функции начинается с одинакового количества пробелов, иначе произойдет ошибка. Например, приведенное ниже определение функции приведет к ошибке:

def print_greeting():
    print('Добрый день!')
 print('Сегодня мы будем изучать функции.')  # Получим ошибку - Unindent amount does not match previous indent
    print('Это очень важная тема!')

Функции с параметрами

У нас есть функция, которая печатает звездный прямоугольник 3 на 5. Но было бы намного удобнее, если бы функция draw_box() выводила прямоугольник с произвольными размерами. Для этого функции могут принимать параметры. Это делает функции более гибкими.

Объявление функции с параметрами похоже на функцию без параметров:

def название_функции(параметры):
    блок кода

Давайте изменим нашу функцию draw_box(), чтобы она принимала два целочисленных параметра:

  • height – высота прямоугольника
  • weight – ширина прямоугольника.

Для вызова новой версии нашей функции, нам обязательно нужно указать эти значения.

draw_box(3, 5)
print()
draw_box(5, 7)

# Выводит
# *****
# *****
# *****
#
# *******
# *******
# *******
# *******
# *******

Таким образом, мы теперь можем выводить прямоугольники разных размеров. На место параметров мы можем подставлять не только целочисленные константы, но и значения переменных. Например:

n = 3
m = 9
draw_box(n, m)

Область видимости переменных

Переменные, объявленные внутри функции, называют локальными переменными. Они доступны только внутри этой функции. Программный код за ее пределами не имеет доступа к таким переменным.

Например, вот функция, которая выводит информацию о количестве птиц в Москве:

def print_moscow():
    birds = 5000
    print(f'В Москве обитает {birds} птиц.')

Здесь мы объявляем переменную birds и присваиваем ей значение 5000. Эта переменная считается локальной для функции print_moscow(). Если попытаться получить доступ к локальной переменной из другой функции, произойдет ошибка.

def print_moscow():
    birds = 5000
    print(f'В Москве обитает {birds} птиц.')

def print_piter():
    # Получим ошибку - NameError: name 'birds' is not defined
    print(f'В Санкт-Петербурге обитает {birds} птиц.')

Локальные переменные скрыты от других функций, поэтому другие функции могут иметь собственные локальные переменные с тем же именем:

def print_moscow():
    birds = 5000
    print(f'В Москве обитает {birds} птиц.')

def print_piter():
    birds = 3000
    print(f'В Санкт-Петербурге обитает {birds} птиц.')

Но помните, что объявление переменной должно идти перед ее использованием, иначе произойдет ошибка:

def print_moscow():
    # Получим ошибку - UnboundLocalError: cannot access local variable 'birds' where it is not associated with a value
    print(f'В Москве обитает {birds} птиц.')
    birds = 5000

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

Функции с возвратом значения

Функции с возвратом значения похожи на рассмотренные ранее типы функций. Но когда функция с возвратом значения завершается, она возвращает значение в ту часть программы, где она была вызвана. Возвращаемое из функции значение используется как любое другое: оно может быть присвоено переменной, выведено на экран, использовано в математическом выражении (если это число) и т.д.

Примеры встроенных функций с возвратом значений, которыми вы уже могли пользоваться:

  • int() – принимает в качестве аргумента строку, а возвращает целое число.
  • range() – возвращает последовательность целых чисел 0, 1, 2, …
  • len() – возвращает длину строки или списка.

Функция с возвратом значения должна иметь инструкцию return:

def название_функции():
    блок кода
    return выражение

Значение выражения, которое следует за ключевым словом return будет отправлено в ту часть программы, которая вызвала функцию.

Например, напишем функцию, которая вычисляет площадь прямоугольника:

def get_area(height, weight):
    result = height * weight
    return result

Рассмотрим ее работу. Первая инструкция присваивает произведение параметров height и weight переменной result. Затем исполняется инструкция return, которая приводит к завершению исполнения функции и отправляет значение из переменной result назад, в ту часть программы, которая вызвала эту функцию.

def get_area(height, weight):
    result = height * weight
    return result

height, weight = int(input()), int(input())
square = get_area(height, weight)
print('Площадь прямоугольника равна', square)

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

def is_holiday(day):
    if day <= 5:
        return False
    return True

Эта функция принимает номер дня недели. Если это первые 5 дней, то это будний день и функция возвращает False, а остальные инструкции из тела функции не выполняются. В противном случае, если это 6-ой или 7-ой день недели, то есть суббота или воскресенье, то функция возвращает True.

day = int(input())

if is_holiday(day):
    print('Это выходной день')
else:
    print('Это будний день')

Итоги

Разбивая программу на функции, мы получаем более простой код. Его проще читать и понимать. Несколько небольших функций легче понять, чем одну длинную последовательность инструкций. Также функции позволяют избежать многократного повторения кода в программе. Если какая-то операция в программе выполняется в нескольких местах, то можно один раз написать для нее функцию и затем вызывать ее, когда понадобится.

На этом все и спасибо, что дочитали до конца! Освоив функции, вы сделали важный шаг в изучении Python. Дерзайте!