Цикл while и ввод пользователя
for идёт по готовому набору данных. while работает, пока условие истинно. Его используют, когда число шагов заранее неизвестно: повторные попытки, очередь задач, ожидание.
Правило курса: решайте сами, без AI.
Цикл while
Заголовок раздела «Цикл while»n = 0while n < 3: print("n =", n) n += 1Ответ:
n = 0n = 1n = 2- Условие проверяется перед каждым шагом.
- Меняйте переменную внутри цикла. Иначе цикл не закончится.
- Если цикл завис, нажмите
Ctrl+C.
break и continue
Заголовок раздела «break и continue»| Команда | Что делает |
|---|---|
break | Выходит из цикла сразу |
continue | Пропускает остаток шага и идёт к следующему |
amounts = [49.9, -5, 120.0, 0, 300.0, 80.0]i = 0total = 0while i < len(amounts): a = amounts[i] i += 1 if a <= 0: continue # плохая сумма: пропускаем if total > 400: break # лимит набран: выходим total += aprint(total)Ответ:
469.9Обратите внимание: i += 1 стоит до continue. Иначе цикл зациклится на плохом значении.
while True
Заголовок раздела «while True»Цикл «до события». Выход только через break.
attempts = 0while True: attempts += 1 ok = attempts == 3 # имитация: успех на третьей попытке print("attempt", attempts, "ok" if ok else "fail") if ok or attempts >= 5: breakОтвет:
attempt 1 failattempt 2 failattempt 3 okВсегда ставьте лимит попыток. Бесконечный retry может держать pipeline часами.
Очередь: while со списком
Заголовок раздела «Очередь: while со списком»Пустой список — это False. Поэтому while queue: работает, пока в списке есть элементы.
queue = ["a.csv", "b.csv", "c.csv"]while queue: f = queue.pop(0) print("process", f)print("done")Ответ:
process a.csvprocess b.csvprocess c.csvdoneinput()
Заголовок раздела «input()»input() ждёт, пока пользователь введёт строку и нажмёт Enter. Результат всегда str.
while True: raw = input("Сумма: ") if not raw.isdigit(): print("Нужно число") continue value = int(raw) if value <= 0: print("Нужно больше нуля") continue breakprint("Принято:", value)Пример диалога (то, что вводит человек, идёт после Сумма: ):
Сумма: abcНужно числоСумма: 0Нужно больше нуляСумма: 42Принято: 42raw.isdigit()вернётTrue, если в строке только цифры.- Это шаблон проверки ввода: спросить, проверить, повторить или выйти.
Почему в pipeline нет input()
Заголовок раздела «Почему в pipeline нет input()»- Pipeline запускает планировщик (cron, Airflow) или CI. Рядом нет человека.
input()будет ждать вечно. Задача зависнет.- Параметры передают снаружи: аргументами командной строки, переменными окружения или файлом конфигурации.
Для аргументов есть два инструмента: sys.argv и argparse.
sys.argv
Заголовок раздела «sys.argv»sys.argv — список строк. Первый элемент — имя скрипта. Остальные — аргументы.
Файл argv_demo.py:
import sys
print(sys.argv)path = sys.argv[1]print("file:", path)Запуск:
python3 argv_demo.py data/orders.csvОтвет:
['argv_demo.py', 'data/orders.csv']file: data/orders.csvЭто просто, но у sys.argv нет проверок, подсказок и типов. Для реальных скриптов берите argparse.
argparse
Заголовок раздела «argparse»argparse из стандартной библиотеки разбирает аргументы, проверяет типы и строит --help.
Файл ap_demo.py:
import argparse
parser = argparse.ArgumentParser(description="Load orders from CSV")parser.add_argument("path", help="path to CSV file")parser.add_argument("--min-amount", type=float, default=0.0, help="skip small orders")parser.add_argument("--dry-run", action="store_true", help="do not write anything")args = parser.parse_args()
print(args.path, args.min_amount, args.dry_run)Запуск:
python3 ap_demo.py orders.csv --min-amount 50 --dry-runpython3 ap_demo.py orders.csvpython3 ap_demo.py --helpОтвет:
orders.csv 50.0 Trueorders.csv 0.0 Falseusage: ap_demo.py [-h] [--min-amount MIN_AMOUNT] [--dry-run] path
Load orders from CSV
positional arguments: path path to CSV file
options: -h, --help show this help message and exit --min-amount MIN_AMOUNT skip small orders --dry-run do not write anything| Вид аргумента | Пример | Значение |
|---|---|---|
| Позиционный | path | Обязательный |
| Опция | --min-amount 50 | Необязательный, есть default |
| Флаг | --dry-run | True, если указан |
Если не указать path, argparse остановит скрипт и напишет понятную ошибку. Это лучше, чем IndexError от sys.argv[1].
Где это в работе
Заголовок раздела «Где это в работе»| Задача | Что используют |
|---|---|
| Повторные попытки при сбое API или БД | while с лимитом и break |
| Обработка очереди файлов или задач | while queue: |
| Скрипт для cron или Airflow | argparse: путь, дата, --dry-run |
| Разовая интерактивная утилита | input() |
Запуск за дату: python etl.py --date 2026-01-15 | argparse |
Практика
Заголовок раздела «Практика»Задание 1
Заголовок раздела «Задание 1»Баланс 1000. Каждый месяц он растёт на 10%. За сколько месяцев баланс станет больше 2000? Выведите число месяцев и баланс с округлением до 2 знаков.
Проверка: 8 2143.59
Решение
balance = 1000months = 0while balance <= 2000: balance *= 1.1 months += 1print(months, round(balance, 2))Задание 2
Заголовок раздела «Задание 2»Дан список amounts = [49.9, 120.0, 15.5, 300.0, 80.0]. Достаньте элементы через pop() в цикле while amounts:. Посчитайте их число и сумму.
Проверка: 5 565.4
Решение
amounts = [49.9, 120.0, 15.5, 300.0, 80.0]count = 0total = 0while amounts: a = amounts.pop() count += 1 total += aprint(count, total)Задание 3
Заголовок раздела «Задание 3»Есть строки файла. Оставьте только непустые строки, которые не начинаются с #. Используйте while и continue. Подсказка: line.startswith("#") вернёт True, если строка начинается с #.
lines = ["order_id,amount", "", "# comment", "1001,49.9", "", "1002,120.0"]Проверка: ['order_id,amount', '1001,49.9', '1002,120.0']
Решение
lines = ["order_id,amount", "", "# comment", "1001,49.9", "", "1002,120.0"]i = 0rows = []while i < len(lines): line = lines[i] i += 1 if not line or line.startswith("#"): continue rows.append(line)print(rows)Задание 4
Заголовок раздела «Задание 4»Список results — итог каждой попытки загрузки: False — сбой, True — успех. Проходите попытки по порядку через while. При первом успехе выведите номер попытки и выйдите через break.
results = [False, False, True, True, True]Проверка: ok on attempt 3
Решение
results = [False, False, True, True, True]attempt = 0while attempt < len(results): ok = results[attempt] attempt += 1 if ok: print("ok on attempt", attempt) breakЗадание 5
Заголовок раздела «Задание 5»Напишите скрипт sum_input.py. Он спрашивает суммы заказов через input(). Пустая строка завершает ввод. Если ввод не число, скрипт пишет Не число и спрашивает снова. В конце печатает итог. Подсказка: raw.replace(".", "", 1).isdigit() проверяет число с одной точкой.
Проверка: ввод 10, abc, 20.5, пустая строка. Итог: Итого: 30.5. Между вводами выводится Не число.
Решение
total = 0while True: raw = input("Сумма заказа (пусто = конец): ") if raw == "": break if not raw.replace(".", "", 1).isdigit(): print("Не число") continue total += float(raw)print("Итого:", total)Задание 6
Заголовок раздела «Задание 6»Напишите скрипт read_orders.py с argparse. Позиционный аргумент path. Опция --limit типа int, по умолчанию 10. Скрипт печатает read <path>, limit <N>.
Проверка:
python3 read_orders.py orders.csv --limit 5 # read orders.csv, limit 5python3 read_orders.py orders.csv # read orders.csv, limit 10python3 read_orders.py orders.csv --limit abc # read_orders.py: error: argument --limit: invalid int value: 'abc'Решение
import argparse
parser = argparse.ArgumentParser()parser.add_argument("path")parser.add_argument("--limit", type=int, default=10)args = parser.parse_args()print(f"read {args.path}, limit {args.limit}")Что запомнить
Заголовок раздела «Что запомнить»whileповторяет шаги, пока условие истинно. Меняйте переменную в цикле.breakвыходит из цикла.continueпереходит к следующему шагу.- Для retry ставьте лимит попыток.
- В pipeline нет
input(). Параметры берут изsys.argvилиargparse. argparseпроверяет типы и пишет--helpсам.
Дальше: Python Crash Course, глава 7.
Следующий урок: Функции.