Програма, яка ставить запитання

Досі всі дані ми вписували в код руками — і програма щоразу робила рівно одне й те саме. Одна функція, input(), перетворює її на діалог: програма зупиняється й чекає на людину. Разом із цим приходить найчастіша перша помилка новачка й перше чесне обмеження, яке доведеться прийняти.

У темі 05 ти навчився складати текст: різати рядок зрізом, склеювати через join, підставляти значення f-рядком. Усе працювало бездоганно — і все одно програма лишалась дивною. Вона друкувала «Привіт, Олена» навіть тоді, коли за клавіатурою сидів Петро. Причина проста: імʼя «Олена» ми самі вписали в код. Сьогодні навчимо програму питати.

Наскрізний приклад буде найпростіший із можливих — знайомство й дрібний розрахунок. Програма питає імʼя, вік і скільки зошитів людина купує, а потім друкує охайну відповідь:

Як тебе звати? Олена
Скільки тобі років? 14
Скільки зошитів? 3

Привіт, Олена!
Через рік тобі буде 15.
Ти вже прожив(ла) 441,504,000 секунд.
Три зошити по 24.50 грн — це 73.50 грн.
Чому «Привіт, Олена!», а не «Олено!». Кличний відмінок був би ввічливіший, але програма його не знає: вона друкує рівно ті символи, які людина набрала. Щоб отримати «Олено», довелося б написати правило відмінювання українських імен — а це окрема задача, і зовсім не дрібна (Ольга → Ольго, Ігор → Ігорю, Любов → Любове). Тому поки що вітаємось називним відмінком. Це не лінощі, а перший приклад загального правила: машина не знає нічого, чого ти їй не сказав — і мови це стосується так само, як арифметики.

Шість рядків виводу. Щоб їх отримати, знадобиться рівно дві функції — input() і print() — і вміння перетворити текст на число. По дорозі ми зустрінемо помилку, яку зробить кожен, і дійдемо до межі, за якою діалог із людиною перестає бути хорошою ідеєю.

Глухий кутДані, вписані руками

Ось програма, яку ти вже вмієш написати:

name = "Олена"
age = 14
print(f"Привіт, {name}! Через рік тобі буде {age + 1}.")

Вона працює. Вона навіть рахує. Але зверни увагу, що саме в ній записано: не спосіб привітати людину, а одне конкретне привітання для однієї конкретної людини. Щоб привітати Петра, доведеться відкрити файл, знайти рядок, стерти «Олена», написати «Петро» й зберегти. Це не програма — це записка, яку щоразу переписують від руки.

Значення, вписане просто в текст програми, називають захардкодженим (hard-coded, «твердо вшите»). Саме по собі це не гріх: константи на кшталт кількості секунд у годині вписують і мають вписувати. Гріхом воно стає тоді, коли всередині коду опиняються дані — те, що змінюється від запуску до запуску.

Способів дати програмі дані ззовні є кілька, і всі вони зʼявляться в курсі:

звідкияк виглядаєде в курсі
людинапрограма питає, людина друкує відповідьця тема
файлдані лежать на диску, програма їх читаєтема 21
командний рядокдані передають при запуску, одним рядкомтема 26
мережапрограма запитує їх у чужої програмиблок 6

Починаємо з людини — не тому, що це найкращий спосіб (наприкінці теми побачимо, що він найгірший), а тому, що він найкоротший і показує річ, якої немає в жодному іншому: програма вміє зупинятися.

inputЩо насправді робить input()

Уся тема тримається на одному рядку:

name = input("Як тебе звати? ")

Розберімо його на чотири окремі дії, бо це не одна дія, а саме чотири:

  1. Друкує підказку. Текст у дужках виводиться на екран так само, як це зробив би print — з однією різницею: без переходу на новий рядок. Тому курсор лишається одразу після знака питання, і людина друкує відповідь у тому ж рядку;
  2. Зупиняє програму. Виконання зупиняється просто тут. Наступний рядок не почнеться, поки щось не станеться;
  3. Чекає на Enter. Не на першу літеру й не на слово — саме на Enter. Поки людина не натиснула його, програма стоїть. Хоч десять хвилин, хоч добу;
  4. Повертає введене. Усе, що людина набрала, стає значенням виразу input(...). Сам Enter у результат не потрапляє.

