Python · Синтаксис · Начальный уровень

Цикл while

14 задач

Упражнения по циклу while в Python: повторение действий, счётчики, суммы чисел, ввод до нужного условия, break, перебор строк и базовая обработка символов.

Как работает цикл while

#
Цикл while продолжает выполнять тело, пока условие остаётся True. В отличие от for, который обходит элементы последовательности, while продолжается, пока что-то не сделает условие False. ```python i = 1 while i <= 10: print(i) i += 1 ``` Python проверяет условие перед каждой итерацией, включая первую. Если условие False с самого начала — тело цикла не выполнится ни разу. Самая распространённая ошибка с циклами while — забыть обновить то, от чего зависит условие. Если i никогда не меняется, i <= 10 будет оставаться True вечно — бесконечный цикл. Всегда убеждайтесь, что что-то внутри цикла приближает вас к условию выхода. break выходит из цикла немедленно, независимо от условия. Он полезен, когда точка выхода находится в середине тела цикла, а не в начале: ```python while True: password = input("Введите пароль: ") if password == "python": break print("Неверно, попробуйте ещё раз") ``` while True — это намеренный бесконечный цикл, который полностью полагается на break для остановки. Этот паттерн стандартен для ситуаций "продолжать спрашивать, пока не получим корректный ввод".

Счётчики, накопители и паттерн «сторожевого значения»

#
Три паттерна встречаются почти во всех задачах с while. Счётчик: начинаем переменную с некоторого значения, увеличиваем или уменьшаем её на каждой итерации, останавливаемся, когда она достигает границы. ```python i = 1 while i <= 10: print(i) i += 1 ``` Накопитель: начинаем сумму с нуля, добавляем каждое значение внутри цикла. ```python i = 1 total = 0 while i <= 100: total += i i += 1 print(total) ``` Сторожевое значение: продолжаем читать ввод, пока пользователь не введёт сигнал остановки (например, 0). Читаем первое значение до цикла, затем снова в конце тела, чтобы следующая проверка использовала новое значение. ```python total = 0 num = int(input("Введите число (0 для остановки): ")) while num != 0: total += num num = int(input("Введите число (0 для остановки): ")) print(total) ``` Эти три паттерна комбинируются. Таблица умножения использует счётчик и выводит выражение на каждом шаге. Цикл ввода пароля использует сторожевое значение. Подсчёт цифр использует счётчик и целочисленное деление, чтобы каждый раз отрезать одну цифру.

Обход строк с помощью while

#
Цикл while также хорошо подходит для обхода строк по индексу, когда нужно больше контроля, чем даёт for — например, движение в обратном направлении или пропуск по несколько шагов за раз. Вывод строки в обратном порядке с помощью while: ```python word = "Python" i = len(word) - 1 while i >= 0: print(word[i], end="") i -= 1 ``` i начинается с индекса последнего символа и уменьшается до 0. end="" держит всё в одной строке. Фильтрация символов по одному — полезна для построения очищенной строки: ```python punctuation = "!@#$%^&./,?|" text = "Hello, world!" result = "" i = 0 while i < len(text): if text[i] not in punctuation: result += text[i] i += 1 print(result) ``` text[i] not in punctuation использует тот же оператор in, который вы уже видели со строками, но проверяет вхождение в другую строку. Каждый символ в punctuation считается «подстрокой», поэтому этот код корректно распознаёт каждый специальный символ.

Быстрый справочник: цикл while

#
**Синтаксис цикла while** ```python while условие: # тело — выполняется пока условие True # с break и continue while условие: if какой_то_случай: break # немедленно выйти из цикла if другой_случай: continue # пропустить остаток итерации, проверить условие снова # обычное тело ``` **Три основных паттерна** | Паттерн | Инициализация | Обновление в цикле | Назначение | |---|---|---|---| | Счётчик | `i = начало` | `i += 1` или `i -= 1` | фиксированное число итераций | | Накопитель | `total = 0` | `total += значение` | суммирование / накопление результата | | Страж | прочитать первое значение до цикла | читать снова в конце тела | остановиться на специальном вводе | ```python # Счётчик i = 1 while i <= 10: print(i) i += 1 # Накопитель total = 0 while i <= n: total += i i += 1 # Страж num = int(input('Число (0 чтобы остановить): ')) while num != 0: total += num num = int(input('Число (0 чтобы остановить): ')) ``` **`while True` + `break` — спрашивать до корректного ввода** ```python while True: answer = input('да или нет? ') if answer in ('да', 'нет'): break print('Введите да или нет') ``` **Типичные ошибки** ```python # Бесконечный цикл — i никогда не меняется: i = 1 while i <= 10: print(i) # забыли i += 1 # Ошибка на единицу — используйте <= а не < чтобы включить последнее: while i < 10: # останавливается на 9 while i <= 10: # останавливается на 10 ```
01

Числа от 1 до 10.

#

