Для того, чтобы не писать одно и тоже по нескольку раз, придумали циклы. Что будет выполнено в результате работы такой программы?
from turtle import * for x in range(6): circle(30) fd(20) done()
2. Нарисовать 10 окружностей
Кстати, на мой взгляд Черепашка двигается слишком медленно. Нельзя ли ее как-нибудь ускорить?
Теперь посмотрим на распространённую ошибку:
from turtle import * for x in range(6): circle(30) fd(20) done()
Программа не запускается, верно? Дело в том, что тело цикла (см. справочник), должно быть сдвинуто вправо.
И еще один вариант:
from turtle import * for x in range(6): circle(30) fd(20) done()
В этом случае программа будет работать, но что она сделает? Почему?
Продолжим работу с циклом for: нарисуем 12 окружностей, расположенных в случайном месте
from turtle import * from random import randrange as rnd speed(10) pu() for z in range(12): x = rnd(-200,200) y = rnd(-200,300) setpos(x,y) pd() circle(30) pu() done()
Неплохо, но … скучновато… Может быть, добавим цвет?
from turtle import * from random import randrange as rnd speed(10) pu() for z in range(12): x = rnd(-200,200) y = rnd(-200,300) setpos(x,y) pd() begin_fill() circle(30) end_fill() pu() done()
Ой, вот это «добавили цвет»! Для изменения цвета линий и заливки воспользуемся командой color():
… from random import randrange as rnd color('red','yellow') speed(10) …
И добавим еще больше случайности:
from turtle import * from random import randrange as rnd color('red','yellow') speed(10) pu() for z in range(12): x = rnd(-200,200) y = rnd(-200,300) setpos(x,y) pd() begin_fill() circle(rnd(10,50)) end_fill() pu() done()
А теперь нарисуем цепочку из десяти точек:
from turtle import * color('green','lightgreen') width(2) speed(10) pu() for z in range(10): fd(10) dot() done()
И две такие цепочки:
for z in range(10): fd(10) dot() fd(-100) rt(90) fd(10) rt(-90) for z in range(10): fd(10) dot()
Добавим еще одну:
for z in range(10): fd(10) dot() fd(-100) rt(90) fd(10) rt(-90) for z in range(10): fd(10) dot() fd(-100) rt(90) fd(10) rt(-90) for z in range(10): fd(10) dot()
Когда вы видите, что какая-то часть кода повторяется, значит имеет смысл применить цикл:
for r in range(5): for z in range(10): fd(10) dot() fd(-100) rt(90) fd(10) rt(-90)
Вот так немного лучше, не правда ли?
Введем параметр N, чтобы можно было легко менять размер фигуры:
n = 4 for r in range(n): for z in range(n): fd(10) dot() fd(-10*n) rt(90) fd(10) rt(-90)
А теперь поместим все это в функцию (создадим новую команду):
from turtle import * color('green','lightgreen') width(2) speed(0) def fig(n): pu() for r in range(n): for z in range(n): fd(10) dot() fd(-10*n) rt(90) fd(10) rt(-90) fig(10) fig(3) done()
Будет немного забавнее, если немного поворачивать перед каждой линией:
pu() for r in range(n): for z in range(n): fd(10) dot() fd(-10*n) rt(90) fd(10) rt(-90) rt(10)
Количество повторений внутреннего цикла можно сделать не постоянным, а зависящим от внешнего цикла:
pu() for r in range(n): for z in range(r+1): fd(10) dot() fd(-10*(r+1)) rt(90) fd(10) rt(-90) rt(10)
А теперь порисуем правильные многоугольники.
Квадрат:
from turtle import * color('green','lightgreen') width(2) speed(10) begin_fill() for z in range(4): fd(100) rt(90) end_fill() done()
Пятиугольник:
for z in range(5): fd(100) rt(72)
Шестиугольник:
for z in range(6): fd(100) rt(60)
5. Нарисовать правильный десятиугольник
Если продолжать увеличивать количество сторон, то получится …
А что же получилось?
for z in range(20): fd(20) rt(360/20)
Чтобы рисовать любой правильный многоугольник, можно применить параметр:
n = 6 for z in range(n): fd(200) rt(360/n)
Однако, как мы видим, размер сильно меняется от количества углов. Чтобы этого не происходило, следует уменьшать длину стороны:
n = 6 for z in range(n): fd(200/n) rt(360/n)
Сочетание циклов и функций даст забавные узоры.
Восемь восьмиугольников:
from turtle import * color('orange') width(3) speed(0) def mn(n): for z in range(n): fd(200/n) rt(360/n) n = 8 for z in range(n): mn(n) rt(360/n) ht() done()
А теперь попробуем использовать переменную цикла:
n = 100 for z in range(n): dot() fd(z) rt(30) ht()
Или так:
n = 100 for z in range(n): dot() fd(30) rt(z) ht()
Или вот так:
for z in range(0,1000): fd(20) rt(z) ht()
for z in range(1,7000,5): fd(20) rt(z) ht()
Попробуйте изменять первое и третье значение в заголовке цикла: range(1,7000,5).
Смысл этих значений вы найдете в справочнике (для очень ленивых: range(начальное значение, конечное значение, шаг цикла))
One thought on “Цикл for. Повторение участка кода”