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