Головне слово тут — зупиняє. Ми звикли, що програма — це рядки, які виконуються один за одним із швидкістю мільйонів на секунду. input() — перше, що ти зустрічаєш у Python, що вміє цю течію спинити повністю. Такий виклик звуть блокувальним (blocking call): він не повертає керування доти, доки не дочекається зовнішньої події.

print і input у цьому сенсі — протилежності. print каже «повідом і йди далі», input — «спитай і стій». Покрути інтерактив: він показує ту саму програму крок за кроком і те, скільки часу вона насправді працює, а скільки — просто стоїть.

Де програма зупиняється

Ліворуч — код, підсвічено рядок, який виконується зараз. Праворуч — те, що бачить людина на екрані. Тисни «крок».

станчекає
крок2 / 5
рахує, с0.000
чекає, с0
Про що ця арифметика. Три рядки коду виконуються приблизно за 0.001 секунди — це справжній порядок величини для такої програми. Усе решта часу життя програми — це очікування людини. Посунь повзунок на 120 і доведи програму до кінця: у роботі вона провела одну тисячну секунди, а існувала дві хвилини. Саме звідси ростуть усі обмеження, про які йтиметься в розділі 11.
Дужки порожні — теж законно. input() без підказки працює: програма просто зупиниться з порожнім екраном. Людина побачить курсор, який блимає, і не знатиме, чого від неї хочуть. Тому підказку пишуть завжди — про те, як саме її формулювати, є окремий розділ 09.

ТипГоловна пастка: завжди рядок

А тепер найважливіше речення теми, і воно варте того, щоб прочитати його двічі.

input() завжди повертає рядок. Завжди. Навіть якщо людина ввела 42, навіть якщо ввела -3.14, навіть якщо ввела 0. Python не вгадує, що ти мав на увазі: він віддає рівно ті символи, які натиснули на клавіатурі, склеєні в текст.

Наслідок зʼявляється миттєво:

age_text = input("Скільки тобі років? ") # людина ввела 14
print(age_text + 1)

TypeError: can only concatenate str (not "int") to str

Повідомлення читається дослівно: «можу приклеїти до рядка лише рядок, а не число». Плюс для двох рядків означає склеювання, плюс для двох чисел — додавання, а плюс для рядка й числа не означає нічого, тому Python зупиняється й каже про це.

Це щасливий випадок: помилка гучна, її видно одразу. Значно підступніший інший:

print(age_text * 2)
1414

Тут нічого не впало. Рядок, помножений на число, у Python означає «повтори його стільки разів» — цілком законна операція з теми 05. Програма спокійно надрукувала 1414 замість 28 і поїхала далі. Помилка, яка не падає, дорожча за помилку, яка падає — цю думку ми ще не раз зустрінемо в курсі.

Класичний шкільний приклад тієї самої пастки — "2" + "2". Відповідь не 4, а "22": два символи поставили поруч. Перевір на інтерактиві, що саме лежить у змінній після input() і що з нею робить плюс.

Що повертає input()

Введи те, що набрала б людина на клавіатурі. Перемикач вирішує, чи пропускати відповідь через int().

що набрала людина

тип—
значення—
x + x—
Дві клітинки, які варто порівняти. При «як є» тип завжди str — і для «Олена», і для «2», і для «007». Плюс тоді склеює: "2" + "2" дає "22", тобто рядок довжиною два символи, а не число чотири. Перемкни на int() — і той самий вираз дасть 4. Змінилися не символи на клавіатурі, а тип обʼєкта, який за ними стоїть.

Перетворенняint() і float()

Ліки від пастки — одна дія: перетворити текст на число явно. Для цього є дві функції, з якими ти вже знайомий з теми 04:

age = int(input("Скільки тобі років? "))
price = float(input("Скільки коштує зошит (грн)? "))

Читати такий рядок треба зсередини назовні: спершу спрацює input, поверне рядок, і вже цей рядок піде всередину int. Якщо запис здається щільним, розбий його на два рядки — це той самий код, лише повільніше читається зліва направо:

age_text = input("Скільки тобі років? ")
age = int(age_text)

Обидва варіанти зустрічаються постійно, і жоден не кращий. Другий зручніший, коли з текстом ще треба щось зробити до перетворення — а це, як побачимо в наступному розділі, майже завжди.

Що int() приймає, а що ні

виразрезультатчому
int("42")42суцільні цифри
int(" 42 ")42пробіли по краях дозволені
int("-7")-7знак дозволений
int("42.5")ValueErrorкрапка — не цифра
int("42 000")ValueErrorпробіл усередині
float("42.5")42.5для дробових є свій перетворювач
float("3,5")ValueErrorPython розуміє тільки крапку
int(float("42.5"))42дробова частина відкидається, не округлюється

