К карте
ОСТРОВ ОБСЕРВАТОРИИ · PYTHON · КВЕСТ 6
Своё заклинание
0
Прогресс0 / 6
СДЕЛАЙ ПЕРВУЮ КОМАНДУ

Нажми — и увидишь, что делает команда

Жми кнопки по очереди — это три настоящие команды.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Телефон или компьютер. Редактор открывается прямо в браузере, ставить ничего не надо.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
функции def · аргументы · повторное использование кода
ШАГ 1 ИЗ 6 · ОСТРОВ ОБСЕРВАТОРИИ · КВЕСТ 6

Дай имя куску кода

ЧТО ПРОИСХОДИТ
ЭПИЗОД 6Обсерватория

На полке стоят одинаковые склянки, и на каждой один и тот же рецепт, переписанный от руки.

«Двадцать раз переписывать одно и то же — это не работа, это наказание», — Сова сметает склянки в ящик.

Запиши заклинание один раз, дай ему имя — и зови по имени. Столько раз, сколько нужно.

Сова · звездочёт Обсерватории
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ИСПОЛНЕНИЯ КОДА
Функция «парус» написана один раз — а вызвана трижды с разными местами и размерами. Имя вместо копирования строк.

Это анимация исполнения кода: команды идут строка за строкой, и паруса появляются в том же порядке. Тот же код ты напишешь сам — только не забудь penup() и pendown() внутри функции, иначе черепашка соединит паруса линиями.

КАПИТАН КВЕСТО
Читать текстом
Звездочёт-подмастерье, посмотри на свою программу неба. Заметил, что куски кода повторяются? Нарисовать звезду — семь строк. Три звезды — двадцать одна строка, и все почти одинаковые. Цикл тут не поможет: звёзды в разных местах и разного размера. Нужен другой инструмент — функция. Это заклинание с именем: описал один раз, а дальше вызываешь одной строчкой и подставляешь любые числа.

После этого острова твои программы станут аккуратными.

Как выглядит боль
1  # ТРИ ЗВЕЗДЫ БЕЗ ФУНКЦИИ: одно и то же трижды
2  goto(-100, 50)
3  for i in range(5):
4      forward(40); right(144)
5  
6  goto(0, 50)
7  for i in range(5):
8      forward(40); right(144)
9  
10 goto(100, 50)
11 for i in range(5):
12     forward(40); right(144)

Двенадцать строк ради трёх звёзд, и восемь из них — копии. Точка с запятой в строках 4, 8 и 12 — это «две команды в одной строке»: так короче, но обычно каждую команду пишут на своей. А если захочешь поменять звёзды с пятиконечных на шестиконечные? Придётся править в трёх местах и нигде не забыть.

zvezda.py — то же самое с функцией
1  def star(x, y, size):     # ИМЯ и что ей нужно знать
2      penup()
3      goto(x, y)
4      pendown()
5      for i in range(5):
6          forward(size)
7          right(144)
8  
9  # а теперь три звезды в три строки:
10 star(-100, 50, 40)
11 star(0, 50, 70)     # эта побольше
12 star(100, 50, 25)   # а эта поменьше

Строка 1 говорит: «вот заклинание по имени star, ему нужны три числа». Всё, что с отступом ниже, — тело заклинания. А строки 10–12 вызывают его трижды с разными числами. Захочешь поменять форму — правишь только тело.

ШАГ 2 ИЗ 6 · СОБЕРИ КАРТИНУ

Одна функция — семь вызовов

ТВОЯ ПРОГРАММА
Жми кнопки — каждый клик добавляет одну строку-вызов.

Собери картинку из вызовов. Смотри на код слева: сверху одна функция, ниже — короткие строчки-вызовы. Вся работа описана единожды, а пользуемся сколько нужно.

Настоящая запись — в нашем редакторе «Python в кармане», том самом, что открывается по кнопке ниже. Тот же код, тот же результат — и ставить ничего не надо

Одна функция — три звезды. Сверху описание star в девять строк, а внизу три коротких вызова с разными числами. Смотри на результат: звёзды разного размера и цвета, но код рисования написан один раз.

Из чего состоит функция def слово, с которого всё начинается звезда имя — придумываешь сам (x, y, size) что нужно знать — параметры : двоеточие, дальше тело с отступом Вызов: пишешь имя и числа в скобках Ты уже вызывал чужие функции: forward, goto, print — они устроены так же

