> For the complete documentation index, see [llms.txt](https://voltbro.gitbook.io/turtlebro_py/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://voltbro.gitbook.io/turtlebro_py/tema-7-funkcii-i-moduli.md).

# Тема 7: Функции и модули

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

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

Хорошим аналогом функции можно назвать записку от мамы сыну-школьнику, который должен сделать определенные действия когда придет из школы (разогреть еду, пообедать, вымыть посуду, сделать домашнее задание).&#x20;

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

Давайте рассмотрим все эти этапы подробнее.

### Определение функции:

Продолжая аналогию с запиской, давайте разберемся как именно выглядит описание функции или того что надо сделать. В начале идет ключевое слово `def` сокращение от define - определять. Затем идет название функции. Название это просто имя, которое в дальнейшем мы будем использовать чтобы понимать какую группу инструкций нам брать.&#x20;

О том как правильно выбирать названия для функций есть [рекомендации сообщества Python](https://peps.python.org/pep-0008/#function-and-variable-names), ознакомьтесь с [ними](https://peps.python.org/pep-0008/#function-and-variable-names).

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

Давайте на примере записки, будем определять функцию "домашнее задание" - `home_work`.

```python
def home_work():
    tb.say("Привет, сынок!")
    tb.say("Тебе задали задачи №12 и №14 по математике")
    tb.say("Реши их")
```

В этом примере мы определили функцию home\_work, в "теле" которой содержатся инструкции сыну что надо сделать с домашней работой.&#x20;

### Вызов функции

Функция определена - записка написана, но когда она будет прочитана и выполнена? Тогда когда мы попросим это сделать в нашей программе. Для того чтобы выполнить ранее определенную функцию - ее надо вызвать. Для этого напишем имя нашей функции и после него поставим две круглые скобки. Такие круглые скобки после имени функции называются оператором вызова.

```python
home_work()
```

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

```python
... # какой-то код, который выполнялся до момента вызова функции
home_work() # непосредственно вызов функции. 
#В этот момент начинает выполняться код описаный в теле функции
... # какой-то код, который будет выполняться после того как функция отработает
```

### Возвращение значения

После того как функция исполнит весь код, который находится в ее "теле", она может (но не обязана) вернуть какое-то значение. Это может быть простое целочисленное значение типа `1` или `8`, или значение с плавающей точкой `2,71` или `3,15`, `True` или `False` или какая-то сложная многосоставная структура данных. Значение может быть каким то заранее определенным, например, `1` если функция отработала с ошибкой и `0` если все нормально. Или данное значение может быть рассчитано как результат работы функции.&#x20;

```python
def home_work():
    tb.say("Привет, сынок!")
    tb.say("Тебе задали задачи №12 и №14 по математике")
    tb.say("Реши их")
    res_12 = 100 #Результат решения задачи №12
    res_14 = 200 #Результат решения задачи №14
    return res_12, res_14
```

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

### Использование возвращаемого значения

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

```python
result_1, result_2 = home_work()
print(result_1, " ", result_2)  # Вывод: 100 200
```

В данном случае мы говорим, что в переменные `result_1` и `result_2` будут присвоены возвращаемые функцией `home_work` значения, которые в дальнейшем мы распечатаем.

### Параметры функций

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

На самом деле мы уже пользовались функциями и передавали в них параметры, например в случае с `tb.say("Привет я робот")` - здесь мы вызываем у робота функцию `say` и передаем ей `"Привет я робот"` как параметр.

Давайте модифицируем функцию `home_work`, чтобы она принимала параметры номера задач по математике, которые надо решить:

```python
def home_work(n1, n2):
    tb.say("Привет, сынок!")
    tb.say("Тебе задали задачи " + n1 + " и " + n2 + " по математике")
    tb.say("Реши их")
    res_12 = 100 #Результат решения задачи №12
    res_14 = 200 #Результат решения задачи №14
    return res_12, res_14
```

В этом примере, `n1` и n2 являются параметрами функции `home_work`. При вызове функции мы должны передать два значения для этих параметров. Например:

```python
home_work(17, 24)
```

При вызове функции с параметрами `17` и `24`, робот скажет что задачи 17 и 24 заданы в качестве домашнего задания.

Обратите внимание, что после передачи параметра в функцию, внутри функции он будет называться так как мы его указали в определении функции. Т.е. в нашем случае это будут переменные `n1` и `n2` . Далее уже в самой функции мы можем делать с этими параметрами всё что захотим, складывать их, делить, умножать, передавать дальше в другие функции, которые мы можем вызвать внутри нашей функции и т.д.

### Модули

В Python как и во многих других языках программирования есть возможность объединять функции в модули. Например, функции относящиеся к роботу объединены в модуль `turtlebro_py`

Для получения доступа к функциям этого модуля мы должны импортировать его&#x20;

```python
import turtlebro_py
```

Для использования функций и классов из стандартных модулей необходимо выполнить импорт модуля в программу. Например, для использования функций модуля `math` для выполнения математических операций, мы можем выполнить следующий импорт:

```python
import math
```

После этого мы можем обращаться к функциям модуля, используя синтаксис `модуль.функция()`. Например, чтобы вычислить квадратный корень числа, мы можем использовать функцию `math.sqrt()`:

```python
import math

number = 16
square_root = math.sqrt(number)
print(f"Квадратный корень числа {number} равен {square_root}")
```

В этом примере мы импортировали модуль `math` и использовали его функцию `sqrt()` для вычисления квадратного корня числа 16.

Также мы можем импортировать не весь модуль, а лишь определенные функции или группы функций (объединённые в классы), для этого при импорте нам надо указать, какие именно функции мы хотим импортировать.

```python
from math import sin, cos, pi
```

В данном случае из модуля math мы импортировали функцию расчета синуса, косинуса и число Пи.&#x20;

На следующем уроке мы продолжим работать с функциями более подробно.
