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

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

В языках программирования, таких как Python, существует множество встроенных функций. Мы уже знакомы с такими, как print(), input(), int(), float(), str(), type(). Код их реализации скрыт внутри языка, и мы взаимодействуем с ними через их имена—интерфейсы функций.

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

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

i = 0
while i < 3:
    a = int(input())
    b = int(input())
    print(a+b)
    i += 1

Но, если перед вводом каждой пары чисел нужно выводить сообщение с пояснением цели чисел, причём это сообщение будет меняться каждый раз, цикл прервать нельзя. Это превратится в длинный код с повторяющимися блоками в разных местах:

print("Сколько бананов и ананасов для обезьян?")
a = int(input())
b = int(input())
print("Всего", a+b, "шт.")

print("Сколько жуков и червей для ежей?")
a = int(input())
b = int(input())
print("Всего", a+b, "шт.")

print("Сколько рыб и моллюсков для выдр?")
a = int(input())
b = int(input())
print("Всего", a+b, "шт.")

Как это будет выглядеть на практике:

Сколько бананов и ананасов для обезьян?
15
5
Всего 20 шт.
Сколько жуков и червей для ежей?
50
12
Всего 62 шт.
Сколько рыб и моллюсков для выдр?
16
8
Всего 24 шт.

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

Определение функции. Оператор def

В Python функции определяются с помощью ключевого слова def. Вот пример:

def countFood():
    a = int(input())
    b = int(input())
    print("Всего", a+b, "шт.")

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

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

После заголовка идет тело функции с инструкциями, которые выполняются при её вызове. Важно отличать определение функции от её вызова. Они могут находиться в разных частях кода. Можно определить функцию, но ни разу её не вызвать, но нельзя вызывать функцию, которая ещё не определена.

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

Рассмотрим программу с определённой функцией:

def countFood():
        a = int(input())
        b = int(input())
        print("Всего", a+b, "шт.")

print("Сколько бананов и ананасов для обезьян?")
countFood()

print("Сколько жуков и червей для ежей?")
countFood()

print("Сколько рыб и моллюсков для выдр?")
countFood()

После каждого информационного сообщения функция вызывается, просто указывая её имя со скобками, в которых в нашем примере ничего нет. В данном коде вызывается трижды.

При вызове функции, выполнение программы переключается на её определение и исполняет команды её тела. После выполнения тело функции возвращается к месту вызова, продолжая выполнение расположенного там кода.

В Python определение функции должно находиться перед её вызовом, так как интерпретатор обрабатывает код построчно и он ещё не знает о функции, если её определение находится ниже в коде. Если вызвать функцию перед её определением, выдаётся ошибка NameError:

print("Сколько бананов и ананасов для обезьян?")
countFood()

print("Сколько жуков и червей для ежей?")
countFood()

print("Сколько рыб и моллюсков для выдр?")
countFood()
def countFood():
        a = int(input())
        b = int(input())
        print("Всего", a+b, "шт.")

Результат:

Сколько бананов и ананасов для обезьян?
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    countFood()
NameError: name 'countFood' is not defined

В некоторых компилируемых языках порядок определения функций и их вызова не имеет значение, но для удобства кода программисты всё равно соблюдают определённые правила.

Функции придают программе структуру

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

Например, нужно написать программу, вычисляющую площади фигур. Пользователь выбирает, какую фигуру хочет рассчитать, а после вводит исходные данные. Для разветвления потока выполнения используется оператор if-elif-else:

figure = input("1-прямоугольник, 2-треугольник, 3-круг: ")

if figure == '1':
    a = float(input("Ширина: "))
    b = float(input("Высота: "))
    print("Площадь: %.2f" % (a*b))
elif figure == '2':
    a = float(input("Основание: "))
    h = float(input("Высота: "))
    print("Площадь: %.2f" % (0.5 * a * h))
elif figure == '3':
    r = float(input("Радиус: "))
    print("Площадь: %.2f" % (3.14 * r**2))
else:
    print("Ошибка ввода")

Этот код работает, но рассмотрим вариант с функциями:

def rectangle():
    a = float(input("Ширина: "))
    b = float(input("Высота: "))
    print("Площадь: %.2f" % (a*b))

def triangle():
    a = float(input("Основание: "))
    h = float(input("Высота: "))
    print("Площадь: %.2f" % (0.5 * a * h))

def circle():
    r = float(input("Радиус: "))
    print("Площадь: %.2f" % (3.14 * r**2))

figure = input("1-прямоугольник, 2-треугольник, 3-круг: ")
if figure == '1':
    rectangle()
elif figure == '2':
    triangle()
elif figure == '3':
    circle()
else:
    print("Ошибка ввода")

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

Если нужно изменить алгоритм расчета площади треугольника, не нужно искать код по всей программе. Достаточно просмотреть все объявления функций и изменить код в теле одной из них.

Функции также можно использовать в других программах. Просто импортируйте их из текущего файла с помощью специальных инструментов Python.

Практическая работа

Функции можно вызывать из других функций. Реализуйте программу по следующему описанию.

Основная ветка программы содержит одну строку, вызывающую функцию test(). Она запрашивает ввод целого числа. Если число положительное, вызывается функция positive(), которая выводит "Положительное". Если число отрицательное, вызывается функция negative(), которая выводит "Отрицательное".

Важно, что вызов test() должен быть прописан после всех определений функций. А порядок, в котором они определяются, имеет ли он значение? Могут ли positive() и negative() быть объявлены после функции test()? Проверьте это перемещением объявлений. Проанализируйте результат.

Вопросы для самопроверки:

  1. Что такое функция в программировании и для чего она используется?
  2. Как определяются функции в языке программирования Python?
  3. Почему в Python функция должна быть объявлена до своего вызова?
  4. Как функции помогают улучшить структуру программы?
  5. Можно ли использовать одну функцию в других программах? Если да, то как?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

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

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

    Оператор множественного ветвления языка Python позволяет организовать более двух веток выполнения программы без необходимости вложения условных операторов друг в друга. Конструкция включает одну ветку if, произвольное количество elif и необязательную ветку else.

  10. Цикл while и его применение в Python

    С помощью циклов в программировании организуется многократное следующее друг за другом выполнение одних и тех же участков кода. Бывают циклы с условием и со счетчиком. К первым относится цикл while, или цикл "пока".

  11. Изучите функции и их применение в Python

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

  12. Локальные и глобальные переменные в Python

    В программировании важное значение имеет представление о локальных и глобальных переменных. Локальные переменные существуют внутри функций и не доступны за ее пределами. Глобальные переменные видны во всей программе.

  13. Оператор return и возврат значений в Python

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

  14. Параметры и аргументы функций в Python

    Если функция имеет параметры, то при вызове в нее можно передавать данные в виде аргументов-значений или аргументов-ссылок. Параметры перечисляются в заголовке функции в скобках после имени, представляют собой локальные переменные. В Python тип параметров не указывается, хотя в других языках это может быть обязательным требованием.

  15. Встроенные функции Python для работы

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

  16. Использование модулей в Python

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

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

    Списки в Python - это аналог массивов в других языках программирования. Однако список может содержать элементы разных типов. В терминологии Python список - это изменяемая упорядоченная структура данных. Можно заменять его элементы, добавлять и удалять их, брать срезы. В язык встроены методы для работы со списками.

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.