И вот у нас уже 23 места, где мы вставили наш код, который решает задачу. Но вдруг, наши условия изменились, задача внезапно усложнилась и нам нужно переписывать заданный код. Мы его переписали, а теперь вынуждены заменять его в 23 местах. Удобно? Ничуть. затем ещё в одно, и в следующие 20 мест тоже. Удобно? Вполне.
И вот у нас уже 23 места, где мы вставили наш код, который решает задачу. Но вдруг, наши условия изменились, задача внезапно усложнилась и нам нужно переписывать заданный код. Мы его переписали, а теперь вынуждены заменять его в 23 местах. Удобно? Ничуть.
Понятие функции
Чтобы избежать данную проблему, в языке Python существует такой инструмент как функция. Функция — это специальный, именованный блок кода, который позволяет вызывать заключённый в него код из любого места программы, при том, что код объявлен единожды и в одном известном месте.
Таким образом, объявив функцию с кодом, который решает наши задачи единожды, её можно вызывать и обращаться к ней в сотнях и тысячах мест, а редактировать эту функцию, тем не менее, лишь в одном месте, там, где функция была объявлена.
Объявленная функция выглядит следующим образом:
def hello():
print("Привет")
А если подробнее, то:
def имя_функции ([параметры]):
инструкции
Объявление функции состоит из:
def – ключевое слово, оказывающее интерпретатору на то, что объявляется функция.
имя_функции – устанавливает уникальную последовательность символов, по которым можно обратиться и вызвать именно эту функцию
[параметры] – необязательная последовательность переменных, которые можно передать в функцию. Смысл параметров, заключается в том, что благодаря им, мы можем передавать внутрь функции некоторые данные и команды, необходимые для работы функции.
инструкции – это непосредственно строки вашего кода, выполняющие определённые задачи.
: - символ двоеточия, обязательный символ предваряющий начало кода, который вы определяете для функции.
Давайте создадим файл, в директории нашего проекта, созданного в PyCharm, откроем его и пропишем следующий код:
def learn():
print("Привет! Я учу Python!")
Для того чтобы запустить этот код, необходимо обратиться к нему по имени:
def learn():
print("Привет! Я учу Python!")
learn()
Если мы запустим этот код в консоли, то мы увидим следующее сообщение:
Привет! Я учу Python!
Мы можем запустить эту функцию сколько угодно раз:
def learn():
print("Привет! Я учу Python!")
learn()
learn()
learn()
learn()
learn() # ( ) скобки
Результат:
Привет! Я учу Python!
Привет! Я учу Python!
Привет! Я учу Python!
Привет! Я учу Python!
Привет! Я учу Python!
Функция с параметрами
В функцию также можно передавать и данные, при помощи параметров:
def learn(how_much):
print("Привет! Я учу Python уже " + str(how_much) + " дней!")
learn(1)
learn(2)
learn(3)
learn(4)
learn(5)
Результат:
Привет! Я учу Python уже 1 дней!
Привет! Я учу Python уже 2 дней!
Привет! Я учу Python уже 3 дней!
Привет! Я учу Python уже 4 дней!
Привет! Я учу Python уже 5 дней!
Как это работает. При объявлении функции: def learn(имя_переменной): мы указываем, что внутри функции будет объявлена переменная с заданным именем, например: how_much как в нашем случае.
Таким образом, мы можем обращаться к этой переменной внутри функции, как при работе с любой другой переменной:
print("Привет! Я учу Python уже " + str(how_much) + " дней!")
Чтобы "поместить" некоторое значение в эту функцию, достаточно при вызове этой функции указать в скобочках это значение: learn(2)
Следует обратить внимание на то, что внутри функции можно вызывать и другие функции, например, в данном случае мы вызвали функцию print и функцию str.
Также можно передать любое количество переменных в функцию, для этого при объявлении функции просто достаточно указать это в скобках: def learn(имя_переменной1, имя_переменной2):
Соответственно внутри функции появится две переменных: имя_переменной1, имя_переменной2
Необязательные значения
Порой случается так, что значения указывать не всегда необходимо, или есть необходимость установить какое-то общее, наиболее часто встречающееся значение, которое при желании можно изменить. Для этого существуют значения по умолчанию. И выглядят они следующим образом:
def learn(how_much, name="Пользователь"):
print("Привет, " + name +"! Ты учишь Python уже " + str(how_much) + " дней!")
learn(5)
learn(19, "Марк")
Как видите, в момент объявления параметра, мы сразу присваиваем ему значение. Впоследствии, мы можем указать своё значение или не указывать ничего, в таком случае будет подставлено значение по умолчанию.
Параметры с именем
Если у функции имеется два параметра, то мы передаём их в той последовательности, в которой они объявлены в функции. Но при помощи именованных параметров, можно изменить порядок аргументов, которые мы передаём в функцию. На примере прошлой написанной нами функции learn, вспомним, что сперва мы указываем количество дней, которое прошло с начала обучения, а затем имя ученика. Но если при вызове функции мы явно укажем имя аргумента, которому передаём параметр, то можно использовать любую последовательность:
def learn(how_much, name="Пользователь"):
print("Привет, " + name +"! Ты учишь Python уже " + str(how_much) + " дней!")
learn(name="Марк", how_much=19)
Результат:
Привет, Марк! Ты учишь Python уже 19 дней!
Как видите, несмотря на то, что первый параметр при определении функции — это параметр how_much, мы смогли переместить его на второе место просто явно задав имя параметров.
Произвольное количество параметров
При необходимости, мы можем указать разное, не фиксированное количество параметров в нашу функцию, для этого достаточно лишь указать перед параметром символ звёздочка *.
Тогда внутрь функции мы сможем передать различное количество параметров, как в приведённом выше примере. Указывая ряд значений, они записываются в виде массива данных, условно, как некоторая последовательность отдельных значений, записанных в одну переменную. И при помощи цикла for (о нём мы поговорим в следующих уроках) мы можем получить доступ ко всем значениям переданным в функцию.
Пример функции с произвольным количеством параметров:
def summ(*nums):
res = 0
for num in nums:
res += num
print(res)
summ(5,4,7,9)
summ(2,7)
Результат:
25
9
Данная функция просто суммирует все переданные в неё числа и затем, выводит значение суммы на экран. Как видите ошибки нет. Функция успешно принимает различное количество значений и успешно с ними работает.
Инструкция return. Возвращение результата работы функции
В предыдущих примерах функции которые мы создавали не возвращали никакого значения, они просто выводили результат своей работы на экран. Это полезно, когда вам нужно вычислить какое-то значение, и затем его куда-то отправить.
Перепишем функцию таким образом, чтобы она возвращала значение, а не выводила его на экран:
def summ(*nums):
res = 0
for num in nums:
res += num
return res
sum_result = summ(1, 2, 3, 4, 99)
Как видите, здесь мы вместо функции print написали инструкцию return, которая возвращает значение переменной res.
Если мы запустим этот код, то в консоль ничего выведено не будет, т.к. функция просто вернула значение и теперь оно находится в переменной sum_result. Над которой мы, в свою очередь, можем выполнять определённые действия, например, вывести это значение на экран:
def summ(*nums):
res = 0
for num in nums:
res += num
return res
summ_result = summ(1, 2, 3, 4, 99)
print(summ_result)
В консоль будет выведена сумма введенных чисел: 109
Всем советую придерживаться именно такого подхода, когда функция порождающая или вычисляющая данные их обязательно возвращает, а не распечатывает на экран или отправляет куда-то по сети, т.к. всегда есть вероятность, что нам понадобится эти данные так или иначе модифицировать, а для этого их обязательно нужно получить.