Приятная новость: ты пользовался функциями с первого дня. forward(100) — это вызов чужой функции, которую кто-то написал до тебя. Теперь ты умеешь писать свои.

НАШ РЕДАКТОР «PYTHON В КАРМАНЕ» — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН «PYTHON В КАРМАНЕ» — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1Строки 8–10 — то, что станет телом функцииВот этот кусок и есть работа: цикл, который что-то рисует. Заверни его в def — и у куска появится имя. Всё, что внутри функции, живёт на отступе; кончился отступ — кончилась функция.
  • 2Палитра «Циклы и если» — кнопка def ():Она вставит def (): сразу с двоеточием. Имя придумываешь сам, латиницей: zvezda, domik, parus. А в скобки идут параметры — то, что заклинание узнаёт снаружи: def zvezda(size, cvet):
  • 3Кнопка →| отступТело функции живёт на отступе, а вызовы пишут БЕЗ него, у самого левого края. Спутаешь — вызов окажется внутри функции и не сработает никогда. Кнопка «↵ строка» рядом переводит на новую строку.
  • 4Жёлтая кнопка ▶ ЗапуститьФункция написана, а холст пустой — почти всегда одно и то же: ты её описал, но ни разу не позвал. Описание само по себе ничего не рисует. Допиши внизу без отступа zvezda(40), zvezda(70), zvezda(25) — и запускай.
  • 5Холст — три вызова, три фигурыОдна и та же функция, позванная трижды с разными числами, даст три разные фигуры в разных местах. А код рисования написан ровно один раз: захочешь поменять форму — правишь только тело, и меняются сразу все три.
Отмечено:0 из 5

Это наш редактор «Python в кармане» со страницы /kod/ — открой её в соседней вкладке. На кадре он показан дважды: слева вкладка «Код», где ты пишешь, справа вкладка «Результат», куда программа переключится сама после запуска. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.

ШАГ 3 ИЗ 6 · ДВА ВИДА ЗАКЛИНАНИЙ

Одни делают, другие считают

return — когда функция отвечает
1  # функция может ВЕРНУТЬ ответ
2  def area(side):
3      return side * side
4  
5  s = area(5)      # в s попадёт 25
6  print(s)
7  
8  # star ничего не возвращает: она РИСУЕТ.
9  # бывают функции-делатели и функции-считатели.

Есть функции-делатели: нарисовать звезду, спрятать черепашку — они действуют и ничего не возвращают. И есть функции-считатели: получили числа, посчитали и вернули ответ словом return. Ты уже пользовался такой — len(список) возвращает длину.

Как придумывать имена функциям Делатели — глаголом: draw_star() · show_score() · reset_game() Считатели — существительным или вопросом: area() · distance() · did_win() Плохие имена: f(), do(), func1() — через месяц загадка По имени должно быть понятно, что случится — без чтения тела

Хорошее имя функции — маленькая документация. Читаешь draw_star(0, 50, 40) и всё понимаешь, даже не заглядывая внутрь. Ради этого имена и придумывают внимательно.

Проверка · Что делает слово return?

Повторяет функцию заново
Отдаёт результат туда, откуда функцию вызвали
Возвращает черепашку в центр
Функция посчитала — и передаёт ответ обратно в программу.

Зачем функции параметры в скобках?

Просто такое правило записи
Чтобы функция работала быстрее
Чтобы одна функция подходила для разных случаев
Без параметров звезда всегда была бы одного размера и в одном месте.

Оба верных ответа — +10 дублонов.

ЭКСКУРС
КАК ДЕЛАЮТ ПРОФЕССИОНАЛЫ

Функция — способ не держать всё в голове

Человек одновременно удерживает в голове мало вещей. Программа на тысячу строк в голову не помещается — и не должна.

Поэтому код режут на функции: у каждой одно понятное имя и одно дело. Дальше думаешь именами, а не строчками.

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

ШАГ 4 ИЗ 6 · ТРЕНАЖЁР

Функция написана, а экран пустой

zvezdy.py — ничего не рисуется
1from turtle import *
2def star(x, y, size):
3 penup()
4 goto(x, y)
5 pendown()
6 for i in range(5):
7 forward(size)
8 right(144)
9done()
ЧТО ПРОИСХОДИТ
Окно открылось, черепашка стоит в центре, экран пустой. Ошибок нет, программа отработала спокойно.

