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)