Останній рядок вартий уваги окремо: int() від дробового числа відкидає все після крапки, а не округлює. int(2.9) дає 2, int(-2.9) дає -2. Округлює інша функція — round().

А якщо людина ввела «сорок»

Тоді буде ось це — справжній вивід, а не переказ:

Traceback (most recent call last):
  File "hello.py", line 2, in <module>
    age = int(input("Скільки тобі років? "))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'сорок'

Читаємо знизу вгору, бо там суть. ValueError — «значення не те». invalid literal for int() — «це не схоже на запис цілого числа». with base 10 — «у десятковій системі» (є ще двійкова, шістнадцяткова — int("ff", 16) працює). І в лапках — точно те, що ми йому дали. Стрілочки ^^^^ під рядком коду показують, який саме шматок винен: Python робить це з версії 3.11 і це найкорисніша дрібниця останніх років.

Тут ми чесно зупиняємось. Правильна реакція програми на «сорок» — перепитати. Щоб перепитати, треба вміти три речі, яких ми ще не вчили: поставити умову «якщо це не число» (тема 12), повторити запит (тема 13) і перехопити помилку, щоб програма не впала (тема 19). Класична конструкція «питай, поки не введуть число» складається рівно з цих трьох деталей — і ми зберемо її цілком у темі 19. Доти твоя програма на «сорок» падатиме, і це нормальний стан речей на шостій темі курсу: краще падати гучно, ніж рахувати неправильно тихо.

Сходи перетворення

Текст із клавіатури піднімається на число й спускається назад у текст. На кожній сходинці видно тип.

що набрала людина

сходинка 1—
сходинка 2—
сходинка 3—
Перевір обовʼязково два положення. «42.5» під int() падає, а під float() проходить — межа проходить рівно по десятковій крапці. І «сорок» падає під обома: жодне перетворення не рятує від тексту, який числом не є. Зверни увагу й на те, що з третьої сходинки повертається рядок, а не число: f-рядок завжди виготовляє текст.

ЧисткаПробіли й регістр

Людина за клавіатурою — не програма. Вона тисне пробіл перед словом і після нього, пише «Так» з великої, «ТАК» капслоком і «так» правильно, і кожен із цих варіантів має означати те саме. Але для Python це три різні рядки.

input() прибирає рівно одну річ — сам Enter. Усе решта лишається як є:

answer = input("Продовжити? ") # людина набрала « Так »
print(repr(answer))
' Так '

Тому перший рядок після кожного input(), який читає слово, а не число, виглядає так:

answer = input("Продовжити? ").strip().lower()

Тут два методи з теми 05, зчеплені в ланцюжок. Читається зліва направо: візьми те, що повернув input, зріж пробіли з країв, а потім переведи все в нижній регістр. Кожен метод повертає новий рядок, і наступний працює вже з ним.

Що це дає на практиці: « Так », «ТАК», «Так» і «так» після цієї обробки стають одним і тим самим рядком "так", і порівнювати треба буде тільки з ним.

Що зʼїдають .strip() і .lower()

Кожна клітинка — один символ. Пробіли показано крапкою, бо інакше їх не видно — і саме тому вони й коштують людям годин.

що набрала людина

символів до—
символів після—
Спробуй «т а к». Ані .strip(), ані .lower() не допоможуть: .strip() працює тільки з краями й ніколи не чіпає середину рядка. Це не недогляд, а свідоме рішення — прибрати пробіли всередині означало б зіпсувати всі імена з двох слів і всі адреси. Хочеш прибрати їх скрізь — це вже .replace(" ", ""), і роби це тільки тоді, коли справді розумієш, навіщо.
Коли .lower() мало. У темі 05 ми згадували .casefold() — агресивніший варіант, зроблений саме для порівнянь без огляду на регістр. Для української різниці немає, для німецької є: "Straße".lower() лишає ß на місці, а .casefold() перетворює його на ss. Якщо порівнюєш відповіді людей будь-якою мовою — бери .casefold().

printprint глибше, ніж здавалось

Ми користуємось print із першої теми, але брали від нього хіба десяту частину. Насправді він приймає скільки завгодно значень і два іменовані аргументи, які керують склеюванням.

