Цикл for. Повторение участка кода

Для того, чтобы не писать одно и тоже по нескольку раз, придумали циклы. Что будет выполнено в результате работы такой программы?

from turtle import *
for x in range(6):
    circle(30)
    fd(20)
done()
1. Нарисовать 4 окружности подряд
2. Нарисовать 10 окружностей

Кстати, на мой взгляд Черепашка двигается слишком медленно. Нельзя ли ее как-нибудь ускорить?

3. Найти команду, которая позволяет увеличить скорость движения Черепашки (если такая есть)

 

Теперь посмотрим на распространённую ошибку:

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)

 

4. Нарисовать правильный восьмиугольник
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()

Снимок экрана от 2016-01-04 11:59:02

Нарисовать фигуры, используя цикл (for) и, если потребуется, создание новой команды (def):
6.
Снимок экрана от 2016-01-04 11:05:097.
Снимок экрана от 2016-01-04 10:17:39

8.
Снимок экрана от 2016-01-04 10:18:52

9.
Снимок экрана от 2016-01-04 10:19:22

10.
Снимок экрана от 2016-01-04 10:58:10

11.
Снимок экрана от 2016-01-04 11:01:49

12.
Снимок экрана от 2016-01-04 11:01:07

13.
Снимок экрана от 2016-01-04 11:08:48

14.
Снимок экрана от 2016-01-04 11:10:22

А теперь попробуем использовать переменную цикла:

n = 100
for z in range(n):
	dot()
	fd(z)
	rt(30)
ht()

Снимок экрана от 2016-01-04 11:40:55

Или так:

n = 100
for z in range(n):
	dot()
	fd(30)
	rt(z)
ht()

Снимок экрана от 2016-01-04 11:42:08

Или вот так:

for z in range(0,1000):
	fd(20)
	rt(z)
ht()

Снимок экрана от 2016-01-04 11:43:51

for z in range(1,7000,5):
	fd(20)
	rt(z)
ht()

Снимок экрана от 2016-01-04 11:48:37
Попробуйте изменять первое и третье значение в заголовке цикла: range(1,7000,5).
Смысл этих значений вы найдете в справочнике (для очень ленивых: range(начальное значение, конечное значение, шаг цикла))

One thought on “Цикл for. Повторение участка кода

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *