Циклы в черепашьей графике (модуль turtle языка Python)

Словарь урока

из модуля turtle:
  • teleport ‒ телепорт
  • write ‒ написать
  • forward ‒ вперед
  • right ‒ направо
  • circle ‒ круг, окружность
  • steps ‒ шаги (step ‒ шаг)
  • textinput ‒ ввод (input) текста (text)
  • numinput ‒ ввод (input) числа (num, number)
  • minvalue ‒ минимальное (minimum) значение (value)
  • maxvalue ‒ максимальное (maximum) значение (value)
  • clear ‒ чистый, ясный
из модуля random:
  • random ‒ случайный
  • randint ‒ случайное (random) целое (integer)
из языка Python:
  • import ‒ импорт
  • from ‒ из (от)
  • if ‒ если
  • else ‒ иначе
  • for ‒ для
  • range ‒ диапазон, ряд
  • while ‒ пока, до тех пор пока
  • not in ‒ не в

Когда раньше мы рисовали, например, квадрат, то были вынуждены повторять одни и те же команды несколько раз:

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. Вместо нее подставляется значение переменной, которая указана после строки через символ процента.

Задания для самостоятельной работы

  1. Напишите программу, в которой черепаха рисует 10 звездочек (как звезда в уроке) в случайных местах холста. Подсказка: один цикл можно вкладывать в другой.
  2. Улучшите программу "Угадай число" так, чтобы все реплики черепахи оставались на холсте (выводились друг за другом в столбик). Так человеку будет проще ориентироваться в своих ответах и делать предположения о секретном числе.

Turtle. Программирование на Python для школьников




Все разделы сайта