Что такое def в Python? Онлайн справочник на itProger

Зачем нужны функции

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

Это простейший способ упаковать логику выполнения отдельных частей программы. При этом сокращается объем и время, которое специалист тратит на создание сценария.

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

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

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

Вот пример:

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

Функции

Для объявления функции служит ключевое слово «def». Аргументы функции задаются в скобках после названия функции. Можно задавать необязательные аргументы, присваивая им значение по умолчанию. Функции могут возвращать кортежи, в таком случае надо писать возвращаемые значения через запятую. Ключевое слово «lambda» служит для объявления элементарных функций .

Предел рекурсии

Существует предел глубины возможной рекурсии, который зависит от реализации Python. Когда предел достигнут, возникает исключение RuntimeError:

Можно изменить рекурсии предел глубины, используя sys.setrecursionlimit(limit) и проверить этот предел sys.getrecursionlimit() .

Из Python 3.5, исключение составляет RecursionError , который является производным от RuntimeError .

Передача аргумента и изменчивость

Сначала немного терминологии:

  • аргумент (фактический параметр): фактическая переменная передается в функцию;
  • Параметр (формальный параметр): принимающая переменная, которая используется в функции.

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

Мутирование параметра приведет к изменению аргумента (если тип аргумента является изменяемым).

Переназначение параметра не переназначит аргумент.

В Python, мы на самом деле не присваивать значения переменным, вместо того, чтобы мы связываем (то есть переуступать, присоединять) переменные (рассматриваемые как имена) к объектам.

  • Неизменные: Целые, строки, кортежи, и так далее. Все операции делают копии.
  • Mutable: списки, словари, наборы, и так далее. Операции могут или не могут мутировать.

Работа с файловой системой

Python имеет много встроенных библиотек. В этом примере мы попробуем сохранить в бинарном файле структуру списка, прочитать ее и сохраним строку в текстовом файле. Для преобразования структуры данных мы будем использовать стандартную библиотеку «pickle»

import pickle mylist = [«This», «is», 4, 13327] # Откроем файл C:\binary.dat для записи. Символ «r» # предотвращает замену специальных сиволов (таких как \n, \t, \b и др.). myfile = file(r«C:\binary.dat», «w») pickle.dump(mylist, myfile) myfile.close()   myfile = file(r«C:\text.txt», «w») myfile.write(«This is a sample string») myfile.close()   myfile = file(r«C:\text.txt») >>> print myfile.read() ‘This is a sample string’ myfile.close()   # Открываем файл для чтения myfile = file(r«C:\binary.dat») loadedlist = pickle.load(myfile) myfile.close() >>> print loadedlist [‘This’, ‘is’, 4, 13327]

Объявление и вызов функций

Объявим функцию:

def hello(): print('Adele is cute')

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

# код выполняется последовательно, поэтому сейчас интерпретатор # не знает о существовании функции hello hello() def hello(): print('Adele is cute') > NameError: name 'hello' is not defined

Поэтому стоит лишь поменять объявление и вызов местами, и всё заработает:

def hello(): print('Adele is cute') hello() > Adele is cute

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

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

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

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

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

Правило LEGB

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

Правило LEGB объясняет схему разрешения имен:

  1. Как только интерпретатор находит переменную внутри инструкции def, он сначала выполняет поиск значений в локальной области видимости.
  2. Если поиск не дает результата, он переходит к области видимости любой всеобъемлющей инструкции def.
  3. Дальше интерпретатор двигается к глобальным именам в верхнем уровне модуля и тем, что обозначены как global.
  4. Если поиск не дает результатов, интерпретатор ищет имена во встроенной области видимости языка Python.

Рассмотрим наглядный пример:

  • >>>L = 85
  • >>>R = 23
  • >>>def пример_2(K):
  • R = 10
  • C = L + K+R
  • return C
  • >>>пример_2(5)
  • 100

Переменные L и R находятся на верхнем уровне и являются глобальными именами. R, C и K – это локальные переменные, так как присваивание значения происходит внутри инструкции def.

Интерпретатор сначала выполняет операцию сложения для локальных R, C и K, игнорируя переменную R вне инструкции def. Потом ищет L, и не найдя ее среди имен local, переходит на верхний уровень.

Аргументы функции

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

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

Как видно из примера, args — это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.

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

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

Вложенные функции и рекурсия

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

def outerFunc(): def firstInner(): print('This is first inner function') def secondInner(): print('This is second inner function') firstInner() secondInner() outerFunc() > This is first inner function > This is second inner function

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

# посчитаем сумму чисел от 1 до num def sum_from_one(num): if num == 1: return 1 return num + sum_from_one(num - 1) print(sum_from_one(5)) > 15

😉

Теги

Adblock
detector