# Тема 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;

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://voltbro.gitbook.io/turtlebro_py/tema-7-funkcii-i-moduli.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