Выведите на печать (print) числа от 1 до 10 с помощью цикла while .

i = 1

Решение
i = 1

while i <= 10:
    print(i)
    i += 1


# или для примера можно условие поставить внутри цикла в if условиях
# и прервать цикл через break. В данном случае конечно лучше первый варинт,
# но варианты нужно посмотреть для фантазии:

i = 1

while True:
    if i <= 10:
        print(i)
        i += 1
    else:
        break

# то же самое, только скомпановано по другому:

i = 1

while True:
    if i > 10:
        break
    print(i)
    i += 1
# в таком случае else не нужен (просто лишний), так как
# в случае break цикл прервется.


# это было чтоб вашу фантазию проработать на варианты.
02

Обратный отсчёт от 10.

#

Выведите числа от 10 до 1 в обратном порядке.

i = 10

Решение
i = 10

while i >= 1:
    print(i)
    i -= 1

# или так можно: использовать условие больше нуля
i = 10

while i > 0:
    print(i)
    i -= 1
03

Числа до введённого значения.

#

Пользователь вводит число. Выведите все числа от 1 до этого числа.

n = int(input("Введите число: "))
i = 1

Решение
n = int(input("Введите число: "))
i = 1

while i <= n:
    print(i)
    i += 1

# или так можно: начать с нуля, но печатать следующее число
n = int(input("Введите число: "))
i = 0

while i < n:
    i += 1
    print(i)
04

Только чётные до числа.

#

Пользователь вводит число. Выведите только чётные числа от 1 до этого числа.

n = int(input("Введите число: "))
i = 1

Решение
n = int(input("Введите число: "))
i = 1

while i <= n:
    if i % 2 == 0:
        print(i)
    i += 1

# второй вариант: сразу идти только по чётным числам
n = int(input("Введите число: "))
i = 2

while i <= n:
    print(i)
    i += 2
05

Сумма от 1 до 100.

#

Найдите сумму всех чисел от 1 до 100 с помощью цикла while .

i = 1
total = 0
Решение
i = 1
total = 0

while i <= 100:
    total += i
    i += 1

print("Сумма:", total)
06

Сумма до введённого числа.

#

Пользователь вводит число. Найдите сумму всех чисел от 1 до этого числа.

n = int(input("Введите число: "))
i = 1
total = 0

Решение
n = int(input("Введите число: "))
i = 1
total = 0

while i <= n:
    total += i
    i += 1

print("Сумма:", total)

# или так можно: прибавлять число и уменьшать его
n = int(input("Введите число: "))
total = 0

while n > 0:
    total += n
    n -= 1

print("Сумма:", total)
07

Таблица умножения.

#

Пользователь вводит число. Выведите таблицу умножения для этого числа от 1 до 10.

n = int(input("Введите число: "))
i = 1

Решение
n = int(input("Введите число: "))
i = 1

while i <= 10:
    print(f"{n} x {i} = {n * i}")
    i += 1

# или так можно: сначала посчитать произведение
n = int(input("Введите число: "))
i = 1

while i <= 10:
    result = n * i
    print(f"{n} x {i} = {result}")
    i += 1
08

Пароль до правильного ввода.

#

Пользователь вводит пароль. Запрашивайте пароль снова, пока он не будет равен "python" .

password = input("Введите пароль: ")

Решение
password = input("Введите пароль: ")

while password != "python":
    password = input("Неверно. Введите пароль ещё раз: ")

print("Пароль принят")


# ИЛИ
password = input("Введите пароль: ")

while True:
    if password == "python":
        break
    password = input("Неверно. Введите пароль ещё раз: ")

print("Пароль принят")

# ОПЯТЬ ЖЕ ПОВТОРЮ такой момент, с пониманием которого бывают проблеммы:
1) Создавать (или пересоздавать) переменные внутри цикла можно, вроде password = ...
При заходе на новый "круг" цикла, просто значение в переменной заменитсья на новое.
Например, цикл который бесконечно делает print в терминал числа от 1 до 5:

num = 1

while True:
    if num == 6:
        num = 1
    print(num)
    num += 1
    input() # просто чтоб тормозить выполнение до любого ввода.
            # input никуда не сохраняется и не используется.
09

Сумма чисел до нуля.

#

Пользователь вводит числа. Программа должна считать сумму введённых чисел, пока пользователь не введёт 0 .

total = 0
num = int(input("Введите число: "))

Решение
total = 0
num = int(input("Введите число: "))

while num != 0:
    total += num
    num = int(input("Введите число: "))

print("Сумма:", total)

# или так:

total = 0

while True:
    num = int(input("Введите число: "))
    if num == 0:
        break
    total += num

print("Сумма:", total)
10

Подсчёт цифр в числе.

#

Пользователь вводит число. Подсчитайте, сколько цифр в этом числе. Можно без цикла решить любым способом.

num = int(input("Введите число: "))
count = 0

