|
1 | | -С помощью определения собственных функций писать и поддерживать программы проще. Они позволяют объединять составные операции в одну. Поэтому в этом уроке поговорим, как создавать собственные функции. |
| 1 | +До этого момента мы использовали только уже готовые функции — `print()`, `len()`, `max()` и другие. Но в Python можно создавать свои собственные функции. Это основа программирования: выделение повторяющейся логики в именованные блоки кода. |
2 | 2 |
|
3 | | -Допустим, мы хотим отправить письма на сайте — это достаточно сложный процесс, который включает взаимодействие с внешними системами. Но если определить функцию, вся сложность скроется за одной простой функцией: |
| 3 | +## Зачем определять функции |
| 4 | + |
| 5 | +Допустим, у нас есть несколько похожих участков кода: |
| 6 | + |
| 7 | +```python |
| 8 | +print('Hello, Hexlet!') |
| 9 | +print('Hello, world!') |
| 10 | +print('Hello, Python!') |
| 11 | +``` |
| 12 | + |
| 13 | +Чтобы не повторять один и тот же шаблон, мы можем оформить его в виде своей функции, которая принимает на вход один параметр и печатает нужную строчку на экран: |
4 | 14 |
|
5 | 15 | ```python |
6 | | -# Гипотетический пример |
7 | | -# Место откуда берется функция |
8 | | -from emails import send |
| 16 | +def say_hello(name): |
| 17 | + print(f'Hello, {name}!') |
| 18 | +``` |
9 | 19 |
|
10 | | -email = 'support@hexlet.io' |
11 | | -title = 'Помогите' |
12 | | -body = 'Я написал историю успеха, как я могу получить скидку?' |
| 20 | +Теперь мы можем вызывать её с разными аргументами: |
13 | 21 |
|
14 | | -# Один маленький вызов — много логики внутри |
15 | | -send(email, title, body) |
| 22 | +```python |
| 23 | +say_hello('Hexlet') # => Hello, Hexlet! |
| 24 | +say_hello('world') # => Hello, world! |
| 25 | +say_hello('Python') # => Hello, Python! |
16 | 26 | ``` |
17 | 27 |
|
18 | | -Внутри себя этот вызов выполняет много логики: соединяется с почтовым сервером, формирует правильный запрос на основе заголовка и тела сообщения, а затем все отправляет, не забыв закрыть соединение. |
| 28 | +В нашем примере функция ничего не возвращает, она действует как `print()` выводя на экран сообщение. |
19 | 29 |
|
20 | | -Создадим нашу первую функцию. Ее задача — вывести на экран приветствие: |
| 30 | +## Синтаксис определения |
21 | 31 |
|
22 | | -```text |
23 | | -Hello, Hexlet! |
| 32 | +```python |
| 33 | +def имя_функции(параметры): |
| 34 | + тело |
24 | 35 | ``` |
25 | 36 |
|
| 37 | +- `def` — ключевое слово, с которого начинается определение. |
| 38 | +- `имя_функции` — любое допустимое имя, как у переменной. |
| 39 | +- В скобках — список параметров, через запятую. |
| 40 | +- После двоеточия — тело функции. Оно пишется с отступом в 4 пробела |
| 41 | +- Чтобы функция что-то делала, в её теле пишется обычный Python-код. |
| 42 | + |
| 43 | +В Python отступы имеют синтаксическое значение. Они показывают, какой код относится к телу функции. Посмотрите на пример: |
| 44 | + |
26 | 45 | ```python |
27 | | -# Определение функции |
28 | | -# Определение не вызывает и не выполняет функцию |
29 | | -# Мы лишь говорим, что теперь такая функция существует |
30 | | -def show_greeting(): |
31 | | - # Внутри тела отступ четыре пробела |
32 | | - text = 'Hello, Hexlet!' |
33 | | - print(text) |
34 | | - |
35 | | -# Вызов функции |
36 | | -show_greeting() # => 'Hello, Hexlet!' |
| 46 | +def say_hi(): |
| 47 | + print('Hi!') |
| 48 | + |
| 49 | +print('Программа продолжается…') |
37 | 50 | ``` |
38 | 51 |
|
39 | | -В отличие от обычных данных, функции выполняют действия. Поэтому их имена нужно указывать через глаголы: «построить что-то», «нарисовать что-то», «открыть что-то». |
| 52 | +Здесь функция `say_hi()` определена, но **`print('Программа продолжается…')`** не относится к функции — у него нет отступа. Он будет выполнен сразу при запуске программы, независимо от вызова `say_hi()`. |
| 53 | + |
| 54 | +Чтобы `say_hi()` сработала, её нужно явно вызвать: |
40 | 55 |
|
41 | | -Описание, которое находится ниже имени функции с отступом, называется **телом функции**. Внутри тела можно описывать любой код. Это как небольшая самостоятельная программа — набор произвольных инструкций. |
| 56 | +```python |
| 57 | +def say_hi(): |
| 58 | + print('Hi!') |
| 59 | + |
| 60 | +say_hi() # => Hi! |
| 61 | +print('Программа продолжается…') |
| 62 | +``` |
42 | 63 |
|
43 | | -Тело выполняется в тот момент, когда запускается функция. При этом каждый вызов функции запускает тело независимо от других вызовов. |
| 64 | +## Пример: функция для печати среднего арифметического |
44 | 65 |
|
45 | | -Тело функции может быть пустым, тогда внутри него используется ключевое слово `pass`: |
| 66 | +Сейчас мы реализуем простую функцию, которая **вычисляет и печатает среднее арифметическое** двух чисел. Среднее арифметическое — это сумма чисел, делённая на их количество. Например, среднее от 6 и 4 считается так: `(6 + 4) / 2 = 5`. |
46 | 67 |
|
47 | 68 | ```python |
48 | | -# Минимальное определение функции |
49 | | -def noop(): |
50 | | - pass |
| 69 | +def print_average(a, b): |
| 70 | + total = a + b |
| 71 | + average = total / 2 |
| 72 | + print(average) |
51 | 73 |
|
52 | | -noop() |
| 74 | +print_average(6, 4) # => 5.0 |
53 | 75 | ``` |
54 | 76 |
|
55 | | -У понятия «создать функцию» много синонимов: «реализовать», «определить» и даже «заимплементить». Они часто встречаются на практике. Создавая свою функцию, вы облегчите сложные операции и сделаете разработку проще. |
| 77 | +Здесь: |
| 78 | + |
| 79 | +- `a` и `b` — входные параметры функции. |
| 80 | +- `total` — сумма этих чисел. |
| 81 | +- `average` — делим сумму на 2, чтобы найти среднее. |
| 82 | +- `print()` выводит результат. |
| 83 | + |
| 84 | +При вызове `print_average(6, 4)` на экран выведется `5.0`. |
| 85 | + |
| 86 | +## Переиспользование и читаемость |
| 87 | + |
| 88 | +Функции помогают не только избегать дублирования, но и делают программы более понятными. Название функции само по себе говорит, что она делает. Это особенно важно в больших проектах, где код читают другие программисты (или вы сами через месяц). |
0 commit comments