Кілька значень через кому. print("Ціна:", 249.5, "грн") друкує Ціна: 249.5 грн. Зверни увагу на дві речі: між значеннями сам собою зʼявився пробіл, і число надрукувалось поруч із текстом без жодного перетворення. Це принципова відмінність від плюса: "Ціна:" + 249.5 дало б TypeError, а print усе перетворює на текст сам.

sep — чим склеювати. За замовчуванням це один пробіл. print("а", "б", sep="") дасть аб, sep=" · " дасть а · б, а sep="\n" поставить кожне значення на окремий рядок.

end — чим закінчувати. За замовчуванням це перехід на новий рядок, "\n". Саме тому кожен print починає з нового рядка. end="" вимикає перехід — наступний print продовжить той самий рядок. До речі, тепер зрозуміло, чим є підказка в input: це рівно print(підказка, end="").

print() без нічого друкує порожній рядок — найдешевший спосіб розділити блоки виводу.

print проти f-рядка

Ліворуч — print із кількома значеннями, праворуч — один f-рядок. Той самий вивід двома різними шляхами.

символів зліва—
символів справа—
Головне, що видно на першому ж кроці: ліва колонка має зайвий пробіл перед знаком оклику — sep поставив його між імʼям і "!", бо він ставиться між усіма значеннями без винятку. Перемкни sep на порожній — зайвий пробіл зникне, але разом із ним зникне й потрібний після коми. Жодне значення sep не дає того самого, що f-рядок: один роздільник не може бути різним у різних місцях рядка. Звідси й правило — print із кількома значеннями для швидкої перевірки під час роботи, f-рядок для тексту, який побачить людина.

ЧислоЯк число виглядає у виводі

Порахувати правильно — половина справи. Друга половина — показати так, щоб людина прочитала без зусиль. Тут працює міні-мова формату з теми 05: після двокрапки всередині f-рядка описується, як саме друкувати значення.

Дві цифри після крапки

Три зошити по 24.50 грн коштують 73.5 грн. Саме так Python і надрукує — а в чеку має бути 73.50, бо гроші пишуть із двома знаками завжди:

total = 24.50 * 3
print(total) # 73.5
print(f"{total:.2f}") # 73.50

Специфікація .2f означає «дробове число, рівно два знаки після крапки». Вона і обрізає зайве, і дописує нулі, яких бракує. Важливо розуміти, що .2f не округлює число — воно виготовляє текст. Змінна total лишається такою, як була; змінюється лише те, що потрапило на екран. Це та сама незмінність, про яку йшлося в темі 05.

Розділювач тисяч

Скільки секунд прожила чотирнадцятирічна людина? 14 * 365 * 24 * 3600 — це 441504000. Прочитати таке число з екрана неможливо: доводиться рахувати нулі пальцем. Специфікація , розставляє розділювачі:

seconds = 14 * 365 * 24 * 3600
print(f"{seconds:,}") # 441,504,000
print(f"{seconds:_}") # 441_504_000
Кома, а не пробіл. :, ставить саме кому — так пишуть в англомовній традиції. В українській розряди відділяють нерозривним пробілом: 441 504 000. Python із коробки цього не вміє: варіанти в міні-мові лише два, , і _. Найпростіший чесний спосіб отримати пробіл — відформатувати комою, а тоді її замінити: f"{seconds:,}".replace(",", " "). Виглядає як хитрість, але це саме те, що роблять у реальному коді, коли не хочеться тягнути налаштування локалі.

Комбінації працюють разом і в передбачуваному порядку: :,.2f — і розряди, і два знаки. f"{12345.678:,.2f}" дає '12,345.68'.

Конструктор формату числа

Ліворуч — число як є, праворуч — воно ж після специфікації. Сама специфікація збирається з перемикачів під ним.

специфікація—
довжина—
результат—
Зніми галочку «писати f». Специфікація стає просто :, — і число друкується з тією кількістю знаків, яку має саме воно: у 123456.78 їх два, а трохи лівіше по повзунку буде чотири. Довжина рядка стрибає, і рівного стовпця з таких рядків не збереш. Саме цим і цінний .2f: він дає однакову форму для будь-якого числа. І зверни увагу, що саме число при цьому не міняється — форматування виготовляє текст, а не нове значення.

СтовпціВирівнювання: таблиця без бібліотек

Останній шматок міні-мови, який потрібен щодня. Число після двокрапки означає мінімальну ширину поля, а знак перед ним — куди притиснути значення всередині цього поля:

