Loops: for и while

Возвращаемся к Python.
В предыдущем уроке ты изучил условия.
Твои программы научились принимать решения с помощью:
if
else
elif
Очень хорошо.
Теперь твоя программа может выбирать разные пути.
Но есть ещё одна большая проблема.
Что делать, если нужно что-то повторить?
Например:
Вывести что-то 10 раз.
Спрашивать пользователя, пока он не введёт правильный пароль.
Посчитать totals для нескольких продуктов.
Показать числа от 1 до 100.
Обработать много элементов один за другим.
Без loops пришлось бы писать так:
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
Это работает.
Но выглядит страшно.
Очень страшно.
Как копировать одно и то же сообщение пять раз, потому что компьютер отказался быть полезным.
Loops решают эту проблему.
Loops позволяют программе повторять действия.
Python делает скучное повторение.
Ты сохраняешь психическое здоровье.
В основном.
Что ты изучишь
В этом уроке ты изучишь:
- что такое loops;
- почему loops полезны;
- как использовать
for; - как использовать
range(); - как работают loop variables;
- как повторять код конкретное количество раз;
- как проходить по тексту;
- как использовать
while; - как останавливать loop по условию;
- как использовать counters;
- как избегать infinite loops;
- как использовать
break; - как использовать
continue; - типичные ошибки начинающих;
- как строить простые программы на основе loops.
К концу этого урока твои программы смогут автоматически повторять работу.
Это огромный шаг.
Потому что компьютеры очень хорошо умеют повторять.
Они не скучают.
Они не жалуются.
Они не вздыхают драматически после третьего задания.
В отличие от людей.
Особенно в понедельник.
Что такое loop?
Loop — это способ повторять код.
Вместо того чтобы писать:
print("Hello")
print("Hello")
print("Hello")
можно написать:
for number in range(3):
print("Hello")
Output:
Hello
Hello
Hello
Код внутри loop выполняется несколько раз.
Это очень полезно.
Loop говорит:
Выполни это действие снова и снова.
Не навсегда.
Если только ты не сделаешь ошибку.
Тогда да, возможно, навсегда.
Об этом мы поговорим.
Очень важно.
И немного страшно.
Твой первый for loop
Создай файл:
loops.py
Напиши:
for number in range(5):
print("Hello from Python!")
Запусти:
python loops.py
или:
python3 loops.py
Output:
Hello from Python!
Hello from Python!
Hello from Python!
Hello from Python!
Hello from Python!
Строка:
for number in range(5):
означает:
Повтори код с отступом 5 раз.
Строка с отступом:
print("Hello from Python!")
принадлежит к loop.
Поэтому Python выполняет её 5 раз.
Очень полезно.
Очень чисто.
Очень “наконец-то компьютер делает компьютерные вещи”.
Indentation снова имеет значение
Так же как с if, indentation имеет значение в loops.
Правильно:
for number in range(3):
print("Hello")
Неправильно:
for number in range(3):
print("Hello")
Python покажет:
IndentationError
Код внутри loop должен быть с отступом.
Python использует indentation, чтобы понимать, что принадлежит к loop.
Твои пробелы — не декорация.
Они структура.
Маленькая архитектура.
Снова.
Python действительно любит организованную мебель.
Двоеточие обязательно
for loop тоже требует двоеточия:
for number in range(3):
Неправильно:
for number in range(3)
print("Hello")
Правильно:
for number in range(3):
print("Hello")
Двоеточие говорит Python:
Здесь начинается блок кода, который будет повторяться.
Маленький символ.
Большая ответственность.
Двоеточие — как маленькая дверь в loop.
Забыл дверь — никто не зайдёт.
Понимание range()
range() создаёт последовательность чисел.
Пример:
for number in range(5):
print(number)
Output:
0
1
2
3
4
Важная деталь:
range(5)
начинается с 0 и останавливается перед 5.
То есть даёт:
0, 1, 2, 3, 4
А не:
1, 2, 3, 4, 5
Это удивляет многих начинающих.
Python начинает считать с нуля.
Компьютеры любят ноль.
Никто не знает, почему они так эмоционально к нему привязаны.
На самом деле программисты знают.
Но сегодня мы не открываем эту пещеру.
Счёт от 1
Если хочешь считать от 1 до 5, напиши:
for number in range(1, 6):
print(number)
Output:
1
2
3
4
5
Здесь:
range(1, 6)
означает:
Начни с 1.
Остановись перед 6.
Поэтому последнее число — 5.
Очень важно.
Второе значение не включается.
Это очень распространено в Python.
Сначала кажется странным.
Потом становится нормальным.
Потом ты начинаешь объяснять это новичкам и звучишь подозрительно спокойно.
range(start, stop, step)
range() также может использовать step.
Пример:
for number in range(0, 10, 2):
print(number)
Output:
0
2
4
6
8
Это означает:
Начни с 0.
Остановись перед 10.
Иди шагом 2.
Другой пример:
for number in range(10, 0, -1):
print(number)
Output:
10
9
8
7
6
5
4
3
2
1
Это считает назад.
Очень драматично.
Как запуск ракеты.
Но с меньшим количеством огня.
Надеемся.
Loop variable
Посмотри на это:
for number in range(5):
print(number)
Переменная number меняется каждый раз, когда loop выполняется.
Первый раз:
number = 0
Второй раз:
number = 1
Третий раз:
number = 2
И так далее.
Loop variable хранит текущее значение.
Можно назвать её иначе:
for i in range(5):
print(i)
Это тоже работает.
Многие разработчики используют i для простых счётчиков.
Но понятные названия часто лучше:
for product_number in range(5):
print(product_number)
Используй названия, которые имеют смысл.
Будущий ты всё ещё смотрит.
И немного судит.
Повторение сообщения с числами
Попробуй:
for number in range(1, 6):
print(f"Message number {number}")
Output:
Message number 1
Message number 2
Message number 3
Message number 4
Message number 5
Теперь loop не просто повторяет.
Он также использует текущее число.
Это очень полезно.
Loops — не просто копировальные машины.
Они могут менять что-то на каждом шаге.
Немного.
Как люди, которые учатся на ошибках.
Но быстрее.
Простая сумма с loop
Можно использовать loop, чтобы посчитать total.
Пример:
total = 0
for number in range(1, 6):
total = total + number
print(f"Total: {total}")
Output:
Total: 15
Что происходит?
Начинаем с total = 0.
Добавляем 1.
Добавляем 2.
Добавляем 3.
Добавляем 4.
Добавляем 5.
Выводим финальный total.
Это очень распространённый pattern.
Начать с пустого результата.
Пройти через значения.
Обновить результат.
Вывести или использовать результат.
Очень полезно.
Очень программирование.
Очень “маленькие шаги становятся чем-то большим”.
Более короткое обновление total
Это:
total = total + number
можно записать так:
total += number
Поэтому программа становится такой:
total = 0
for number in range(1, 6):
total += number
print(f"Total: {total}")
Output:
Total: 15
Обе версии правильные.
Короткая версия распространена.
Используй её, когда понимаешь, что она означает.
Не пиши короткий код только для того, чтобы выглядеть профессионально.
Профессиональный код — это не код, который выглядит загадочно.
Профессиональный код — это код, который работает и который можно понять позже.
Очень скучно.
Очень правда.
Проход по тексту
Можно проходить по string через loop.
Пример:
word = "Python"
for letter in word:
print(letter)
Output:
P
y
t
h
o
n
String состоит из characters.
Loop может проходить по ним один за другим.
Здесь:
letter
хранит текущий character.
Сначала:
P
Потом:
y
Потом:
t
И так далее.
Python разбирает слово как маленькая вежливая машина.
Без насилия.
Только characters.
Подсчёт letters
Попробуй:
word = input("Enter a word: ")
letter_count = 0
for letter in word:
letter_count += 1
print(f"The word has {letter_count} letters.")
Пример:
Enter a word: Python
Output:
The word has 6 letters.
Это считает letters вручную.
Позже ты изучишь более простые способы.
Но сделать это через loop помогает понять, как loops работают.
Иногда мы делаем что-то более длинным способом, чтобы научиться.
Не потому, что Python любит смотреть, как мы страдаем.
Наверное.
Loop с условиями
Можно использовать if внутри loop.
Пример:
for number in range(1, 11):
if number % 2 == 0:
print(f"{number} is even")
Output:
2 is even
4 is even
6 is even
8 is even
10 is even
Эта строка:
number % 2 == 0
проверяет, является ли число чётным.
Оператор % даёт остаток от деления.
Если число при делении на 2 имеет остаток 0, оно чётное.
Пример:
4 % 2 = 0
5 % 2 = 1
Очень полезно.
Очень классически.
Очень математически, но не слишком страшно.
Математический дракон ещё спит.
Чётные и нечётные числа
Создай файл:
even_odd.py
Напиши:
for number in range(1, 11):
if number % 2 == 0:
print(f"{number} is even")
else:
print(f"{number} is odd")
Output:
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
10 is even
Теперь loop повторяет.
Условие решает.
Вместе они делают программу сильнее.
Loops и conditions — это маленький двигатель программирования.
Не glamour.
Но очень сильный.
Как старый дизельный фургон, который отказывается умирать.
Что такое while loop?
while loop повторяет код, пока условие true.
Пример:
count = 1
while count <= 5:
print(count)
count += 1
Output:
1
2
3
4
5
Это означает:
Пока count меньше или равен 5, повторяй блок.
Каждый раз мы увеличиваем count на 1.
В итоге count становится 6.
Тогда условие становится false.
Loop останавливается.
Очень важно.
while loop должен иметь способ остановиться.
Иначе он становится infinite loop.
И твой компьютер начинает смотреть на тебя с разочарованием.
for vs while
Используй for, когда знаешь, сколько раз нужно повторить.
Пример:
for number in range(5):
print(number)
Используй while, когда хочешь повторять, пока что-то не изменится.
Пример:
password = ""
while password != "secret":
password = input("Password: ")
print("Access granted.")
Простое правило:
for повторяй по известной sequence
while повторяй, пока condition true
Это правило не идеально для каждой ситуации.
Но для начинающих очень хорошее.
Твой первый while loop
Создай файл:
while_loop.py
Напиши:
count = 1
while count <= 5:
print(f"Count: {count}")
count += 1
Запусти.
Output:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Что происходит?
count начинается с 1.
Python проверяет, count <= 5.
Если true, выводит.
Потом count увеличивается на 1.
Python проверяет снова.
В итоге count становится 6.
Условие false.
Loop останавливается.
Это базовый while pattern.
Начало.
Проверка.
Повторение.
Обновление.
Стоп.
Красиво.
Как стиральная машина с логикой.
Infinite loops
Infinite loop — это loop, который никогда не заканчивается.
Пример:
count = 1
while count <= 5:
print(count)
Это опасно.
Почему?
Потому что count никогда не меняется.
Он всегда 1.
Поэтому:
count <= 5
всегда true.
Loop работает вечно.
Или пока ты не остановишь программу.
Это называется infinite loop.
Очень типичная ошибка начинающих.
Очень раздражает.
Отличный способ сделать так, чтобы terminal выглядел одержимым.
Как остановить infinite loop
Если программа застряла в infinite loop, нажми:
Ctrl + C
Это прерывает программу.
Terminal может показать что-то вроде:
KeyboardInterrupt
Это нормально.
Это означает, что ты остановил программу.
Не элегантно.
Но эффективно.
Как выдернуть вилку из растерянного робота.
Избегай infinite loops, убедившись, что условие может стать false.
Очень важно.
Password loop
Хорошее использование while — спрашивать, пока пользователь не даст правильный ответ.
Создай файл:
password_loop.py
Напиши:
password = ""
while password != "python123":
password = input("Enter password: ")
print("Access granted.")
Пример:
Enter password: banana
Enter password: hello
Enter password: python123
Access granted.
Loop продолжается, пока password неправильный.
Когда пользователь вводит:
python123
условие становится false.
Loop останавливается.
Потом программа выводит:
Access granted.
Очень полезно.
Очень просто.
Очень плохо как настоящая security.
Снова: не защищай банк уроком 5.
Использование break
break немедленно останавливает loop.
Пример:
while True:
answer = input("Type q to quit: ")
if answer == "q":
break
print(f"You typed: {answer}")
print("Program ended.")
Этот loop начинается с:
while True:
Это означает:
Повторяй вечно.
Но внутри loop мы используем:
break
чтобы остановиться, когда пользователь вводит "q".
Пример:
Type q to quit: hello
You typed: hello
Type q to quit: test
You typed: test
Type q to quit: q
Program ended.
break полезен.
Но используй его понятно.
Loop с множеством секретных выходов превращается в лабиринт.
А debug лабиринта не любит никто.
Разве что очень странные люди.
Использование continue
continue пропускает оставшуюся часть текущего прохода loop и переходит к следующей iteration.
Пример:
for number in range(1, 6):
if number == 3:
continue
print(number)
Output:
1
2
4
5
Когда number равен 3, Python выполняет:
continue
Поэтому пропускает:
print(number)
для этой iteration.
Потом loop продолжается с 4.
continue полезен, когда хочешь пропустить определённые случаи.
Как будто сказать:
Не этот. Следующий.
Очень практично.
И немного грубо.
break vs continue
Простая разница:
break полностью останавливает loop
continue пропускает этот раз и переходит к следующему
Пример с break:
for number in range(1, 6):
if number == 3:
break
print(number)
Output:
1
2
Loop останавливается на 3.
Пример с continue:
for number in range(1, 6):
if number == 3:
continue
print(number)
Output:
1
2
4
5
Loop пропускает 3, но продолжается.
Маленькие слова.
Разное поведение.
Не путай их, если не любишь сюрпризы.
Типичная ошибка: забыть обновить while variable
Неправильно:
count = 1
while count <= 5:
print(count)
Это никогда не остановится.
Правильно:
count = 1
while count <= 5:
print(count)
count += 1
Всегда спрашивай:
Как этот while loop остановится?
Если не можешь ответить, твой loop может стать бессмертным.
Бессмертный код звучит круто.
Но нет.
Обычно это bug в плаще.
Типичная ошибка: неправильный range()
Ожидание новичка:
for number in range(5):
print(number)
Ожидаемый output:
1
2
3
4
5
Реальный output:
0
1
2
3
4
Запомни:
range(5)
начинается с 0 и останавливается перед 5.
Если хочешь от 1 до 5:
for number in range(1, 6):
print(number)
Это даёт:
1
2
3
4
5
Python не ошибается.
Это просто Python.
Это предложение ещё много раз станет полезным.
Типичная ошибка: неправильная indentation
Неправильно:
for number in range(3):
print(number)
Правильно:
for number in range(3):
print(number)
Код внутри loop должен быть с отступом.
Если несколько строк принадлежат к loop, все они должны быть с отступом:
for number in range(3):
print("Current number:")
print(number)
Обе строки print() выполняются внутри loop.
Если строка не имеет отступа, она вне loop.
Пример:
for number in range(3):
print(number)
print("Done")
Output:
0
1
2
Done
Done выводится только один раз после завершения loop.
Очень важно.
Indentation решает принадлежность.
Как документы для code blocks.
Типичная ошибка: использовать while, когда for проще
Это работает:
count = 0
while count < 5:
print(count)
count += 1
Но это проще:
for count in range(5):
print(count)
Используй for, когда знаешь количество повторений.
Используй while, когда loop зависит от условия.
Не используй отвёртку как ложку.
Может сработать.
Но люди будут задавать вопросы.
Мини-программа: таблица умножения
Создай файл:
multiplication_table.py
Напиши:
number = int(input("Enter a number: "))
for i in range(1, 11):
result = number * i
print(f"{number} x {i} = {result}")
Пример:
Enter a number: 5
Output:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
Это классическая программа с loop.
Очень полезная.
Очень простая.
Очень школьная, но в хорошем смысле.
В основном.
Мини-программа: сумма чисел
Создай файл:
sum_numbers.py
Напиши:
limit = int(input("Add numbers from 1 to: "))
total = 0
for number in range(1, limit + 1):
total += number
print(f"Total: {total}")
Пример:
Add numbers from 1 to: 5
Output:
Total: 15
Потому что:
1 + 2 + 3 + 4 + 5 = 15
Обрати внимание:
range(1, limit + 1)
Почему limit + 1?
Потому что range() останавливается перед вторым значением.
Если пользователь вводит 5, нам нужно:
range(1, 6)
Маленькая деталь.
Большая важность.
Python любит эти маленькие ловушки.
Учебные ловушки.
Но всё равно ловушки.
Мини-программа: угадай число
Создай файл:
guess_number.py
Напиши:
secret_number = 7
guess = 0
while guess != secret_number:
guess = int(input("Guess the number: "))
if guess < secret_number:
print("Too low.")
elif guess > secret_number:
print("Too high.")
else:
print("Correct!")
Пример:
Guess the number: 3
Too low.
Guess the number: 10
Too high.
Guess the number: 7
Correct!
Эта программа использует:
- variables;
- input;
- type conversion;
while;- conditions;
- comparison operators.
Много уроков вместе.
Так растёт программирование.
Одна идея соединяется с другой.
Как кабели.
Надеемся, подписанные.
Мини-программа: menu loop
Создай файл:
menu.py
Напиши:
choice = ""
while choice != "q":
print("----- Menu -----")
print("1. Say hello")
print("2. Say goodbye")
print("q. Quit")
choice = input("Choose an option: ").lower()
if choice == "1":
print("Hello!")
elif choice == "2":
print("Goodbye!")
elif choice == "q":
print("Exiting...")
else:
print("Unknown option.")
Эта программа продолжает показывать menu, пока пользователь не введёт:
q
Menu loops очень распространены.
Многие terminal-программы работают именно так.
Программа спрашивает.
Пользователь выбирает.
Программа реагирует.
Потом снова спрашивает.
Родилась маленькая command-line application.
Очень милая.
Очень полезная.
Не корми её после полуночи.
Практика
Создай файл:
practice_loops.py
Напиши программу, которая:
- спрашивает у пользователя число;
- выводит все числа от 1 до этого числа;
- выводит, является ли каждое число чётным или нечётным;
- считает total sum.
Пример:
limit = int(input("Enter a number: "))
total = 0
for number in range(1, limit + 1):
total += number
if number % 2 == 0:
print(f"{number} is even")
else:
print(f"{number} is odd")
print(f"Total sum: {total}")
Пример output:
Enter a number: 5
1 is odd
2 is even
3 is odd
4 is even
5 is odd
Total sum: 15
Это хорошая практика.
Она объединяет:
- input;
- loops;
- conditions;
- arithmetic;
- variables;
- formatted output.
Очень сильное упражнение для начинающих.
Не лёгкое.
Но очень полезное.
Мини-задание
Создай файл:
shopping_total.py
Твоя программа должна:
- спросить, сколько продуктов клиент хочет ввести;
- повторить столько раз;
- спросить название продукта;
- спросить цену продукта;
- добавить цену к total;
- вывести финальный total.
Пример решения:
product_count = int(input("How many products? "))
total = 0
for number in range(1, product_count + 1):
print(f"Product {number}")
product_name = input("Name: ")
price = float(input("Price: "))
total += price
print(f"Added {product_name}: {price:.2f}")
print("----- Total -----")
print(f"Total price: {total:.2f}")
Пример взаимодействия:
How many products? 3
Product 1
Name: Keyboard
Price: 70
Added Keyboard: 70.00
Product 2
Name: Mouse
Price: 25
Added Mouse: 25.00
Product 3
Name: Notebook
Price: 5.5
Added Notebook: 5.50
----- Total -----
Total price: 100.50
Это близко к реальной логике.
Магазин.
Список продуктов.
Total.
Ещё без database.
Ещё без web app.
Но идея реальная.
Маленькая terminal-программа.
Большая основа.
Очень Python.
Extra challenge: password с attempts
Создай файл:
password_attempts.py
Твоя программа должна:
- хранить secret password;
- разрешать только 3 attempts;
- вывести
"Access granted.", если пароль правильный; - вывести
"Access denied."после 3 неправильных attempts.
Пример решения:
secret_password = "python123"
attempts = 0
max_attempts = 3
access_granted = False
while attempts < max_attempts:
password = input("Password: ")
attempts += 1
if password == secret_password:
access_granted = True
break
else:
print("Wrong password.")
if access_granted:
print("Access granted.")
else:
print("Access denied.")
Эта программа использует:
while;- counter;
break;- boolean flag;
- condition после loop.
Очень хорошая практика.
Это более серьёзная логика.
Всё ещё не настоящая security.
Но очень хорошее обучение.
Банк всё ещё не в безопасности.
Пожалуйста, держи банк подальше от этого урока.
Checklist для начинающих
Когда твой loop не работает, проверь:
Я сохранил файл?
Я использовал двоеточие после for или while?
Тело loop имеет indentation?
Мой while loop имеет способ остановиться?
Я обновил counter?
Я правильно использую range()?
Мне нужно range(1, limit + 1)?
Я случайно не поставил код вне loop?
Я использовал break, когда хотел остановить loop?
Я использовал continue, когда хотел пропустить только один проход?
Loops мощные.
Но могут создавать запутанные bugs.
Особенно while loops.
Всегда спрашивай:
Что меняется каждый раз?
Когда loop остановится?
Если ты можешь ответить на эти два вопроса, ты значительно безопаснее.
Если нет — готовься к хаосу.
Учебному хаосу.
Но всё равно хаосу.
Итог
Сегодня ты изучил:
- loops повторяют код;
forloops полезны, когда ты знаешь sequence для повторения;range()создаёт sequence чисел;range(5)даёт от0до4;range(1, 6)даёт от1до5;- loop variable меняется на каждой iteration;
- strings можно проходить character by character;
- loops могут содержать conditions;
whileповторяет, пока condition true;whileloops требуют способа остановиться;- infinite loops случаются, когда condition никогда не становится false;
Ctrl + Cможет остановить зависшую программу;breakнемедленно останавливает loop;continueпропускает текущую iteration;- loops полезны для totals, counters, menus, passwords и repeated input.
Это огромный шаг.
Твои программы теперь могут повторять работу.
Они могут считать.
Могут спрашивать снова.
Могут вычислять totals.
Могут показывать menus.
Могут обрабатывать много values.
Здесь программирование становится намного мощнее.
Потому что компьютеры любят repetition.
А люди любят не делать скучное repetition вручную.
Прекрасное сотрудничество.
В основном.
Следующий урок
В следующем уроке мы изучим lists.
Lists позволяют хранить много values в одной variable.
Вместо того чтобы писать:
product1 = "Keyboard"
product2 = "Mouse"
product3 = "Notebook"
ты напишешь:
products = ["Keyboard", "Mouse", "Notebook"]
Потом loops и lists будут работать вместе.
И именно там Python начинает становиться намного полезнее.
Очень сильный прогресс.
Очень Python.