Python з нуля · Блок 1 · Тема 02

Привіт, світе

Встановити Python, відкрити термінал, написати перший файл і запустити його. А ще — навчитися читати помилки, бо їх буде багато, і це нормально.

У попередній темі ми з'ясували, що програма — це список інструкцій, які машина виконує одну за одною, і що Python — зручна мова, щоб такі інструкції записувати. Усе це поки що було на словах. Тепер настає момент, коли треба перестати читати про Python і змусити його працювати на власному комп'ютері.

Ця тема — про руки, а не про голову. Ми поставимо інтерпретатор, відкриємо чорне вікно термінала (воно не кусається), напишемо файл із одного рядка, запустимо його — і навмисно зламаємо тричі, щоб навчитися читати повідомлення про помилки. Бо помилки — це не покарання, а звіт про те, що саме пішло не так.

01 / МатчастинаЩо саме ми встановлюємо

Слово «Python» означає дві різні речі, і плутанина між ними — джерело половини непорозумінь.

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

Офіційний інтерпретатор зветься CPython — саме його завантажують із python.org. Існують інші (PyPy, GraalPy), але коли кажуть «встанови Python», мають на увазі CPython.

Чому версія має значення

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

Головне про версії. Старий код майже завжди працює на новому інтерпретаторі. Новий код на старому інтерпретаторі — не працює ніколи. Тому проблема «у мене нічого не запускається» найчастіше означає «у мене стара версія».

Ми орієнтуємось на Python 3.12 або новіший. Не з примхи: у 3.11 з'явилися стрілочки під винним фрагментом у повідомленні про помилку — саме те, що робить навчання відчутно легшим. У 3.12 дозволили однакові лапки всередині f-рядків, і зникла ціла категорія дурних помилок. Посунь повзунок і подивись, що коли з'явилося:

Інтерактив 1 · Що працює в якій версії

Один і той самий код — різні інтерпретатори. Зелене виконається, червоне впаде.

доступно можливостей
Що читати: кожен рядок — це реальна можливість мови, яка з'явилася в конкретному релізі. Зверни увагу на крайнє ліве положення: Python 2.7 — це вже інша мова. Якщо в інтернеті бачиш print "привіт" без дужок, стаття написана до 2020 року й тобі не підходить.

02 / ВстановленняТри системи, три граблі

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

Інтерактив 2 · Встановлення під твою систему