знаккуди притискаєприкладрезультат
<ліворучf"{'Олена':<10}|"'Олена     |'
>праворучf"{'Олена':>10}|"'     Олена|'
^по центруf"{'Олена':^10}|"'  Олена   |'
.<ліворуч, добити крапкамиf"{'Олена':.<10}|"'Олена.....|'

Символ перед знаком вирівнювання — це заповнювач: чим саме добивати поле до потрібної ширини. За замовчуванням пробіл, але може бути що завгодно — крапка, дефіс, зірочка. Саме так роблять рядки чека, де назва зліва, сума справа, а між ними доріжка крапок.

Ширину не обовʼязково вписувати числом. У фігурні дужки всередині специфікації можна підставити змінну: f"{name:<{width}}". Це і є спосіб побудувати таблицю, ширина стовпця якої залежить від даних.

Ширина — це мінімум, а не максимум. Якщо значення довше за поле, воно нікуди не обріжеться: Python надрукує його цілком, і рядок просто вилізе за межі стовпця. Наступний стовпець поїде праворуч, і вся таблиця розсиплеться. У цьому — вся суть наступного інтерактиву.

Ширина поля й вирівнювання

Три покупки, два стовпці. Сірим показано поле заданої ширини, чорним — те, що в нього поклали.

специфікація—
найдовше імʼя—
Веди повзунок від 22 вліво. Поки ширина не менша за 15 — довжину найдовшої назви — стовпець із цінами стоїть рівною лінією. На 14 третій рядок виштовхує ціну праворуч, і рівність зникає. Це найпростіший вид верстки, який існує: усе тримається на тому, що всі символи однакової ширини, а поле — не вужче за найдовше значення.

ПідказкаПідказка, яка не бреше

Текст у дужках input() — це вся документація твоєї програми. Іншої в неї немає: людина не читатиме код, вона прочитає рядок на екрані й натисне клавіші. Погана підказка не просто незручна — вона породжує помилки, які потім доводиться ловити.

булощо не такстало
"Вік:"курсор упритул до двокрапки"Вік: "
"Ціна? "у гривнях? у копійках?"Ціна за штуку (грн): "
"Дата: "10 форматів на вибір"Дата (2026-09-01): "
"Продовжити? "«ага», «yes», «+» — усе можливо"Продовжити? (так/ні): "
"Введіть число"яке саме й навіщо"Скільки зошитів купуєш? "

Чотири правила, які покривають майже все:

  1. Пробіл у кінці. Без нього відповідь злипається з питанням: Вік:14. Дрібниця, яку видно щоразу;
  2. Одиниці виміру — у підказці. «Ціна» без «грн» — це запрошення ввести суму в копійках. Одиниця в дужках коштує чотири символи й економить годину;
  3. Приклад формату замість опису. «у форматі рік-місяць-день» гірше, ніж просто (2026-09-01). Приклад не можна зрозуміти неправильно;
  4. Перелічи допустимі відповіді, якщо їх мало. (так/ні), (1-5), (грн/usd). Тоді людина не вигадує.

І правило, яке важить більше за всі чотири: не питай того, що можеш порахувати сам. Кожне зайве питання — це ще одна нагода для людини помилитись і ще один рядок, у якому програма може впасти. Якщо ти вже спитав рік народження, не питай вік.

НюансиДрібниці для тих, хто вже пише

Кілька речей, які не потрібні на шостій темі, але рано чи пізно зіпсують комусь день.

Підказка йде в stdout, а не в stderr. Це означає, що при перенаправленні python3 hello.py > out.txt текст «Як тебе звати? » опиниться у файлі разом із результатом. Якщо потрібен чистий вивід — підказку доводиться друкувати вручну через print(..., file=sys.stderr), а input() викликати з порожніми дужками.

print буферизується, коли вивід іде не на екран. Поки програма пише в термінал, кожен рядок зʼявляється одразу. Щойно вивід перенаправлено у файл або в конвеєр, Python накопичує його блоками приблизно по 8 кілобайт. Програма, що друкує рядок, спить секунду й друкує другий, у терміналі покаже їх з інтервалом, а через | cat — обидва разом наприкінці. Ліки: print(..., flush=True) або запуск із python3 -u.

int() приймає більше, ніж здається. Підкреслення як розділювач розрядів дозволене: int("1_000") дає 1000. І приймаються не лише звичні цифри — int("42") з повноширинними (fullwidth) цифрами теж дає 42. Це окремі символи Unicode, зроблені для східноазійських писемностей, де латиниця й цифри мають бути такої самої ширини, як ієрогліф; для Unicode вони все одно цифри, тому int() їх приймає. А от int("42 000") з пробілом усередині падає. Правило нижче: int() дивиться на категорію символу в Unicode, а не на конкретні коди.

