Для того, чтобы не писать одно и тоже по нескольку раз, придумали циклы. Что будет выполнено в результате работы такой программы?
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. Повторение участка кода”