Кроки відрізняються, перевірка — майже однакова. Обери систему.

    перевірка в терміналі
    
          
    Ознака успіху одна: команда перевірки друкує рядок, що починається на Python 3. і далі число не менше за 12. Якщо друкує щось інше або лається — далі йти марно, спершу полагодь установку.
    системазвідки братияк звати командуголовна грабля
    Windowspython.org, інсталятор .exepython, pyзабути галочку «Add to PATH»
    macOSpython.org або brewpython3сплутати свій Python із системним
    Linuxвже стоїть; або менеджер пакетівpython3зламати систему, чіпаючи системний Python
    Ніколи не видаляй системний Python. На Linux і macOS частина самої операційної системи написана на Python: менеджер пакетів, службові утиліти, налаштування мережі. Команда на кшталт sudo apt remove python3 знесе разом із ним половину системи. Свій Python ставиться поруч із системним, а не замість нього.

    03 / ТерміналЧорне вікно без страху

    Термінал (він же командний рядок, консоль, shell) — це вікно, у якому ти пишеш команду текстом, натискаєш Enter, і програма відповідає теж текстом. Оце й усе. Ніякої магії й нічого хакерського: це просто інший спосіб керувати комп'ютером — замість «тицьнути мишею в іконку» ти називаєш дію словом.

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

    Як відкрити

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

    Три команди, щоб не загубитися

    командарозшифровкащо робить
    pwdprint working directoryдрукує, у якій ти зараз теці
    lslistпоказує, що в цій теці лежить (у старому cmd.exe — dir)
    cdchange directoryперейти в іншу теку; cd .. — на рівень вище

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

    Нижче — тренажер. Це не справжній термінал, а модель: він розуміє обмежений набір команд, зате не зіпсує тобі комп'ютер. Спробуй виконати три завдання, які він показує праворуч.

    Інтерактив 3 · Тренажер термінала

    Пиши команду й тисни Enter. Уявна тека користувача olena на macOS.

    $
    поточна тека
    Підказка: команда help покаже все, що тренажер розуміє. Спробуй також навмисно помилитися — набери python без трійки й подивись, що відповість оболонка. Саме це повідомлення ти побачиш на власному Mac або Linux.

    04 / АдресаШлях: як машина називає місце

    Файли живуть у теках, теки лежать у інших теках. Шлях (path) — це маршрут до файлу, записаний рядком. Виглядає він по-різному залежно від системи:

    C:\Users\olena\projects\hello.py   ·   /home/olena/projects/hello.py

    Ліворуч Windows: маршрут починається з літери диска, роздільник — зворотна скісна \. Праворуч macOS і Linux: маршрут починається з кореня /, роздільник — звичайна скісна /. Різниця косметична, логіка однакова.

    Шляхи бувають двох видів, і це головне, що треба засвоїти:

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

    Інтерактив 4 · Де я стою і як звідси запустити файл

    Обери теку в дереві. Файл hello.py завжди лежить в одному місці — змінюється тільки команда.

    Правило, яке рятує: перед запуском зроби cd у теку з файлом, а потім ls — і переконайся, що файл справді у списку. Дев'ять із десяти перших «файл не знайдено» лікуються саме цими двома командами.

    05 / ДіалогREPL: розмова з інтерпретатором

    Набери в терміналі python3 і нічого більше. Замість запрошення оболонки з'явиться інше — три кутові дужки >>>. Ти потрапив у REPL.

    Абревіатура — це цикл із чотирьох дій: Read (прочитати рядок), Eval (обчислити), Print (надрукувати результат), Loop (повторити). Інтерпретатор працює співрозмовником: ти пишеш рядок, він одразу відповідає.

    І ось відмінність, яку плутають найчастіше. У REPL значення виразу друкується саме собою. У файлі — ні. Напиши 2 + 2 у REPL — побачиш 4. Те саме у файлі не покаже нічого, бо друкувати ти не просив.

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

    Інтерактив 5 · REPL проти файлу

    Ліворуч — той самий код у REPL, праворуч — у файлі. Виводу різна кількість.

    REPL · python3
    файл · python3 demo.py
    Коли що: REPL — щоб швидко перевірити, як щось поводиться, порахувати в стовпчик або зазирнути в help(len). Файл — усе, що треба зберегти й повторити завтра. Вийти з REPL: exit() або Ctrl+D (у Windows — Ctrl+Z, потім Enter).

    06 / ФайлПерший файл і що робить запуск

    Тепер найголовніше. Порядок дій такий:

    1. Створи теку для навчання — хай буде projects у домашній теці.
    2. Створи в ній текстовий файл із назвою hello.py.
    3. Напиши в ньому один рядок і збережи:
    print("Привіт, світе!")
    1. У терміналі перейди в цю теку: cd projects.
    2. Запусти: python3 hello.py (на Windows — python hello.py).

    На екрані з'явиться Привіт, світе!. Це твоя перша програма.

    Розширення .py — не магія. Інтерпретатору байдуже: python3 будь-що.txt теж чудово виконається. Розширення потрібне людям і редакторам: за ним редактор впізнає мову й підсвітить синтаксис, а ти з першого погляду відрізниш код від нотаток.

    Що щойно сталося

    крок 1 · оболонка шукає програму

    Ти написав слово python3. Оболонка не знає, що це, тому йде шукати програму з такою назвою серед відомих їй тек. Знаходить — і запускає.

    крок 2 · інтерпретатор отримує аргумент

    Решта рядка — hello.py — передається запущеній програмі як аргумент. Тобто інтерпретатор стартує з інструкцією «твоє завдання лежить у файлі hello.py».

    крок 3 · читання й перевірка синтаксису

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

    крок 4 · виконання по черзі

    Тільки тепер інструкції виконуються згори вниз. print отримує рядок і виводить його в термінал.

    Деталь для тих, хто вже писав код. Кроки 3 і 4 розділені, і це видно на практиці. SyntaxError у останньому рядку файлу не дасть виконатися й першому — граматику перевіряють до старту. А NameError у десятому рядку дозволить дев'яти попереднім спрацювати: помилки імені виявляються лише під час виконання. Побічний ефект: файл, який жодного разу не запускали, може містити скільки завгодно NameError і виглядати цілком здоровим.

    07 / ПошукДві різні «не знайдено»

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

    Перша: не знайдено файл

    python3: can't open file '/home/olena/hello.py': [Errno 2] No such file or directory

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

    Три типові причини: термінал у сусідній теці; блокнот Windows тихо зберіг файл як hello.py.txt; одрук у назві. Ліки одні: ls — і одразу видно, чого насправді бракує.

    Друга: не знайдено саму команду

    zsh: command not found: python3
    або на Windows:
    python : The term 'python' is not recognized as a name of a cmdlet…

    Тут ще гірше: оболонка не змогла знайти саму програму. Тобто або Python не встановлений, або встановлений, але оболонка про нього не знає. І щоб зрозуміти чому, треба знати про PATH.

    PATH — це змінна середовища, у якій записано список тек. Коли ти пишеш python3, оболонка не обшукує весь диск. Вона проходить теки зі списку по черзі і бере перший збіг. Саме тому та славнозвісна галочка на Windows зветься «Add python.exe to PATH» — вона додає теку з Python у цей список.

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

    Інтерактив 6 · Куди дивиться оболонка, коли ти пишеш python3

    Теки перевіряються згори вниз. Виграє перша, у якій щось знайшлося.

    що запуститься
    Позиція 0 означає «нову теку в PATH не додали» — рівно те, що стається, коли на Windows пропустили галочку. Зверни увагу: поки системний Python на місці, команда працює, просто запускає не той інтерпретатор. Звідси класичне «я ж поставив 3.12, а воно каже 3.9».

    08 / ІнструментРедактор коду

    Технічно код можна писати в будь-якому текстовому редакторі — навіть у блокноті. Практично редактор для коду дає чотири речі, і кожна економить конкретні хвилини:

    Що взяти: VS Code із розширенням Python або PyCharm Community. Підійде будь-який редактор, у якому є ці чотири речі.

    Чого точно не робити. Не пиши код у Word, Google Docs чи нотатках з форматуванням. Вони «покращують» текст: перетворюють прямі лапки " на типографські «ялинки», підставляють довге тире замість двох дефісів, додають невидиме форматування. Python такого не розуміє й видасть SyntaxError на рядку, який виглядає бездоганно.

    09 / ДіагностикаАнатомія помилки

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

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

    Наведи мишею на будь-яку частину traceback нижче — або натисни на назву частини під ним. Перемикай типи помилок: чотири варіанти внизу — це чотири найчастіші причини падіння.

    Інтерактив 7 · Розбери traceback на частини

    Справжній вивід Python 3.12. Наводь на фрагменти — праворуч з'явиться пояснення.

    Алгоритм на все життя: прочитай останній рядок → знайди в передостанніх номер рядка → відкрий цей рядок у редакторі → подивись на стрілочки, вони показують не весь рядок, а винний фрагмент. Якщо після цього незрозуміло — копіюй останній рядок у пошук, не весь traceback.
    типщо означаєтипова причина
    NameErrorімені не існуєодрук у назві або змінну не створили раніше
    SyntaxErrorграматика зламананезакрита дужка чи лапка, забута двокрапка
    IndentationErrorвідступ не на місцізайвий пробіл або відсутній блок після двокрапки
    TypeErrorдія не підходить типудодати число до рядка, викликати не функцію
    Чому SyntaxError виглядає інакше. У ньому немає верхнього рядка «Traceback (most recent call last)». Логічно: цей рядок описує шлях виконання, а при синтаксичній помилці виконання так і не почалося — файл не пройшов перевірку граматики. Побачив traceback без шапки — знай, що впало ще до старту.

    10 / ОформленняКоментарі й PEP 8

    Символ # вимикає для інтерпретатора все, що написано після нього до кінця рядка. Це коментар — текст для людей.

    # рахуємо ціну з ПДВ, бо в прайсі вона без нього
    cina_z_pdv = cina * 1.2

    Головне правило коментаря: він пояснює навіщо, а не що. Коментар # додаємо одиницю до рядка storinka = storinka + 1 — сміття: те саме написано в коді. А от # +1, бо для людини нумерація сторінок починається з одиниці — корисно, бо цього в коді не видно.

    Друге застосування — тимчасово вимкнути рядок, не видаляючи його. Зручно, коли перевіряєш, чи саме він ламає програму.

    PEP 8 у двох реченнях

    PEP 8 — це офіційна угода спільноти про те, як має виглядати код на Python: чотири пробіли на відступ, пробіли навколо = та знаків дій, імена змінних малими_літерами_з_підкресленнями, порожній рядок між логічними частинами. Дотримуються її не тому, що інакше не запуститься — запуститься, — а тому що весь світ читає код очима, натренованими на цей вигляд, і чужий код у звичному оформленні розуміється вдвічі швидше.

    Не вчи напам'ять. Оформлення давно роблять інструменти. Редактор із розширенням Python сам розставить пробіли, а форматувальники black чи ruff format приведуть файл до канону однією командою. Твоя робота — думати над іменами, а не рахувати пробіли.

    11 / ГлибшеДля тих, хто вже писав код

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

    Чому python3 -m, а не просто назва утиліти

    Прапорець -m каже: «знайди модуль із такою назвою й виконай його як програму». Головна перевага в тому, що модуль виконується тим самим інтерпретатором, який ти щойно назвав. Порівняй:

    pip install requests
    ↑ який саме pip? той, що трапиться першим у PATH

    python3 -m pip install requests
    ↑ рівно той pip, що належить цьому python3

    У системі майже завжди кілька Python, а отже кілька pip. Класична загадка «я встановив пакет, а імпорт не працює» — це пакет, що ліг в один інтерпретатор, а потрібен іншому. Форма python3 -m pip знімає питання назавжди. Так само корисні python3 -m venv .venv, python3 -m json.tool file.json і python3 -m http.server.

    python проти python3

    Історична спадщина. Поки жив Python 2, слово python означало саме його, а python3 — нову гілку. Домовленість (PEP 394) така: python3 завжди вказує на третю версію, а python може взагалі не існувати — і на свіжих Linux та macOS його часто нема. Пиши python3 і не гадай.

    Два винятки. Всередині активованого віртуального середовища python існує й вказує саме на потрібний інтерпретатор — там коротка форма безпечна. А на Windows офіційний інсталятор ставить ще й лаунчер py, який уміє вибирати версію: py -3.12 script.py запустить саме 3.12, навіть якщо в системі стоять три Python.

    Як не поламати системний Python

    Спокуса поставити пакет «просто в систему» через sudo pip install закінчується однаково: pip перезаписує версію бібліотеки, від якої залежить менеджер пакетів ОС, і той перестає працювати. Тому з Python 3.11 діє PEP 668: інтерпретатори з дистрибутивів позначені як externally managed, і pip сам відмовляється туди щось ставити. Це захист, а не перешкода — обходити його прапорцем --break-system-packages варто хіба що з повним розумінням наслідків (назву прапорця обрали не випадково).

    Правильне місце для пакетів — віртуальне середовище (venv): окрема тека в проєкті з власним набором бібліотек і власним посиланням на інтерпретатор. Один проєкт — одне середовище, і залежності не конфліктують. Створюється однією командою python3 -m venv .venv, а докладно розберемо це в темі 17 «Віртуальні середовища і pip».

    Дрібниця, яка тішить. python3 -i hello.py виконає файл і залишить тебе в REPL з усіма змінними, які програма встигла створити. Найдешевший спосіб подивитися, що всередині, коли щось пішло не так, — дешевший за розстановку print по всьому файлу.

    12 / ПідсумокЩо ми тепер уміємо

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

    А тепер про наступний крок. Наша програма нічого не пам'ятає: надрукувала рядок і забула його назавжди. Щоб робити щось складніше, значення треба вміти зберігати — давати їм імена й повертатися до них пізніше. Здається, тема на п'ять хвилин. Насправді саме тут ховається одна з найважливіших ідей Python: ім'я — це не коробка зі значенням, а ярлик, наклеєний на об'єкт. Різниця між цими двома картинками пояснює половину дивної поведінки, з якою ти зіткнешся пізніше.

    Далі в практиці. У practice.ipynb ти зробиш перший файл, запустиш його програмно, а потім навмисно зламаєш тричі — і розбереш кожен traceback по частинах, щоб діагноз ставився за секунди, а не за пів години.

    Далі в темі

    Теорію прочитано. Тепер закріпи її на практиці.