Порожній ввід — це EOFError, а не порожній рядок. Якщо даних більше немає (людина натиснула Ctrl+D, або конвеєр вичерпався), input() не повертає "" — він піднімає EOFError: EOF when reading a line. Це важлива відмінність: порожній рядок означає «людина натиснула Enter, нічого не набравши», а EOFError означає «джерела вводу більше не існує». Низькорівневий sys.stdin.readline() поводиться інакше — повертає '' і лишає \n усередині рядка.

Паролі через input() не питають. Введене видно на екрані й лишається в історії термінала. У стандартній бібліотеці для цього є getpass.getpass("Пароль: ") — той самий інтерфейс, але без відлуння на екрані.

Історична пастка. У Python 2 функція input() робила щось зовсім інше: вона виконувала введений текст як код. Набрана людиною відповідь 2+2 давала число 4, а відповідь із командою — виконувала команду. Безпечним аналогом там був raw_input(). У Python 3 небезпечний варіант прибрали, а raw_input перейменували на input. Тому старий код з інтернету, де є raw_input, — це Python 2, і решта того коду теж не запуститься.

МежаЧому справжні програми не питають людину

А тепер зізнання, яке варте цілого розділу. input() — чудовий навчальний інструмент і поганий інженерний. Програми, які працюють у продакшені, майже ніколи не розмовляють із людиною. Причин рівно три, і кожна випливає з того, що ми бачили в першому інтерактиві: програма стоїть, поки хтось не натисне Enter.

  1. Не автоматизується. Скрипт, який треба запускати вручну й тричі відповідати на питання, не можна вставити в ланцюжок з інших скриптів. Він розриває будь-який конвеєр;
  2. Не тестується. Автоматичний тест (тема 20) запускає код і порівнює результат з очікуваним. Але кому тест натисне Enter? Функція з input() всередині перевіряється тільки хитрощами — тому вхід і виносять назовні, а функції лишають чисту роботу з даними;
  3. Не запускається за розкладом. Звіт, який має формуватися щоночі о третій, не може чекати на людину. О третій ночі людини немає — програма просто стоятиме до ранку, а потім впаде з EOFError.

Найпростіший спосіб побачити це власними руками — нагодувати програму з конвеєра. Термінал уміє підставити наперед заготовлені відповіді замість клавіатури:

printf 'Олена\n14\n' | python3 hello.py

Тут printf друкує два рядки, а вертикальна риска | перенаправляє їх на вхід нашої програми. input() цього не помічає й читає їх так, ніби хтось набрав на клавіатурі. Програма відпрацює миттєво й без жодної паузи. Якщо ж рядків у конвеєрі менше, ніж викликів input(), — буде EOFError: відповідей більше немає, а програма ще питає.

Це вже наполовину автоматизація — і водночас натяк, куди дивитись далі. Дорослий спосіб дати програмі дані при запуску — аргументи командного рядка: python3 hello.py Олена 14. Програма нічого не питає, працює за частку секунди, запускається за розкладом і чудово тестується. Про це — тема 26. Дані, яких багато, беруть із файлів — тема 21.

Практичне правило, яке варто запамʼятати одразу: діалог доречний там, де його не можна замінити. Навчальна програма, разова утиліта для себе, підтвердження незворотної дії («видалити 240 файлів? »), пароль. Усе решта отримує дані ззовні — і не стоїть.

ПідсумокЩо з цього забрати

І наскрізна думка курсу, яка тут прозвучала в новому вбранні: майже всі труднощі цієї теми — наслідок одного простого факту. З клавіатури приходять символи, а не значення. Звідси й "22" замість 4, і пробіл, що ламає порівняння, і ValueError на слові «сорок». Усе, що ми робили, — це чесно перекладали текст на те, що нам потрібно.

Що далі. Одне імʼя тримає рівно одну відповідь. Спитати троє даних — це три виклики input() і три змінні; спитати десять — це десять змінних із іменами answer_1, answer_2… і жодного способу обробити їх разом. Наступна тема — списки: одне імʼя, під яким лежить скільки завгодно значень, кожне зі своїм номером. Саме звідти починається код, який робить щось із багатьма даними, а не з трьома.