Функции — важный компонент любого языка, и 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 интерпретатора.