Функции в Python

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

Что такое функция

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

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

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

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

Объявление

Объявляя функцию, нужно следовать определенным правилам:

  • Объявление происходит с помощью ключевого слова def, за ним идёт имя функции и круглые скобки ().
  • Аргументы, передаваемые в функцию, должны находится в круглых скобках. Там же можно определить их значения по умолчанию, указав их после знака равно.
  • Перед основным содержимым желательно включить строку документации (docstring), которая обычно описывает назначение  и основные принципы работы функции.
  • Тело функции начинается после знака двоеточия. Важно не забыть об отступах.
  • Чтобы выйти из функции в Python, используют оператор return [значение]. Если оператор опущен, будет возвращено значение None.

Функцию можно объявить где угодно: внутри модуля, класса или другой функции. Если она объявляет внутри класса, то называется методом класса и вызывается так: class_name.function().

Синтаксис объявления

Параметры (аргументы) нужно передавать в том порядке, в котором они определены в круглых скобках.

def Имя(аргументы):
    "Документация"
    Тело (инструкции)
    return [значение]

Пример кода

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

def print_sum(a = 2, b = 2):
    sum = a + b
    print(sum)
    return # вернёт None

Вызов

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

# определяем функцию
def print_sum(a = 2, b = 2):
    sum = a + b
    print(sum)
#вызываем её
print_sum(5, 1)

Значение функции можно сразу передать в переменную или в другую функцию:

def sum(a = 2, b = 2):
    sum = a + b
    return sum # вернёт сумму
c = sum(4, 3) # переменная c будет равна возвращаемому значению
print(sum(5, 5)) # можно передать значения в аргументы другой функции
Вызов функции работает медленнее, чем обычный код. Это незаметно, пока её не вызывают в цикле. Если от цикла необходимо добиться максимального быстродействия, нужно отказаться от вызова функции и просто вставить внуть тела цикла её код.

Необязательные параметры

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

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

Вот пример:

def example(first, second=3, third=5):
    print(first)
    print(second)
    print(third)
example('my string', third=4)

Вывод будет следующим:

my string
3
4

Функция с переменным числом аргументов

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

Для того чтобы функция могла принять переменное количество аргументов, перед именем аргумента ставится символ ” * “. Когда программист передаёт аргументы, они записываются в кортеж, имя которого соответствует имени аргумента:

def variable_len(*args):
    for x in args:
        print(x)
variable_len(1,2,3) # Выведет 1,2,3

Вместо одного символа звёздочки можно использовать два, тогда аргументы будут помещаться не в список, а в словарь:

def variable_len(**args):
    print(type(args))
    for x, value in args.items():
        print(x, value)
variable_len(apple = "яблоко", bread = "хлеб") 
# Выведет apple яблоко bread хлеб

Анонимные функции

Это особый вид функций, которые объявляются с помощью ключевого слова lambda вместо def:

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

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

Синтаксис

Синтаксис лямбда функции в Python 3 предусматривает использование только одного выражения: lambda arg1, arg2, … argn: выражение.
На практике они работают так:

x = lambda arg1, arg2: arg1 * arg2
print(x(5,5)) # Выведет 25
print(x(3,5)) # Выведет 15

Возврат значений

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

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

Вот пример когда возвращается список:

def x(n):
    a = [1,3]
    a = a * n
    return a
print(x(2)) # выведет [1,3,1,3]

А это пример того, как функция в Python 3 возвращает несколько значений. Так как переменные перечислены через запятую, то они образуют список. Эти значения можно присвоить сразу нескольким переменным, как это показано в следующем примере:

def example():
    language = "python"
    version = 3
    flag = True
    return language, version, flag
language, version, flag = example()
print(language, version, flag) # выведено будет python 3 True

Рекурсия

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

def f(num):
    if num == 0:
        return 1
    return f(num-1) * num
print(f(5)) # Выведет число 120

Рекурсию рекомендуется использовать только там, где это действительно необходимо. Интерпретатор Python автоматически выделяет память для выполняющейся функции, если вызовов самой себя будет слишком много, это приведёт к переполнению стека и аварийному завершению программы. Следующий код вызовет исключение “RecursionError”, которая показывает, что превышен максимальный лимит рекурсии.

def x(num):
    a = num - 1
    print(a)
    x(a)
x(5)

Узнать максимальный лимит и его изменить можно с помощью getrecursionlimit() и setrecursionlimit(предел) из библиотеки sys.

Один из примеров применения рекурсии – это расчёт чисел Фибоначчи.

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

Чтобы создать пустую функцию, нужно в её теле использовать оператор заглушки pass. Тогда она будет существовать и не выполнять никаких действий.

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

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

Вот пример:

def example():
    pass

Области видимости

Область видимости — важная составляющая любого языка программирования. С её помощью в одном модуле можно использовать одно и то же имя переменной несколько раз.

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

В Python существует две области видимости:

  • Глобальная. Переменные объявляются непосредственно внутри модуля и доступны из любой точки программы.
  • Локальная. Переменные объявляются в теле функции и доступны только внутри неё.

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

Причём чтение глобальной переменной можно осуществить, просто обратившись к ней. А вот для записи надо отдельно указывать с помощью ключевого слова global, что мы работаем именно с глобальной переменной!

Вот пример:

val1 = "my global"
val2 = "another global"
def example():
    print(val1) # Выведет my global
    global val2
    val2 = "change another global"
example()
print(val2) # Выведет change another global

Подробнее про области видимости можно прочитать в отдельной статье на сайте.

Основные встроенные функции в Python

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

  • print() Выводит объекты на экран или в файл. Пример использования print("output string", end=""). Принимает аргументы:
    • object — то, что нужно вывести;
    • sep — разделитель, который ставиться между объектов, по умолчанию — пробел;
    • end — окончание после объекта, например управляющий символ “\n”;
    • file — атрибут, позволяющий передать объект в файл (по умолчанию выводит на экран);
  • len() Возвращает количество элементов, содержащихся в кортеже, словаре или списке.
  • str() Преобразует переданный в качестве аргумента объект в строку.
  • int() Преобразует объект в целое число. Если передать в качестве аргумента строку, вызовется ошибка, целое число выведется без изменений, а у числа с плавающей точкой отбросится дробная часть.
  • range() Возвращает диапазон значений, в основном используется в условии цикла for.
  • bool() Приводит объект в логическому типу. Например, 0 — False, а 1 — True.
  • sum() Возвращает сумму переданных элементов.
  • min() и max() Возвращают минимальный и максимальный элемент из переданных.
  • type() Возвращает тип объекта, обычно используется при отладке кода.
  • dir() Возвращает список имён, доступных в локальной области видимости, или атрибуты объекта, переданного в качестве аргумента.
  • help() Выводит информацию о переданном объекте из встроенной справочной системы. Её целесообразно использовать только в интерактивном режиме Python интерпретатора.