Функции в Python

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

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

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

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

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

Программист может написать собственную функцию или использовать готовые решения языка, если они есть, конечно. Например, лучше самому не написать функцию для определения максимального числа, а воспользоваться стандартной 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)) # можно передать значения в аргументы другой функции

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

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

При описании функции в 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. Тогда она будет существовать и не выполнять никаких действий.

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

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

Вот пример:

def example():
    pass

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

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

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

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

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

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

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

Вот пример:

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 интерпретатора.