Решение
num = int(input("Введите число: "))
count = 0

if num == 0:
    count = 1
else:
    if num < 0:
        num = -num  # меняем знак на + (- на - = +)

    while num > 0:
        count += 1
        num //= 10

print("Количество цифр:", count)

# или так можно без цикла, если помнить про строковое представление числа
num = int(input("Введите число: "))

text = str(abs(num))
count = len(text)

print("Количество цифр:", count)
11

Слово задом наперёд.

#

Выведите слово в терминал задом-наперед несколькими способами: - через срез (чтоб вспомнить); - через цикл while a) сформировав при помощи цикла и индексов новый "перевернутый" объект строки; b) делая print символов с конца без переноса строк в терминале (параметр end= у print)

word = "иладеп"

Решение
# 1)
word = "иладеп"
print(word[::-1])


# 2)
word = "иладеп"

drow = ""
index = len(word) - 1
while index > -1:
    drow += word[index]
    index -= 1
print(drow)


# 3)
word = "иладеп"

index = len(word) - 1
while index > -1:
    print(word[index], end="")
    index -= 1
else:
    print()  # в конце перенести строку в терминале
12

Текст между одинаковыми символами.

#

Тут я наверно заигрался и это задание наверно не простое. Но не страшно, давайте попробуем не спеша пошагово продумать что нужно делать. Условие: Есть строка с любой информацией, например: 'Компания ООО "Рога и Копыта" выиграли тындырындын по закупке чего-то.' Нужно из нее вырезать кусок между какими-то одинаковыми символами. Например в данном случае чтоб получить название компании, нужно вырезать между кавычками. Метод строк split не использовать. Нужно использовать только метод index!! Можете поэкспериментировать и решить задание без цикла и с циклом, как хотите. P.S. Понадобятся срезы, и сделайте запрос текста и запрос символа между повторением которого вырезать через input. P.P.S См. таблицу методов строк. Метод index возвращает индекс ПЕРВОГО вхождения символа в строке (второго не возвращает (если не "намутить" что он станет первым в какой-то промежуточной строке") ).

text = input("Введите текст: ")
symbol = input("Введите символ который по краям фрагмента текста: ")
Решение
text = input("Введите текст: ")
symbol = input("Введите символ который по краям фрагмента текста: ")

start_index = text.index(symbol) + 1 # индекс начала получили

new_text = ""
while start_index < len(text):
    char = text[start_index]  # берем символ из текста
    if char == symbol:  # когда встретился "второй" символ то всё.
        break
    new_text += char
    start_index += 1

print(new_text)


# ИЛИ только срезами. Внимательно с индексами и промежуточной строкой.
text = input("Введите текст: ")
symbol = input("Введите символ который по краям фрагмента текста: ")

start = text.index(symbol) + 1 # индекс начала получили

# давайте сразу срежем с этого момента до конца текста:
part = text[start:] # срез с start до конца

stop = part.index(symbol)  # получаем индекс второго вхождения symbol

result = text[start:stop + start]
# или
result = part[:stop]

print(result)
13

Ступеньки из букв.

#

Тут всё просто: Есть строка "ступеньки", выведите ее в терминал вот так: с -т --у ---п ----е -----н ------ь -------к --------и

text = "ступеньки"
Решение
text = "ступеньки"

# первый вариант:
index = 0
while index < len(text):
    for_print = "-" * index + text[index]
    print(for_print)
    index += 1


# второй вариант:
index = 0
while index < len(text):
    # метод строк rjust добавляет до нужной длины слева то что вы указали в нем
    char = text[index]
    for_print = char.rjust(index+1, " ")
    print(for_print)
    index += 1


# второй вариант сокращенно то же самое, к объекту символа применяем метод:
index = 0
while index < len(text):
    for_print = text[index].rjust(index+1, " ")
    print(for_print)
    index += 1


# ступеньки наоборот:
text = text[::-1]
index = 0
while index < len(text):
    for_print = text[index].rjust(len(text) - index, " ")
    print(for_print)
    index += 1
14

Удаление пунктуации из текста.

#

Есть перечень знаков пунктуации и спец. символов: punctuation = "!@#$%^&./,?|" И есть строка текста, в котрой они могут присутствовать. Сформируйте новую строку без знаков пунктуации, оставив только текст, пробелы сохранить. Так нужно вот и всё.

punctuation = "!@#$%^&./,?|"
text = "Наверно на этом упражнении закончим. Хватит! Мы хотим отдыхать! #@&#@&!!!"
Решение
punctuation = "!@#$%^&./,?|"
text = "Наверно на этом упражнении закончим. Хватит! Мы хотим отдыхать! #@&#@&!!!"


new_text = ""

idx = 0
while idx < len(text):
    char = text[idx]
    if char not in punctuation:
        new_text += char
    idx += 1
else:
    text = text.strip()  # почистим от пробелов по бокам. Только по бокам.

print(new_text)