🦊 FoxWiki

Функции

Аналогия: рецепт

Представь что ты повар. Каждый раз когда тебе нужно приготовить пасту — ты достаёшь рецепт, следуешь ему шаг за шагом, и получаешь готовое блюдо. Рецепт написан один раз, а готовить по нему можно сколько угодно раз.

Функция — это рецепт для компьютера. Ты один раз описываешь что нужно сделать, даёшь этому описанию имя, а потом вызываешь это имя когда угодно.


Без функций: проблема

Посмотри на эту программу. Черепашке нужно трижды развернуться на 180 градусов:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Три проблемы:

  1. Повторение кода — если нужно исправить разворот (вдруг через turnRight), придётся исправить в трёх местах
  2. Неочевидно — непонятно что делают два turnLeft рядом, нужно думать
  3. Легко ошибиться — можно случайно написать три turnLeft в одном месте

С функцией: решение

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Теперь:

  • Слово turnAround объясняет себя само
  • Если нужно исправить логику разворота — меняешь только в одном месте
  • Невозможно случайно сделать три turnLeft — всё внутри функции

Функция vs Цикл — в чём разница

Это частая точка путаницы. Давай разберём на примерах.

Цикл — делает одно и то же много раз подряд прямо сейчас:

Редактор Lua
1
2
3
4

Функция — описывает что нужно сделать, но не делает это сразу. Выполняется только когда ты её вызываешь:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13

Видишь? Внутри функции может быть цикл. Это не противоречие — это два разных инструмента, которые отлично работают вместе.

ЦиклФункция
Когда выполняетсяСразу, на местеТолько когда вызвана
Сколько разЗаданное количествоСтолько раз сколько вызовешь
ЗачемПовторить действие N разДать имя блоку кода
Может содержатьФункции внутриЦиклы внутри

Как объявить функцию

Редактор Lua
1
2
3
  • local — функция видна только в этом файле (хорошая привычка)
  • function — ключевое слово
  • имяФункции — придумываешь сам, как переменную
  • () — скобки обязательны (здесь будут параметры, об этом позже)
  • end — закрывает функцию

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

Редактор Lua
1

Функция выполняется только при вызове

Это важно понять. Вот что происходит пошагово:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Вывод:

Начало программы
Привет!
После первого вызова
Привет!
Конец программы

Зачем давать коду имя

Хорошее имя функции — это документация. Сравни два варианта:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Редактор Lua
1
2

Для понимания второго варианта не нужно анализировать код. Имя говорит всё. Детали скрыты внутри функции — ты можешь прочитать их когда нужно, но не обязан держать в голове постоянно.


Локальные переменные в функции

Переменные объявленные через local внутри функции живут только внутри неё. Снаружи их не существует:

Редактор Lua
1
2
3
4
5
6
7
8

Это защищает программу от конфликтов имён. Разные функции могут иметь переменные с одинаковыми именами, и они не будут мешать друг другу:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12

Строим программу из функций

Хорошая программа читается как список шагов:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

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


Функции вызывают другие функции

Функции могут вызывать другие функции. Это позволяет строить сложное из простого:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Частые ошибки

Забыть вызвать функцию:

Редактор Lua
1
2
3
4
5
6

Вызвать до объявления:

Редактор Lua
1
2
3
4
5

Объявляй функции до их использования. Или используй паттерн — все функции вверху файла, основной код внизу.


🚀 Задания

Задание 1 Напиши функцию greet() которая выводит "Привет от черепашки!". Вызови её три раза. Убедись что вывод появился три раза — и что код без функции был бы длиннее.

Задание 2 Есть повторяющийся блок кода — вынеси его в функцию и замени вызовами:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12

Задание 3 Напиши функцию square(size) которая заставляет черепашку пройти квадрат со стороной size. Вызови её с разными значениями: 3, 5, 10.

Задание 4 Объясни (в комментариях) что выведет эта программа и в каком порядке:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Задание 5 Перепиши вот этот "спагетти-код" используя функции. Каждая функция — один логический шаг. Программа должна читаться как 4–5 строк в главном блоке:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
НазадПеребор таблиц
ДалееGPS навигация