Циклы в черепашьей графике (модуль turtle языка Python)
Словарь урока
из модуля turtle: |
|
---|---|
из модуля random: |
|
из языка Python: |
|
Когда раньше мы рисовали, например, квадрат, то были вынуждены повторять одни и те же команды несколько раз:
a = 100 forward(a) right(90) forward(a) right(90) forward(a) right(90) forward(a) right(90)
Конечно, можно было бы получить квадрат вызовом функции circle
, передав ее параметру steps
значение 4. Однако в этом случае получается фигура, вписанная в окружность с заданным радиусом. Длина стороны такого квадрата не такая, какая может требоваться.
В разработке часто возникает необходимость в повторении участков кода. Поэтому в языках программирования существуют циклы. В Python их два ‒ это for
и while
. Вот так может выглядеть код квадрата при использовании цикла for
:
a = 100 for i in range(4): forward(a) right(90)
Команды, находящиеся в теле цикла, то есть записанные с отступом, повторяются 4 раза, так как это число передано в функцию range
в заголовке цикла. Переменная i последовательно принимает значения 0, 1, 2, 3, то есть до четырех.
Если мы захотим нарисовать звезду, можем сделать так:
line = 100 n = 10 for i in range(n): forward(line) teleport(0, 0) right(360/n)
Здесь количество повторов цикла будет 10. На каждом повторе (в программировании говорят ‒ итерации) черепаха рисует линию, возвращается в исходную точку и поворачивает на угол, равный 360 градусам (полная окружность), поделенным на количество сторон. В этой программе, чтобы нарисовать немного другую звезду, достаточно поменять значения переменных line
и n
.
Чтобы использовать цикл for
, заранее должно быть известно количество его повторов. Даже если аргумент для функции range вводит пользователь, все-равно, когда цикл начинается, это число известно в программе.
Однако бывают ситуации, когда неизвестно, сколько раз циклу надо будет повториться. Это зависит от каких-то событий, которые произойдут в его теле. Вспомним пример из урока про условный оператор, в котором пользователю надо было ввести название фигуры. Если он вводил что-то не то, черепаха ничего не рисовала, просто выводила сообщение.
С помощью цикла while
мы можем заставить пользователя вводить ответ столько угодно раз, пока он не введет то, что от него требуют:
radius = 100 figure = '' while figure not in ('круг', 'квадрат', 'треугольник', 'отрезок'): figure = textinput('Фигура', 'круг, квадрат, треугольник, отрезок') if figure == 'круг': circle(radius) elif figure == 'квадрат': right(45) circle(radius, steps=4) elif figure == 'треугольник': right(60) circle(radius, steps=3) elif figure == 'отрезок': forward(radius * 2)
В этой программе переменной figure
сначала присваивается пустая строка. Потом в заголовке цикла проверяется, что ее значение не содержит ничего (not in
) из перечисленных вариантов в скобках. Поскольку первый раз это так, тело цикла начнет выполняться.
Если пользователь введет одно из верных названий фигуры, то она будет начерчена, а figure
будет хранить ее название. Поток выполнения программы снова вернется к заголовку цикла. Только теперь утверждение, что значение figure
не совпадает ни с одним из перечисленных в скобках, будет ложным. Когда в заголовке цикла while
возникает ложь, его тело больше не выполняется. Цикл завершает свою работу.
Другое дело, если пользователь вводит неверное название фигуры. В этом случае условие в заголовке по-прежнему будет верным, и тело цикла выполнится снова. Так будет повторяться до тех пор, пока программа не получит нужный ответ от человека.
Познакомившись с такими управляющими конструкциями языка программирования как цикл и условный оператор, а также зная как генерировать случайные числа, мы можем написать более сложную программу, которую часто пишут начинающие программисты. Это программа "Угадай число", в которой компьютер загадывает число, а человек должен его угадать с помощью подсказок, больше оно или меньше, чем сделанное им предположение.
from random import randint teleport(-200, 200) secret = randint(1, 100) user = 0 while user != secret: user = numinput('Отгадай', 'Число от 1 до 100', minval=1, maxval=100) clear() if secret < user: write('Мое число меньше, чем %d' % user) elif secret > user: write('Мое число больше, чем %d' % user) else: write('Вы угадали. Я загадала %d' % secret)
Когда поток выполнения программы первый раз проверяет условие в заголовке цикла, то оно правдивое. Ведь значение secret
может быть только от 1 до 100, а значение user равно нулю. Значения переменных никак не могут быть равны друг другу, они не равны (!=
).
Тело цикла начинает выполняться, и человек вводит число. Если оно больше или меньше, чем загадала черепаха, срабатывает ветка if
или elif
условного оператора.
Поскольку user
по-прежнему не равен secret
, тело цикла начнет выполняться снова.
Если значения переменных совпадут, в теле цикла сработает ветка else
, а поток выполнения программы, вернувшись в заголовок цикла, получит ложь на утверждение, что user
не равен secret
. Теперь они равны. Цикл завершится.
В коде выше мы встречаемся с форматированным выводом. Строки содержит комбинацию символов %d
. Вместо нее подставляется значение переменной, которая указана после строки через символ процента.
Задания для самостоятельной работы
- Напишите программу, в которой черепаха рисует 10 звездочек (как звезда в уроке) в случайных местах холста. Подсказка: один цикл можно вкладывать в другой.
- Улучшите программу "Угадай число" так, чтобы все реплики черепахи оставались на холсте (выводились друг за другом в столбик). Так человеку будет проще ориентироваться в своих ответах и делать предположения о секретном числе.