Функции
Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len
и range
.
Функция – это, пожалуй, наиболее важный строительный блок любой нетривиальной программы (на любом языке программирования), поэтому в этой главе мы рассмотрим различные аспекты функций.
Функции определяются при помощи зарезервированного слова def
. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию. На примере можно видеть, что на самом деле это очень просто:
Пример: (сохраните как function1.py
)
Вывод:
Как это работает:
Мы определили функцию с именем
sayHello
, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.Обратите внимание, что мы можем вызывать одну и ту же функцию много раз, а значит нет необходимости писать один и тот же код снова и снова.
Параметры функций
Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.
Параметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.
Пример: (сохраните как func_param.py
)
Вывод:
Как это работает:
Здесь мы определили функцию с именем
printMax
, которая использует два параметра с именамиa
иb
. Мы находим наибольшее число с применением простого оператораif..else
и выводим это число.При первом вызове функции
printMax
мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов.printMax(x, y)
назначает значение аргументаx
параметруa
, а значение аргументаy
– параметруb
. В обоих случаях функцияprintMax
работает одинаково.
Локальные переменные
При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.
Пример: (сохраните как func_local.py
)
Вывод:
Как это работает:
При первом выводе значения, присвоенного имени
x
, в первой строке функции Python использует значение параметра, объявленного в основном блоке, выше определения функции.Далее мы назначаем
x
значение2
. Имяx
локально для нашей функции. Поэтому когда мы заменяем значениеx
в функции,x
, объявленный в основном блоке, остаётся незатронутым.Последним вызовом функции
x
, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.
Зарезервированное слово “global”
Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы (т.е. не в какой-либо области видимости, как то функции или классы), необходимо указать Python, что её имя не локально, а глобально (global). Сделаем это при помощи зарезервированного слова global
. Без применения зарезервированного слова global
невозможно присвоить значение переменной, определённой за пределами функции.
Можно использовать уже существующие значения переменных, определённых за пределами функции (при условии, что внутри функции не было объявлено переменной с таким же именем). Однако, это не приветствуется, и его следует избегать, поскольку человеку, читающему текст программы, будет непонятно, где находится объявление переменной. Использование зарезервированного слова global
достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.
Пример: (сохраните как func_global.py
)
Вывод:
Как это работает:
Зарезервированное слово
global
используется для того, чтобы объявить, чтоx
– это глобальная переменная, а значит, когда мы присваиваем значение имениx
внутри функции, это изменение отразится на значении переменнойx
в основном блоке программы.Используя одно зарезервированное слово
global
, можно объявить сразу несколько переменных:global x, y, z
.
Зарезервированное слово “nonlocal”
Мы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый “нелокальной” (nonlocal
) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.
Поскольку в Python всё является выполнимым кодом, вы можете определять функции где угодно.
Давайте рассмотрим пример:
Вывод:
Как это работает:
Когда мы находимся внутри
func_inner
, переменнаяx
, определённая в первой строкеfunc_outer
находится ни в локальной области видимости (определение переменной не входит в блокfunc_inner
), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменнуюx
, следующим образом:nonlocal x
.Попробуйте заменить “
nonlocal x
” на “global x
”, а затем удалить это зарезервированное слово, и пронаблюдайте за разницей между этими двумя случаями.
Значения аргументов по умолчанию
Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=
) с последующим значением.
Обратите внимание, что значение по умолчанию должно быть константой. Или точнее говоря, оно должно быть неизменным.
Пример: (сохраните как func_default.py
)
Вывод:
Как это работает:
Функция под именем
say
используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится один раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного1
для параметраtimes
.При первом вызове
say
мы указываем только строку, и функция выводит её один раз. При втором вызовеsay
мы указываем также и аргумент5
, обозначая таким образом, что мы хотим сказать фразу 5 раз.
Важно
Значениями по умолчанию могут быть снабжены только параметры, находящиеся в конце списка параметров. Таким образом, в списке параметров функции параметр со значением по умолчанию не может предшествовать параметру без значения по умолчанию. Это связано с тем, что значения присваиваются параметрам в соответствии с их положением. Например, def func(a, b=5)
допустимо, а def func(a=5, b)
– не допустимо.
Ключевые аргументы
Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).
Есть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.
Пример: (сохраните как func_key.py
)
Вывод:
Как это работает:
Функция с именем
func
имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.При первом вызове,
func(3, 7)
, параметрa
получает значение3
, параметрb
получает значение7
, аc
получает своё значение по умолчанию, равное10
.При втором вызове
func(25, c=24)
переменнаяa
получает значение 25 в силу позиции аргумента. После этого параметрc
получает значение24
по имени, т.е. как ключевой параметр. Переменнаяb
получает значение по умолчанию, равное5
.При третьем обращении
func(c=50, a=100)
мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметраc
перед значением дляa
, даже несмотря на то, что в определении функции параметрa
указан раньшеc
.
Переменное число параметров
Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек (сохраните как function_varargs.py
):
Вывод:
Как это работает:
Когда мы объявляем параметр со звёздочкой (например,
*param
), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именемparam
.Аналогично, когда мы объявляем параметры с двумя звёздочками (
**param
), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именемparam
.
Только ключевые параметры
Если некоторые ключевые параметры должны быть доступны только по ключу, а не как позиционные аргументы, их можно объявить после параметра со звёздочкой (сохраните как keyword_only.py
):
Вывод:
Как это работает:
Объявление параметров после параметра со звёздочкой даёт только ключевые аргументы. Если для таких аргументов не указано значение по умолчанию, и оно не передано при вызове, обращение к функции вызовет ошибку, в чём мы только что убедились.
Обратите внимание на использование
+=
, который представляет собой сокращённый оператор, позволяющий вместоx = x + y
просто написатьx += y
.Если вам нужны аргументы, передаваемые только по ключу, но не нужен параметр со звёздочкой, то можно просто указать одну звёздочку без указания имени:
def total(initial=5, *, extra_number)
.
Оператор “return”
Оператор return
используется для возврата из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.
Пример: (сохраните как func_return.py
)
Вывод:
Как это работает:
Функция
maximum
возвращает максимальный из двух параметров, которые в данном случае передаются ей при вызове. Она использует обычный условный операторif..else
для определения наибольшего числа, а затем возвращает это число.
Обратите внимание, что оператор return
без указания возвращаемого значения эквивалентен выражению return None
. None
– это специальный тип данных в Python, обозначающий ничего. К примеру, если значение переменной установлено в None
, это означает, что ей не присвоено никакого значения.
Каждая функция содержит в неявной форме оператор return None
в конце, если вы не указали своего собственного оператора return
. В этом можно убедиться, запустив print(someFunction())
, где функция someFunction
– это какая-нибудь функция, не имеющая оператора return
в явном виде. Например:
Оператор pass
используется в Python для обозначения пустого блока команд.
Примечание
Существует встроенная функция max
, в которой уже реализован функционал “поиск максимума”, так что пользуйтесь этой встроенной функцией, где это возможно.
Last updated