Ошибок нет, экран пустой. Самая частая беда с функциями у новичков — и лечится одной строкой. Найди место, где чего-то не хватает.

Описать ≠ выполнить def star(...): записали рецепт в тетрадь star(0, 0, 60) приготовили по рецепту Скобки в вызове обязательны, даже если параметров нет: старт() Пустой экран при работающей программе — почти всегда забытый вызов

И ещё одна ловушка рядом: скобки в вызове обязательны. Напишешь просто звезда без скобок — Python поймёт это как «дай мне саму функцию», а не «выполни её». Ошибки не будет, звезды тоже.

ШАГ 5 ИЗ 6 · БИБЛИОТЕКА

Функция внутри функции

kartina.py — своя библиотека заклинаний
1  from turtle import * ; import random
2  def star(x, y, size, col):
3      ... тело ...
4  
5  def house(x, y, size):
6      ... тело ...
7  
8  def sky(count):
9      for i in range(count):
10         star(random.randint(-200,200), random.randint(0,150), 12, "gold")
11 
12 # А ВНИЗУ — сама картина, читается как список дел:
13 sky(40)
14 house(-60, -120, 70)
15 star(150, 130, 40, "white")   # луна поярче

Смотри на строку 10: функция sky внутри себя вызывает star. Так и строят большие программы — из маленьких кусочков собирают покрупнее. А внизу, в строках 13–15, вся картина умещается в три строки, которые читаются как список дел.

Порядок в файле: описания сверху, дела снизу ВСЕ def — здесь длинные, подробные, пишутся один раз ВЫЗОВЫ — здесь короткие, их читают, чтобы понять программу Python обязан увидеть def ДО вызова — иначе не найдёт имя

Правило простое и техническое: описание должно идти раньше вызова. Python читает файл сверху вниз, и если вызвать функцию до её объявления — он о ней ещё не знает и выдаст NameError.

Судовой журнал — отметь сделанное:
Написал функцию через def
Вызвал её несколько раз с разными числами
Добавил параметр цвета — фигуры разноцветные
Сделал вторую функцию (домик, дерево, что угодно)
Одна функция вызывает другую внутри себя
Все def сверху, вызовы снизу
Последние строки программы понятны без чтения тел

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

ШАГ 6 ИЗ 6 · ФИНАЛ

Пейзаж из заклинаний

Задание: картина, собранная из своих функций · Три-четыре функции: star, house, tree, mountain · У каждой параметры: где, какого размера, какого цвета · Функция landscape(), которая вызывает остальные · Внизу файла — три-четыре строки вызовов, и всё · Для смелых: функция forest(count) из деревьев в цикле Цель: последние строки читаются как описание картины

Смысл задания не в рисунке, а в устройстве программы. Когда финал файла выглядит как sky(40) · forest(7) · house(-60, -120, 70) — это уже взрослый код, который приятно и открыть, и менять.

Как сдать работу: в «Python в кармане» код сохраняется сам — закрыл страницу, вернулся, и он на месте. Кнопки «поделиться» там нет и ссылки на твою работу тоже: покажи экран взрослому или пришли скриншот — этого достаточно. Поле выше нужно, только если ты писал в другом редакторе, который выдаёт ссылку. Дай кому-нибудь поменять последние строки — пусть переставит домик или добавит звёзд. Человек, не знающий Python, справится за минуту, если функции названы понятно. Вот это и есть хороший код.

КАПИТАН КВЕСТО
Читать текстом
Ты добрался до вещи, которая отделяет любителя от того, кто пишет всерьёз. Функции — это способ бороться со сложностью: большая задача разбивается на маленькие, у каждой есть имя, и держать в голове всё сразу больше не нужно. Так пишут программы на тысячи строк — по кусочку за раз. Остался один остров до звания: там программа заговорит с тобой — научится задавать вопросы и слушать ответы.

Жми — Гильдия отметит шестой остров Обсерватории.

Заклинание готово!

Шестой артефакт: свои функции — большая задача разбита на маленькие. Бейдж «ЗАКЛИНАТЕЛЬ» твой. Остался один остров до звания Звездочёта.

Что дальше. Сова снимает очки и впервые смотрит прямо: «Дальше я не нужен».

🏅 Забрать диплом Следующий квест: Разговор со звездой Вернуться на карту экспедиции
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим