Циклы

Введение

Иногда можно заметить, что в некоторых наших программах много повторяющихся кусков кода. Один из способов исправить это и сократить количество этих кусков — циклирование (или итерация, в буквальном переводе с английского looping — повторение). Для начала, попробуй запустить этот простой пример:

for name in "John", "Sam", "Jill":
    print("Hello " + name)

Это невероятно полезно, если нам нужно повторить какие-либо действия несколько раз (не копируя при этом строчки кода) — скажем, во время рисования границ какой-либо фигуры пунктиром. Циклы могут быть и другими:

for i in range(10):
    print(i)

Notice how we write only one line of code using i, but it takes on 10 different values?

Функцию range(n) можно назвать заменой для 0, 1, 2, ..., n-1. Чтобы побольше узнать о ней, можно воспользоваться встроенной справкой Python: введи help(range) (для выхода из справочной системы нажми q).

You can also loop over elements of your choice:

total = 0
for i in 5, 7, 11, 13:
    print(i)
    total = total + i

print(total)

Скопируй и запусти этот пример, что проверить, правильно ли ты догадался насчёт того, что он делает.

Примечание

Notice how above, the lines of code that are looped, are the ones that are indented. This is an important concept in Python - that’s how it knows which lines should be used in the for loop, and which come after, as part of the rest of your program. Use four spaces (hitting tab) to indent your code.

Sometimes you want to repeat some code a number of times, but don’t care about the value of the i variable; so it can be good practice to replace it with _ instead. This signifies that we don’t care about its value, or don’t wish to use it. Here’s a simple example:

for _ in range(10):
    print("Hello!")

You may or may not be wondering about the variable i - why is it used all the time above? Well, it simply stands for “index” and is one of the most common variable names ever found in code. But if you are looping over something other than just numbers, be sure to name it something better! For instance:

for drink in list_of_beverages:
    print("Would you like a " + drink + "?")

This is immediately clearer to understand than if we had used i instead of drink.

Рисуем пунктирную линию

Упражнение

Draw a dashed line. You can move the turtle without the turtle drawing its movement by using the turtle.penup() function; to tell it to draw again, use turtle.pendown().

_images/dashed.png

Решение

for i in range(10):
    turtle.forward(15)
    turtle.penup()
    turtle.forward(5)
    turtle.pendown()

Дополнительно

Can you make the dashes become larger as the line progresses?

_images/dashedprogressing.png

Подсказка

Feeling lost? Inspect i at every run of the loop:

for i in range(10):
    print(i)
    # write more code here

Can you utilize i — commonly called the index variable or loop variable — to get increasing step sizes?

Комментарии

В примере выше, строка, начинающаяся с #, называется комментарием. В Python всё, что идёт за # до конца строки, игнорируется компьютером. Пользуйтесь комментариями, чтобы объяснить принципы работы вашей вашей программы без изменения поведения компьютера. А ещё с их помощью можно просто временно отключить или “закомментировать” несколько строчек кода.

Комментарии также могут находиться в конце строки, как этот:

turtle.left(20)     # tilt our next square slightly

Оптимизируем генератор квадратов

Упражнение

Программа для рисования квадратов, которую мы написали в начале учебника, содержит слишком много повторяющихся строчек кода. Можешь ли ты сократить её с помощью циклов?

Решение

for _ in range(4):
    turtle.forward(100)
    turtle.left(90)

Дополнительно

Try nesting loops, by putting one right under (inside) the other, with some drawing code that’s inside both. Here’s what it can look like:

for ...:
    for ...:
        # drawing code inside the inner loop goes here
        ...
    # you can put some code here to move
    # around after!
    ...

Replace the ...‘s with your own code, and see if you can come up with something funny or interesting! Mistakes are encouraged!