Python з нуля

Глосарій

Усі поняття курсу в одному місці: що воно означає, як зветься англійською і в якій темі про нього розказано докладно.

← до списку тем

Цей словник розвʼязує одну задачу: одне поняття — одна назва. Курс писався сорока темами поспіль, і термінологія в ньому складалась по ходу; тут вона зведена до канону. Якщо в темі трапиться інше слово для того самого — правильним вважається те, що стоїть тут заголовком.

Заголовок статті українською там, де український відповідник усталений і зрозумілий (зріз, виняток, включення), і англійською там, де перекладати нема чого або переклад вийшов би гіршим за оригінал (dataclass, f-рядок, traceback, MRO). Другий варіант завжди поруч із першим, тому шукати можна будь-яким. Де переклад спірний — у статті є окрема нотатка про те, які ще варіанти трапляються й чому обрано саме цей. Усього тут 130 статей: 99 з українським заголовком і 31 з англійським.

Абетковий покажчик

Українською

Англійською

кирилицяА

Агрегатна функція aggregate function

Функція SQL, яка бере багато рядків і повертає один результат: count(*), sum, avg, min, max. Разом із group by вона рахує не по всій таблиці, а окремо по кожній купці рядків з однаковим значенням стовпця.

Різницю між where і having плутають постійно: where відсіює рядки до групування, having — уже готові купки після нього, і тільки в ньому можна згадувати count(*). Виграш не в довжині запису: group by рахує там, де лежать дані, і повертає три числа замість двох мільйонів рядків.

Вводиться: 23. Бази даних і SQL

Алгоритм algorithm

Скінченний перелік кроків, який із будь-яких допустимих вхідних даних дає потрібний результат. «Скінченний» тут важливе: рецепт, що не закінчується, алгоритмом не є.

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

Амортизована складність amortized complexity

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

Класичний приклад — append у списку. Майже завжди він просто кладе елемент у готовий запас і коштує сталу кількість дій. Але коли запас вичерпався, список копіює себе на більше місце — і цей виклик дорогий. Оскільки запас щоразу беруть із випередженням, дорогі виклики трапляються дедалі рідше, і середня ціна виходить на сталу межу. Позначають O(1) амортизовано. Не плутай із середнім випадком: середній випадок — про розподіл даних («якщо ключі лягли рівномірно»), амортизована складність — про послідовність викликів, і вона гарантована незалежно від даних.

Анотація типу type hint, annotation

Примітка про очікуваний тип, записана двокрапкою після імені: кількість: int, а для результату функції — стрілкою -> float. Сам Python за нею нічого не перевіряє: це документація, записана так формально, що її може прочитати програма.

Канонічна назва курсу — анотація, а не «підказка типу»: калька з hint натякає на необовʼязкову пораду, тоді як для @dataclass анотація — обовʼязкова розмітка, без якої рядок узагалі не стане полем.

Вводиться: 34. Типи (type hints) · 33. Dataclass і сучасний стиль

Асинхронність asynchrony, async

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

Типова хибна надія — «додам async, і буде швидше». Там, де немає пауз, а процесор зайнятий обчисленнями, виграшу немає взагалі.

Вводиться: 37. Асинхронність — базово

Атрибут attribute

Поле обʼєкта, до якого звертаються через крапку: p.ціна. У примірника атрибути лежать у звичайному словнику p.__dict__, і крапка — просто зручний запис для роботи з ним.

Python не веде списку дозволених полів, тому одруківка не падає, а мовчки створює новий атрибут: після p.кількіть = 7 сума рахуватиметься по старому значенні.

Вводиться: 30. Класи й обʼєкти

кирилицяБ

База даних database

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

Обидві половини видно на числах. Знайти один рядок у CSV на 130 МБ — це прочитати всі 130 МБ (12 секунд), а в базі з індексом — 22 кроки. І два записувачі, які одночасно правлять той самий файл, мовчки затирають один одного: 365 рядків замість 600, без жодної помилки. Файл не має способу сказати «зачекай, я пишу» — база має.

Вводиться: 23. Бази даних і SQL

Байт-код bytecode

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

Побачити його можна: import dis; dis.dis('print(2 + 3)'). Звідси й відповідь на питання «Python компільований чи інтерпретований?» — компіляція є, але не в машинний код, а в байт-код, і відбувається вона щоразу при запуску.

Безпечний і ідемпотентний метод safe / idempotent

Безпечний метод нічого не змінює на сервері: скільки не викликай, світ лишається тим самим. Безпечні тільки GET, HEAD і OPTIONS. Ідемпотентний метод змінювати може, але повтор лишає стан таким самим, як після першого разу: PUT, DELETE.

Це два різні поняття, і їх постійно змішують. Видалення не безпечне — воно змінює світ, — зате ідемпотентне: видалити ту саму позицію двічі те саме, що видалити один раз, її просто вже немає. А POST ні те, ні те: натиснув «додати» двічі — отримав дві позиції й два списання. Саме звідси випливає, який запит вільно повторювати після збою, а який ні.

Вводиться: 27. HTTP-запити · 28. Робота з API

Біт і байт bit and byte

Біт — комірка, у якій може стояти або 0, або 1; менше не буває. Байт — вісім таких комірок, тобто 256 різних станів. Уся памʼять компʼютера — це такі комірки, і будь-яке число, літера чи зображення врешті записані ними.

Звідси беруться межі, які інакше здаються примхою: у float на дробову частину відведено 52 біти, тому 0.1 не записується точно; літера латиниці в UTF-8 займає один байт, а українська — два.

Блокувальний виклик blocking call

Звичайний синхронний виклик, який чекає, не віддаючи керування: time.sleep, requests.get, open().read(). Усередині асинхронної програми він зупиняє єдиний потік, а разом із ним і цикл подій — усі задачі стоять.

Програма від цього не падає, вона просто тихо перестає бути асинхронною. Рятує asyncio.to_thread, який віддає такий виклик окремому потоку.

Вводиться: 06. Діалог із користувачем · 37. Асинхронність — базово

кирилицяВ

Векторизація vectorization

Запис, у якому операція застосовується одразу до всього масиву без жодного циклу: масив * 1.2 множить кожен елемент і повертає новий масив.

Цикл for по масиву не просто зайвий — він приблизно вдвічі повільніший за цикл по списку, бо кожен елемент доводиться загортати у свіжий обʼєкт Python.

Вводиться: 38. NumPy: масиви

Вигляд (масиву) view

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

Протилежність зрізу списку, який був копією. Ліки — .copy(); перевірка — np.shares_memory. Не плутай з представленням словника: обидва англійською view, але курс тримає для них різні слова навмисно.

Вводиться: 38. NumPy: масиви

Виняток exception

Обʼєкт, який програма кидає нагору, коли граматика коду бездоганна, програма вже працює, але конкретна дія саме зараз неможлива: файлу немає, ділять на нуль, ключа немає в словнику.

Курс каже саме виняток, а не «виключення»: назва точна як «виняток із правила», і виняток не завжди чиясь провина — кінець файлу і Ctrl+C теж винятки.

Вводиться: 19. Помилки та винятки

Вираз expression

Шматок коду, який обчислюється у значення: 2 + 3, x, len(s) > 0. Протилежність — інструкція (statement), яка щось робить: присвоєння, if, for.

Різниця не буквоїдська: вираз можна підставити туди, де очікується значення, а інструкцію — ні. Тому x = (y = 3) в Python помилка, а x = 3 if y else 4 — ні.

Відсоткове кодування percent-encoding

Спосіб записати в адресі символ, якого там бути не може. Слово перетворюють на байти UTF-8, і кожен байт, який не є латинською літерою, цифрою чи одним із кількох безпечних знаків, пишуть як % і два шістнадцяткові знаки: українська «ч» стає %D1%87. Пробіл у рядку запиту традиційно пишуть як +.

Робити це руками не треба, а склеювати адресу рядком не можна: пробіл її обірве, & обріже значення на півслові, # мовчки викине все, що після нього. Правильний спосіб один — віддати словник: requests.get(url, params={...}), а r.url покаже, що з цього вийшло насправді.

Вводиться: 27. HTTP-запити

Відступ як синтаксис significant indentation

У Python межі блоку задає відступ, а не дужки: рядки з однаковим відступом належать до одного блоку. Це не оформлення на смак, а частина граматики мови — зміниш відступ, зміниться зміст програми.

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

Віртуальне середовище virtual environment

Звичайна тека (за домовленістю .venv) із власним набором бібліотек і власним python, щоб два проєкти з різними версіями однієї бібліотеки не воювали. Створюють командою python3 -m venv .venv.

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

Вводиться: 18. Віртуальні середовища і pip

Вісь axis

Напрямок у масиві чи таблиці: вісь 0 іде вниз по рядках, вісь 1 — вправо по стовпцях, і саме в такому порядку вони записані у формі (shape) — кортежі довжин по кожному виміру.

У згортках axis=k — це вісь, уздовж якої рухається підсумовування, і саме вона зникає з форми результату. «Сума по магазинах» — це axis=1, хоч інтуїція часто підказує нуль.

Вводиться: 38. NumPy: масиви

Включення comprehension

Однорядковий запис найчастішого циклу — того, що бере одну колекцію й будує з неї другу: [ціна * 2 for ціна in цінник]. Буває спискове, множинне й словникове, за виглядом дужок.

Це канонічна назва курсу; англійською кажуть list comprehension, і в текстах трапляється калька «списковий вираз». Головне тут не економія рядків: включення описує результат, а цикл — процес, тому вираз стоїть попереду, ще до слова for.

Вводиться: 14. Спискові включення

Вузол node

Будь-який елемент дерева сторінки: тег, його атрибути, текст усередині. Розбір HTML — це перетворення плаского тексту на дерево вузлів, після якого лишається тільки ходити по ньому: тег усередині іншого — дитина (child), зовнішній — батько (parent), усе, що лежить усередині на будь-якій глибині, — нащадки (descendants).

Канонічна назва курсу — вузол, а не «нода»: слово українське, усталене й уже живе в мові дерев. Вузол — не рядок, а обʼєкт із власними дітьми, тому текст із нього дістають окремо (.get_text(" ", strip=True)), а атрибути окремо (tag["href"] падає, tag.get("href") віддає None).

Вводиться: 29. Скрапінг сторінок

Не плутай із хостом. У темах про мережу «хост» — це машина, до якої йде запит (те, що стоїть у заголовку Host:). Вузол у цьому глосарії — елемент дерева сторінки. Слова різні, і в блоці про мережу вони трапляються поруч.

кирилицяГ

Генератор generator

Функція, у тілі якої є слово yield, і обʼєкт, який повертає її виклик. Значення вона віддає по одному, на вимогу, а не будує весь список одразу — це і називають лінивими обчисленнями (lazy evaluation).

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

Вводиться: 35. Ітератори й генератори

Генераторний вираз generator expression

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

Усередині виклику функції власні дужки не потрібні: sum(ціна * к for ціна, к in zip(...)) рахує суму, жодного разу не створивши проміжного списку.

Вводиться: 14. Спискові включення · 35. Ітератори й генератори

кирилицяД

Гістограма histogram

Графік розподілу: вісь значень ділять на однакові кошики й показують, скільки спостережень у кожен потрапило. Відповідає не «скільки всього», а «як саме розкидано».

Кошики вирішують усе. Той самий набір при десяти кошиках може виглядати одногорбим, а при пʼятдесяти — двогорбим. Тому гістограму не читають без питання «скільки тут кошиків і чому стільки»; і тому середнього недосить — воно однакове у розподілів геть різної форми.

Декоратор decorator

Функція, яка приймає функцію й повертає нову функцію. Рядок @таймер над def підсумок — це буквально підсумок = таймер(підсумок), виконане один раз при читанні файлу, а не при виклику.

Внутрішню функцію декоратора називають обгорткою (wrapper). Найпоширеніша перша помилка — забути в ній return результат: функція раптом починає повертати None, і причину шукають не там.

Вводиться: 36. Декоратори

Динамічна сторінка client-side rendering

Сторінка, вміст якої домальовує JavaScript уже в браузері: сервер віддає порожній каркас, скрипт іде по дані окремим запитом і вставляє їх у контейнер. У тексті, який приїхав до requests, цього вмісту немає взагалі.

Ознака впізнавана: у браузері вісім позицій, а select(".name") повертає порожній список — і код при цьому правильний. requests — завантажувач, а не браузер, JavaScript він не виконує. Перш ніж тягнутись по Playwright чи Selenium, знайди у вкладці «Мережа» той самий прихований запит: він майже завжди віддає JSON і робить скрапінг непотрібним.

Вводиться: 29. Скрапінг сторінок

Докстрінг docstring

Рядок у потрійних лапках, що стоїть першим у тілі функції, класу чи модуля. Python зберігає його в самому обʼєкті, тому help(функція) і функція.__doc__ показують саме його.

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

Вводиться: 15. Функції

кирилицяЕ

Екранування escaping

Спосіб сказати «наступний символ — звичайний, а не службовий». У Python і в регулярних виразах це зворотна скісна: \n — перехід рядка, \. — саме крапка, а не «будь-який символ».

Пастка — шари. Той самий текст може проходити екранування двічі: спершу як літерал Python, потім як регулярний вираз, а часом ще й як значення в JSON чи в SQL. На кожному шарі скісних треба вдвічі більше, і саме тому вирази з "\\\\" виглядають лячно. Ліки — сирий рядок і звичка друкувати проміжний результат.

Експоненційний відступ exponential backoff

Правило пауз між повторами невдалого запиту: кожна наступна вдвічі довша за попередню — 1 секунда, 2, 4, 8. Повторюють тільки 5xx («зараз не можу») і тільки ідемпотентні методи.

Пауза росте не з ввічливості, а з арифметики: 5xx найчастіше означає перевантаження, і тисяча клієнтів, які грюкають раз на секунду, не дають серверу піднятись ніколи. Зростаюча пауза ще й перекриває довший збій тією самою кількістю спроб: пʼять подвоєнь — майже шістнадцять секунд, пʼять секундних — чотири. Якщо сервер надіслав Retry-After, бери число звідти, а не вигадуй своє.

Вводиться: 28. Робота з API

кирилицяЖ

Жадібність greediness

Поведінка квантифікаторів регулярного виразу за замовчуванням: вони беруть якнайбільше, тобто до кінця рядка, а потім віддають назад по одному символу, поки решта шаблону не складеться.

Саме тому r"<.+>" повертає весь рядок замість одного тега. Знак питання (.+?) робить квантифікатор лінивим: він бере якнайменше.

Вводиться: 25. Регулярні вирази

кирилицяЗ

Заголовок header

Пара «назва: значення» у службовій частині запиту або відповіді HTTP — усе, що сторони кажуть одна одній про дані, а не самі дані. У requests заголовки відповіді лежать у r.headers і поводяться майже як словник, тільки регістр назви не має значення.

Найважливіший — Content-Type: він відповідає одразу на два питання, що це за дані і в якому вони кодуванні. Якщо charset у ньому не названо, старий стандарт наказує вважати відповідь ISO-8859-1, де українських літер немає взагалі, — звідси й кракозябра в r.text. Кракозябра ніколи не означає «зіпсовані дані»: це правильні байти, зібрані за неправильним правилом, і r.content лишається цілим.

Вводиться: 27. HTTP-запити

Замикання closure

Внутрішня функція разом із захопленими іменами зовнішньої: обгортка вже завершилась, а її памʼять живе, поки жива внутрішня функція.

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

Вводиться: 16. Аргументи й область видимості · 36. Декоратори

Затінення shadowing

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

Найдорожчий випадок — затінити вбудоване імʼя: назвати змінну list, str або id. Помилки не буде там, де ти це зробив — вона вилізе нижче, коли той самий код спробує викликати list(...) і дістане TypeError: 'list' object is not callable.

Захардкоджене значення hard-coded

Значення, вписане просто в текст програми: name = "Олена". Саме по собі це не гріх — константи на кшталт кількості секунд у годині вписують і мають вписувати. Гріхом воно стає тоді, коли всередині коду опиняються дані, тобто те, що змінюється від запуску до запуску.

Курс каже захардкоджене, слідом за англійським hard-coded («твердо вшите»): український відповідник вийшов би описом на пів рядка. Ліки — брати дані ззовні, і курс показує чотири способи: спитати людину (06. Діалог із користувачем), прочитати файл (тема 21), узяти з командного рядка (тема 26) або сходити по них у мережу (тема 27).

Вводиться: 06. Діалог із користувачем

Захисна умова __main__ main guard

Рядок if __name__ == "__main__":, який читається як «якщо мене запустили головним, а не імпортували». У змінній __name__ при прямому запуску лежить "__main__", а при імпорті — справжнє імʼя модуля.

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

Вводиться: 17. Модулі й пакети

Зʼєднання connection

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

Чому це важливо на практиці. Установлення коштує часу, тож слати сто запитів по сто нових зʼєднань — марнотратство. Тому HTTP уміє тримати зʼєднання відкритим і слати наступні запити ним же (Session у requests). Виграш заміряний, але залежить від налаштувань TCP на боці сервера — тому цитувати варто напрямок, а не множник.

Змінна середовища environment variable

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

Найвідоміша — PATH: перелік тек, у яких система шукає програму, коли ти набрав її імʼя без повного шляху. Саме тому «python не знайдено» майже завжди означає не «не встановлено», а «встановлено не туди, де система дивиться».

Змінюваний і незмінний обʼєкт mutable / immutable

Незмінний обʼєкт (int, float, str, tuple, bool, None) після створення вже ніколи не зміниться; будь-яка «зміна» створює новий обʼєкт. Змінюваний (list, dict, set, більшість власних класів) редагують зсередини, не створюючи нового.

Незмінність діє лише на один рівень: дані[0] = [9] у кортежі заборонено, а дані[0].append(3) працює — бо міняє не стрілку, а обʼєкт на її кінці.

Вводиться: 03. Змінні та обʼєкти · 08. Кортежі й розпакування

Значення за замовчуванням default value

Значення, записане в рядку def через =, яке підставляється, якщо відповідного аргументу не передали. Обчислюється один раз, у момент виконання рядка def, а не на кожен виклик.

Звідси найвідоміша пастка Python: def додати(що, кошик=[]) отримує щоразу той самий список — уже з усім, що накидали попередні виклики. Ліки: ставити None і створювати список усередині функції.

Вводиться: 16. Аргументи й область видимості

Зріз slice

Взяти не один елемент, а цілий діапазон: послідовність[старт:стоп:крок] — почни зі старту, зупинись перед стопом, крокуй по кроку. Будь-яке з трьох чисел можна пропустити.

Верхня межа не входить — звідси дві зручності: довжина зрізу дорівнює стоп − старт, а s[:5] + s[5:] завжди дає вихідний рядок. Зріз ніколи не падає за межі, на відміну від індексу.

Вводиться: 05. Рядки · 07. Списки

кирилицяІ

Ідентичність identity

Відповідь на питання «це той самий обʼєкт чи інший, просто схожий?». Її повертає id(x), і саме про неї питає оператор is, тоді як == питає про значення.

Правило: is бережи майже виключно для None. Для чисел і рядків він «працює» на маленьких значеннях і ламається на великих, бо CPython кешує лише цілі від −5 до 256 — це оптимізація, а не правило мови.

Вводиться: 03. Змінні та обʼєкти · 12. Умови

Імʼя name

Ярлик, наклеєний на обʼєкт, а не коробка зі значенням. Знак = спершу обчислює вираз праворуч, і в памʼяті зʼявляється обʼєкт, а потім прикріплює до нього імʼя — цю дію звуть звʼязуванням імені (name binding). Тому b = a — не копіювання, а другий ярлик на той самий обʼєкт.

Слово «змінна» лишилось за традицією, але точніше казати імʼя: так написано і в документації Python. Модель «коробки зі значенням» тут не працює: коробка вміщує значення, ярлик лише вказує на нього. Скористатися імʼям до присвоєння не вийде — буде NameError.

Вводиться: 03. Змінні та обʼєкти

Індекс index

Номер елемента в послідовності, що починається з нуля. Індекс — це не «котрий за рахунком», а відстань від початку, тому нульовий елемент стоїть на нульовій відстані; відʼємний індекс -k означає len(x) - k.

У pandas тим самим словом (і тим самим англійським index) звуть інше: окремий обʼєкт із міткою для кожного рядка таблиці, і мітка не мусить збігатися з позицією. Звідси різниця loc (за міткою) і iloc (за позицією) у темі 39. Третє значення того самого слова — індекс бази даних: там це вже не номер і не мітка, а окрема структура для швидкого пошуку.

Вводиться: 05. Рядки · 07. Списки

Індекс бази даних database index

Окрема структура, у якій значення стовпця лежать упорядковано, а поруч із кожним — вказівка, у якому рядку таблиці воно стоїть. Це покажчик у кінці книжки: пошук у впорядкованому переліку йде діленням навпіл, і на 2,5 млн рядків це 22 кроки замість 2 500 000, тобто 0,020 мс замість 277.

Індекс не безкоштовний — саме тому база не створює його сама на кожен стовпець: на тих самих даних файл виріс на 78 %, а вставка 200 000 рядків уповільнилась у 1,7 раза. Створюй під конкретний частий запит, а користь перевіряй планом запиту. Не плутай із індексом у послідовності й з index у pandas: одне англійське слово, три різні речі.

Вводиться: 23. Бази даних і SQL

Ініціалізатор initializer, __init__

Метод __init__, який наповнює вже створений порожній примірник полями й перевіряє, що дані мають сенс. Коли він починає працювати, обʼєкт уже існує й уже має id().

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

Вводиться: 30. Класи й обʼєкти

Інтерпретатор interpreter

Програма, яка виконує іншу програму. Ти запускаєш не свій файл, а інтерпретатор і даєш йому файл: python hello.py. Він читає твій текст і робить те, що там написано.

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

Істинність truthiness

Правило, за яким if питає «ти істина?» у будь-якого обʼєкта, а не лише в bool. Хибними вважаються False, None, нулі будь-якого числового типу й порожні колекції; усе інше істинне.

Дві головні пастки — "0" і [0]: обидва істинні, бо непорожні, і Python не заглядає всередину. Пиши if міста:, а не if len(міста) > 0:.

Вводиться: 12. Умови · 32. Магічні методи

Ітератор iterator

Крихітний обʼєкт-обхідник, який уміє віддати наступний елемент і запамʼятати, де зупинився. Позиція в ньому тільки росте; повернутись на початок він не вміє принципово.

Саме тому zip, enumerate, map, filter і відкритий файл одноразові: пройдені двічі, вдруге вони не зроблять жодного кроку — і навіть не впадуть. У лекціях трапляється синонім «обхідник».

Вводиться: 35. Ітератори й генератори · 13. Цикли

Ітерований обʼєкт iterable

Джерело, у якого можна попросити ітератор: список, кортеж, рядок, словник, множина, range, файл. Сам він нічого не памʼятає — просто вміє на вимогу видати новий обхідник, який почне з початку.

Питай себе не «чи це працює в for», а «це джерело чи вже обхід». Перевірка одним рядком: iter(список) is iter(список) дає False, а iter(ітератор) is ітератор — True.

Вводиться: 35. Ітератори й генератори · 13. Цикли

кирилицяК

Качина типізація duck typing

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

isinstance як спосіб «пустити чи не пустити» майже завжди зайвий. Формально те саме описує Protocol із теми 34: перевірювач звіряє не походження, а форму.

Вводиться: 31. Наслідування й композиція · 34. Типи (type hints)

Квантифікатор quantifier

Позначка в регулярному виразі, що каже, скільки разів повторюється те, що стоїть перед нею: * — нуль і більше, + — один і більше, ? — нуль або один, {2,5} — від двох до пʼятьох.

За замовчуванням квантифікатор жадібний: бере якнайбільше, а тоді віддає назад, поки решта виразу не зійдеться. Знак питання після нього (+?, *?) робить його ощадним — бере якнайменше. Різниця видна одразу, щойно у тексті трапляється друга така сама дужка чи лапка.

Клас class

Спосіб сказати мові, що в програмі є новий тип даних: ось які поля в ньому обовʼязкові, ось за яких умов він має право існувати, ось що з ним можна робити. Клас — це опис, як креслення; жодного конкретного продажу в ньому немає.

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

Вводиться: 30. Класи й обʼєкти

Клієнт і сервер client and server

Дві ролі в обміні, а не два різні компʼютери. Клієнт питає, сервер відповідає. Та сама машина може бути і тим, і тим — і саме так влаштований навчальний сервер, який ти піднімаєш у себе.

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

Код виходу exit code

Ціле число, яке програма лишає системі, завершуючись: 0 — усе гаразд, будь-що інше — щось пішло не так. Це єдине, що бачить про неї той, хто її запустив.

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

Код стану status code

Трицифрове число в першому рядку відповіді HTTP — те, за чим ухвалює рішення програма (слова поруч, OK чи Not Found, потрібні лише людині). Учити напамʼять нема чого, бо це не список, а система: значення несе перша цифра. 2xx — зробив, що просив; 3xx — воно за іншою адресою; 4xx — запит поганий, винен клієнт; 5xx — запит нормальний, зламався сервер.

Найдорожча плутанина блоку: 404 — це успішно доставлена відповідь, а не помилка Python. Сервер тебе почув і відповів, тому жодного винятку не буде — його треба попросити самому через r.raise_for_status(). І навпаки, ConnectionError чи Timeout означають, що відповіді не було зовсім: коду стану не існує, бо його ніхто не надсилав, і читати нема чого. Практичний наслідок першої цифри: на 4xx повтор дасть те саме, бо міняти треба запит; на 5xx повтор може врятувати.

Вводиться: 27. HTTP-запити · 28. Робота з API

Кодування encoding

Таблиця відповідності між байтами у файлі й символами тексту. Кодування в самому файлі не зберігається — його треба знати наперед і передавати явно: open(..., encoding="utf-8"). Стандарт де-факто — UTF-8, змінної довжини: латиниця займає 1 байт, кирилиця — 2, емодзі — 4.

Без явного encoding Python бере налаштування системи, тому той самий код читає файл по-різному на Linux і на Windows. Тиха біда — мотлох на кшталт «РљРёС—РІ», гучна — UnicodeDecodeError. len() рахує символи, а не байти; файли з Excel часто починаються з мітки BOM, що ламає першу колонку, — це лікує utf-8-sig.

Вводиться: 05. Рядки · 21. Файли й pathlib

Колізія hash collision

Ситуація, коли два різні ключі потрапляють в одну й ту саму комірку хеш-таблиці. Це не збій і не рідкість: комірок скінченна кількість, а ключів може бути скільки завгодно, тож збіги неминучі.

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

Компіляція compilation

Переклад програми з мови, якою пише людина, у форму, придатну до виконання, — до запуску, а не під час нього.

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

Композиція composition

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

Формула для памʼяті: наслідування — «Книга є різновидом Видання», композиція — «Книга має всередині Носій». Композицію варто писати за замовчуванням.

Вводиться: 31. Наслідування й композиція

Конвеєр pipe, pipeline

У командному рядку — вертикальна риска |, що зʼєднує вивід лівої програми з входом правої. У роботі з генераторами — кілька генераторів, зчеплених один з одним, де дані не течуть уперед, а їх тягнуть назад, по одному елементу.

Ідея в обох випадках та сама: жодного проміжного файлу чи списку не існує ніде. У командному рядку конвеєр іноді називають «трубою».

Вводиться: 06. Діалог із користувачем · 26. Скрипти командного рядка · 35. Ітератори й генератори

Копія: поверхнева й глибока shallow / deep copy

Поверхнева копія (a[:], list(a), a.copy()) — новий список із новими комірками, але комірки заповнені тими самими посиланнями. Глибока (copy.deepcopy(a)) обходить структуру рекурсивно й створює новий обʼєкт на кожному рівні вкладеності.

Поки всередині лише рядки й числа, різниці не видно; щойно зʼявиться вкладений список — поверхнева копія «протікає». Правило: лише незмінні елементи — вистачить a.copy(), є вкладені змінювані — потрібен deepcopy.

Вводиться: 07. Списки

Коротке замикання short-circuit evaluation

and і or ліниві: обчислюють лівий операнд і, якщо його достатньо для відповіді, правий не обчислюють узагалі. Звідси головна ідіома захисту — if вимірів != 0 and сума / вимірів > 15.

Вони повертають не True/False, а один із самих операндів — тому введено or 10 тихо замінить чесний нуль на десятку. Якщо питання саме «значення не задали», пиши is None.

Вводиться: 12. Умови

Кортеж tuple

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

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

Вводиться: 08. Кортежі й розпакування

Корутина coroutine

Обʼєкт, який повертає виклик функції, оголошеної через async def: усередині записано, що треба зробити, але ніхто ще не почав це робити. Рецепт, а не страва — виконання починається лише з await.

Курс каже корутина; у темі 35 той самий англійський coroutine перекладено як «співпрограма» — там ідеться про генератор, який уміє приймати значення через send(). Це той самий корінь, але різні механізми, і плутати їх не варто.

Вводиться: 37. Асинхронність — базово · 35. Ітератори й генератори

Крихкий і стійкий селектор brittle / robust selector

Крихкий селектор тримається за форму дерева: div > div > div:nth-child(3) означає «третій блок у другому блоці в першому» і працює рівно до першої зайвої обгортки. Стійкий тримається за сенс: клас price названий так тому, що там ціна, і при перемальовуванні картки його швидше збережуть, ніж вкладеність.

Безсмертного селектора немає — питання лише в тому, чи дізнаєшся ти про поломку. Найгірший результат зламаного скрапера не помилка, а мовчазний порожній список: програма відпрацювала, файл записався, у ньому самий заголовок, і ніхто цього не читає до кінця кварталу. Тому в скрапер вбудовують дешеву перевірку — if len(rows) < 3: raise ValueError(...), — яка перетворює тиху поломку на гучну.

Вводиться: 29. Скрапінг сторінок

кирилицяЛ

Ліміт частоти rate limit

Скільки запитів на хвилину або годину чужий сервіс дозволяє одному клієнтові. Перевищив — отримуєш 429 Too Many Requests, а разом із ним зазвичай заголовок Retry-After: скільки секунд чекати.

Retry-After — не порада, а пряма вказівка: сервер знає краще за тебе, коли твій ліміт відновиться, а ігнорувати його — найшвидший спосіб перетворити тимчасове обмеження на постійне блокування. Найдешевша ввічливість — time.sleep(1.0) у циклі: при ліміті 60 запитів на хвилину це рівно межа й жодної арифметики. Чимало сервісів показують залишок заздалегідь, у заголовку X-RateLimit-Remaining, — пригальмовувати по ньому акуратніше, ніж дочікуватись відмови.

Вводиться: 28. Робота з API

кирилицяМ

Магічний метод magic method, dunder method

Метод із подвійними підкресленнями з обох боків імені (__len__, __eq__, __enter__), за яким стоїть домовленість із мовою: реалізуєш його — і твій обʼєкт починає працювати з len, for, in, + чи with як вбудований тип. Домовленість про те, як метод зветься, що приймає й що повертає, звуть протоколом (protocol).

Ніякої магії немає: len(x) — це коротка форма запису type(x).__len__(x). Шукаються такі методи в класі, а не в примірнику. Англійське dunder (від double underscore) у лекціях трапляється як «дандер-метод», але канонічна назва курсу — магічний метод.

Вводиться: 32. Магічні методи · 35. Ітератори й генератори

Масив array, ndarray

Суцільний блок памʼяті, у якому лежать самі числа одного типу, одне за одним. Не список посилань на розкидані обʼєкти, а рівна стрічка байтів із відомим кроком.

Звідси все інше. Суцільність дає швидкість (процесор читає сусідні комірки наперед) і компактність: мільйон цілих у масиві int64 — 7.63 МіБ проти 34.3 МіБ у списку, бо там до кожного числа ще й посилання. Ціна — один тип на весь масив: покласти поруч число й рядок не вийде.

Маска boolean mask

Масив або стовпець зі значеннями True/False, який повертає порівняння: питання, задане масиву, приходить назад масивом відповідей. Такою маскою індексують — лишаються лише елементи, навпроти яких True.

Умови поєднують &, |, ~ — не and/or/not, — і кожну обовʼязково беруть у власні дужки, бо & звʼязує сильніше за >.

Вводиться: 38. NumPy: масиви · 39. Pandas: таблиці

Менеджер контексту context manager

Обʼєкт, який уміє стояти після with: він знає, що зробити на вході в блок (__enter__) і що зробити на виході (__exit__), причому вихід відбувається завжди — хоч через кінець блоку, хоч через return чи виняток.

with закриває, але не рятує: виняток, що стався всередині, летить далі вгору так само, як без with. Менеджер контексту гарантує прибирання, а не тишу.

Вводиться: 21. Файли й pathlib · 32. Магічні методи · 19. Помилки та винятки

Метод method

Функція, означена в тілі класу й «приклеєна» до обʼєкта: пишеться через крапку після нього — напій.upper(). Відмінність від звичайної функції рівно одна: перший параметр self.

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

Вводиться: 05. Рядки · 30. Класи й обʼєкти

Метод HTTP HTTP method

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

Зі звичайним методом обʼєкта спільне тут лише слово. Два питання, які вирішують усе про метод, — чи він безпечний і ідемпотентний. У стилі REST діє правило «іменник у шляху, дієслово в методі»: адреси на кшталт /getMenu теж трапляються, але там дієслово запхали в шлях, і метод перестає щось означати.

Вводиться: 27. HTTP-запити · 28. Робота з API

Множина set

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

Порожню множину не можна записати як {} — порожні фігурні дужки історично закріплені за словником; єдиний спосіб — set(). Незмінний різновид зветься frozenset і тому може бути ключем словника.

Вводиться: 10. Множини

Модуль module

Файл із розширенням .py; його імʼя — імʼя файлу без .py. Іншого означення немає: будь-який твій файл уже є модулем. Тека з модулями — це пакет (package).

Кожен модуль має власний простір імен (namespace), тому однакові імена в різних файлах не заважають одне одному. Імпорт — це виконання файлу згори вниз, і рівно один раз за запуск: далі модуль беруть із кешу sys.modules.

Вводиться: 17. Модулі й пакети

кирилицяН

Наївний і обізнаний час naive / aware datetime

Наївний datetime має порожнє поле tzinfo: він знає, що написано на циферблаті, і не знає, чий це циферблат, тому не позначає жодної конкретної миті. Обізнаний знає ще й часовий пояс — і тому вказує на мить однозначно.

Порівняння наївного з обізнаним через < дає TypeError, а == тихо повертає False — перевірка мовчки не спрацює жодного разу. Правильне «зараз» — datetime.now(timezone.utc).

Вводиться: 24. Дати й час

Наслідування inheritance

Спосіб оголосити один клас різновидом іншого: похідний клас автоматично отримує методи базового. Оголосити в похідному класі метод із тим самим імʼям — це перевизначення (overriding).

Успадковуються методи, а не дані. Найпоширеніша пастка — написати свій __init__ і не покликати в ньому super().__init__(...): обʼєкт створиться без помилки, а впаде значно пізніше й в іншому місці.

Вводиться: 31. Наслідування й композиція

кирилицяО

Область видимості scope

Ділянка тексту програми, у якій імʼя видиме. Вона визначається текстом, а не ланцюжком викликів: вкладена функція бачить імена тієї функції, у чиє тіло вона записана, а не тієї, що її покликала.

Локальність вирішується наперед: якщо десь у тілі функції є присвоєння імені, воно локальне від першого рядка — звідси UnboundLocalError при спробі спершу прочитати зовнішнє значення. Порядок пошуку описує LEGB.

Вводиться: 16. Аргументи й область видимості

Обʼєкт object

Усе, що живе в памʼяті Python: число, рядок, список, функція й навіть сам тип. Кожен обʼєкт має рівно три речі — тип, значення й ідентичність.

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

Вводиться: 03. Змінні та обʼєкти

кирилицяП

Пагінація pagination

Домовленість віддавати довгий перелік не одним шматком, а сторінками. Разом із самими записами у відповіді приходять службові поля: скільки їх усього (total) і яка сторінка наступна (next). На останній сторінці next дорівнює null, тобто в Python — None: це і є сигнал зупинитись.

Обхід — цикл «поки є next», і в нього обовʼязково вбудовують стелю кроків. Умову виходу тут визначає чужа програма, і помилка на її боці (next починає вказувати сам на себе) перетворює твій цикл на нескінченний, а дізнаєшся ти про це, коли сервіс тебе заблокує. Правило ширше за пагінацію: будь-який цикл, вихід з якого визначає чужа відповідь, має власний лічильник. Буває й пагінація курсором — сервер віддає непрозорий рядок замість номера сторінки; вона не збивається, коли в колекцію під час обходу щось додали.

Вводиться: 28. Робота з API

Пакет package

Тека з модулями, яку Python імпортує як одне ціле: from krama import zvit. Тобто спосіб згрупувати кілька файлів під спільним іменем, коли одного модуля вже мало.

Слово має два значення, і їх плутають щодня. Пакет у мові — це тека з модулями, про яку тут і йдеться. Пакет у pip — те, що ставлять командою pip install, тобто одиниця розповсюдження, і всередині неї може бути кілька мовних пакетів, один модуль або взагалі жодного. Ім’я в pip install і ім’я в import часто різні.

Параметр і аргумент parameter / argument

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

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

Вводиться: 15. Функції · 16. Аргументи й область видимості

Параметризований запит parameterized query

Єдиний правильний спосіб підставити значення в SQL: замість значення в тексті стоїть ?, а саме значення їде окремим кортежем — con.execute("select ... where login=?", (login,)). Є й іменована форма для випадків, коли параметрів багато: :cat у запиті і словник {"cat": "кава"} поруч.

Працює це не через «екранування»: текст запиту й дані база отримує окремо — структуру вона розбирає до того, як побачить значення, і далі вже нізащо не сприйме дані як команду. Звідси й межа: через ? підставляють тільки значення, select * from ? не працює в принципі. Якщо назва стовпця приходить ззовні, її не «екранують», а звіряють зі списком дозволених і кидають ValueError.

Вводиться: 23. Бази даних і SQL

Парсер parser

Програма, яка перетворює плаский текст на структуру: розмітку сторінки — на дерево вузлів, текст JSON — на словники й списки. BeautifulSoup сама розбором не займається: вона зручна обгортка, а парсер їй передають другим аргументом — "html.parser" зі стандартної бібліотеки, "lxml" заради швидкості, "html5lib" для найкривішої розмітки.

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

Вводиться: 29. Скрапінг сторінок

Первинний і зовнішній ключ primary key / foreign key

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

Дві місцеві дрібниці SQLite. integer primary key вона розуміє особливо: такий стовпець стає внутрішнім номером рядка, і при вставці база сама підставить наступне вільне число (дізнатись його — cur.lastrowid). А перевірку зовнішніх ключів за замовчуванням вимкнено: оголошення в create table є, перевірки немає, і замовлення на неіснуючий напій пройде мовчки. Умикає її pragma foreign_keys = on — і робити це треба на кожному зʼєднанні заново, бо налаштування не зберігається у файлі бази.

Вводиться: 23. Бази даних і SQL

Перенаправлення redirect

Відповідь класу 3xx: «того, що ти просиш, за цією адресою немає, але я знаю, де воно» — і заголовок Location із новою адресою. requests іде за ним сам, доки не дійде до відповіді без Location, тому в звичайному коді 301 навіть не видно.

Слід при цьому не зникає: r.url — адреса, за якою відповідь отримано насправді, а не та, яку ти просив; r.history — список проміжних відповідей; allow_redirects=False зупиняє похід і віддає сам 301. Різниця між кодами не косметична: 301, 302 і 303 дозволяють змінити метод (POST може стати GET), а 307 і 308 — ні.

Вводиться: 27. HTTP-запити

Підказка prompt

Текст у дужках input("Скільки зошитів? ") — те, що програма друкує перед тим, як зупинитись і чекати. Технічно це рівно print(підказка, end=""), тому курсор лишається в тому самому рядку, і людина друкує відповідь одразу після знака питання.

Підказка — не просто повідомлення, яке програма показує принагідно: це вся документація твоєї програми, іншої в неї немає, бо людина не читатиме код. Звідси чотири правила: пробіл у кінці; одиниці виміру в дужках («Ціна за штуку (грн): »); приклад формату замість опису («Дата (2026-09-01): »); перелік допустимих відповідей, якщо їх мало («Продовжити? (так/ні): »). Погана підказка не просто незручна — вона породжує помилки, які потім доводиться ловити.

Вводиться: 06. Діалог із користувачем

План запиту query plan

Відповідь бази на питання «як ти збираєшся це виконувати». Показує її explain query plan, який самого запиту не виконує; текст плану лежить у четвертому полі рядка (row[3]). Два слова, заради яких у нього й дивляться: SCAN — «перегляну всю таблицю», SEARCH ... USING INDEX ... — «піду через індекс».

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

Вводиться: 23. Бази даних і SQL

Позиційний і іменований аргумент positional / keyword argument

Позиційний передають без імені, і все вирішує порядок. Іменований передають із явною вказівкою параметра — оформити(товар="мед", кількість=3), — і порядок йому байдужий.

Усі позиційні мають стояти перед усіма іменованими, інакше SyntaxError. Переставлені позиційні аргументи часто дають не помилку, а мовчки неправильну відповідь, тому булеві прапорці й числа-налаштування варто іменувати завжди.

Вводиться: 16. Аргументи й область видимості

Поліморфізм polymorphism

Один і той самий виклик працює з різними типами, і кожен відповідає по-своєму. len() однаково питає довжину в рядка, списку й словника, хоча всередині вони влаштовані зовсім різно.

У Python це не про наслідування. У багатьох мовах поліморфізм вимагає спільного предка; тут достатньо, щоб обʼєкт мав потрібний метод. Тому два класи, не повʼязані нічим, однаково лягають у sorted(), якщо обидва вміють __lt__.

Порт port

Число від 0 до 65535, що каже, яка саме програма на машині має отримати дані. Адреса вказує на компʼютер, порт — на службу всередині нього.

Аналогія, яка тримається: адреса — це будинок, порт — номер квартири. Тому в 127.0.0.1:8000 перше — «куди», друге — «до кого». Типові номери (80 для HTTP, 443 для HTTPS) браузер підставляє сам, і саме тому в звичайних посиланнях порту не видно.

Представлення словника dict view

Те, що повертають .keys(), .values() і .items() — не списки й не копії, а живі вікна в той самий словник: змінити через них нічого не можна, зате вони самі оновлюються разом зі словником.

Англійською це теж view, як і вигляд масиву NumPy, але поводяться вони по-різному: представлення тільки читає, а у вигляд можна писати — і запис дійде до оригіналу. Щоб отримати застиглу копію, пиши list(книга.keys()).

Вводиться: 09. Словники

Примірник instance

Конкретний обʼєкт, зроблений за описом класу. Щоб його отримати, клас викликають, як функцію: Продаж("кава", 3, 90.0). Один клас — скільки завгодно примірників, кожен зі своїми даними, але з одним спільним набором правил.

Канонічна назва курсу — примірник; «екземпляр» та «інстанс» трапляються в інших текстах, але тут їх не вживають.

Вводиться: 30. Класи й обʼєкти

кирилицяР

Простір імен namespace

Набір імен, доступних у певному місці програми, разом із тим, на що вони вказують. Кожен модуль має свій; тому math.pi і numpy.pi мирно співіснують, не переплутавшись.

Не плутай з областю видимості. Простір імен — це сховище «ім’я → об’єкт». Область видимості — правило пошуку, у яких сховищах і в якому порядку шукати ім’я, написане в коді. Перше відповідає на «що там лежить», друге — на «де шукати».

Протокол protocol

Домовленість про те, які методи має обʼєкт, щоб із ним працювала певна вбудована можливість мови. Є __len__ — працює len(); є __iter__ — працює for; є __lt__ — працює sorted().

Протокол ніде не оголошують. Немає рядка «цей клас підтримує ітерацію» — є лише наявність методу. Тому Python і не питає, від кого клас успадкований: він питає, що клас уміє. Це та сама якісна типізація, тільки з боку мови, а не з боку твого коду.

Регресія regression

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

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

Вводиться: 20. Тестування з pytest

Регулярний вираз regular expression

Крихітна мова, якою описують форму тексту, а не сам текст. Потрібна тоді, коли перелічити всі варіанти неможливо: «усі числа», «дата у трьох форматах», «правильний телефон».

Шаблон завжди пишуть сирим рядком (raw string) — r"\d+", — щоб зворотні скісні дійшли до модуля re недоторканими. Вкладені структури (HTML, JSON, дужки) регулярний вираз не описує принципово. У розмові кажуть «регулярка».

Вводиться: 25. Регулярні вирази

Ресурс resource

Річ, яку називає адреса в API: /menu — усе меню, /menu/2 — друга позиція, /orders/4417/items — позиції замовлення 4417. А що з цією річчю робити, каже не адреса, а метод.

Дві дрібниці, які видають правильно зроблений сервіс. Створення нового ресурсу він підтверджує кодом 201 Created, а не 200 OK: обидва означають успіх, але 201 каже більше. І адресу новоствореного кладе в заголовок Location — бо id вигадує сервер, а не ти, і це офіційний спосіб його дізнатися.

Вводиться: 28. Робота з API

Рефакторинг refactoring

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

Чому це поруч із тестами. «Без зміни поведінки» — обіцянка, яку треба чимось підкріпити, інакше рефакторинг не відрізнити від внесення помилок. Тести і є тим підкріпленням: зелені до правки, зелені після — поведінка збереглася. Саме тому в циклі «червоне → зелене → рефакторинг» третій крок стоїть після зеленого, а не до нього.

Розпакування unpacking

Кілька імен ліворуч від = отримують елементи послідовності по порядку: широта, довгота = точка. Зворотна дія, коли значення через кому самі збираються в кортеж, зветься пакуванням.

Кількості мусять збігтися, і Python перевіряє це наперед — після невдалого розпакування жодне імʼя не встигає отримати значення. Імʼя із зірочкою (*середина) забирає решту й завжди у список.

Вводиться: 08. Кортежі й розпакування · 16. Аргументи й область видимості

Рядок string, str

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

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

Вводиться: 05. Рядки

кирилицяС

Серіалізація serialization

Перетворення обʼєкта Python на текст, який можна покласти у файл чи послати мережею, і назад. У модулі json це чотири функції: dumps/loads працюють із рядком у памʼяті, dump/load — із відкритим файлом.

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

Вводиться: 22. CSV і JSON

Сирий рядок raw string

Рядок із префіксом r, у якому Python не обробляє зворотні скісні: r"\d" — це два символи, скісна й «d», а не спроба екранування.

Навіщо саме в регулярних виразах. Там скісна — робочий символ, і без префікса виходить два шари екранування підряд: спершу її зʼїдає Python, потім те, що лишилось, читає re. Тому "\\d" і r"\d" дають одне й те саме, але друге читається. Перевірити, що дійсно дісталось модулю, можна одним print(шаблон).

Складність complexity, O-нотація

Спосіб сказати, як росте кількість роботи зі зростанням обсягу даних. O(1) — стала кількість дій незалежно від довжини; O(n) — пропорційно довжині.

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

Вводиться: 07. Списки · 11. Яку структуру обрати

Скрапінг scraping

Читання сторінки, зробленої для людських очей, заради даних, які заховані в ній між тегами. Від to scrape, «зішкрібати»: ми зішкрібаємо корисне з оформлення, у яке його загорнули.

Скрапінг — останній засіб, і причина інженерна, а не моральна. Порядок пошуку даних такий: офіційний API, готовий експорт у CSV, портали відкритих даних — і тільки потім скрапінг. API ламається рідко й голосно, бо поле name — це обіцянка; скрапер ламається часто й тихо, бо клас name існує, щоб зробити текст жирним, і зникне того дня, коли дизайнер перемалює картку. Перевірка «а чи точно немає API» — вкладка «Мережа» у браузері — окупається найчастіше з усього, що є в темі.

Вводиться: 29. Скрапінг сторінок

Словник dictionary, dict

Набір пар «ключ → значення», який відповідає на питання «що записано під цим іменем» приблизно за один крок незалежно від розміру. Ключі в межах словника унікальні, значення — будь-які.

Список нумерує позиції, словник іменує вміст. З Python 3.7 словник гарантовано віддає ключі в порядку вставки — це саме порядок додавання, а не сортування.

Вводиться: 09. Словники

Список list

Упорядкована змінювана послідовність посилань, записана у квадратних дужках через кому. Комірка не вміщує елемент — вона вказує на обʼєкт, який живе окремо в памʼяті.

Саме тому список може тримати різнотипні значення: усі комірки однакові за розміром. Методи, що працюють на місці (append, sort, reverse), повертають None — їх викликають окремим рядком, без присвоєння.

Вводиться: 07. Списки

Спорідненість типу type affinity

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

Тому "25" у стовпці integer стане числом 25, а не текстом — це не помилка, а правило, і саме цього нам бракувало у CSV. Зворотний бік того самого правила: "двадцять пʼять" ляже в числовий стовпець текстом, наступний select поверне звідти str, і арифметика над цінами впаде з TypeError десь зовсім в іншому місці програми. Хочеш суворості — оголошуй таблицю як STRICT; у PostgreSQL текст у числовий стовпець не пройде ніколи.

Вводиться: 23. Бази даних і SQL

Стандартні потоки stdin, stdout, stderr

Три канали звʼязку зі світом, які має кожна програма в терміналі: stdin — звідки вона читає вхідні дані, stdout — куди пише результат роботи, stderr — куди пише повідомлення про перебіг і помилки. Звичайний print пише в stdout; у другий потік — print(..., file=sys.stderr).

Курс не перекладає ці три імені: читач зустріне їх саме так — у коді, у документації й у самому терміналі. Правило, яке відрізняє акуратний скрипт від неохайного: у stdout іде тільки результат, усе інше — у stderr, бо наступна програма в конвеєрі не має способу відрізнити твій дружній заголовок від даних. Підказка input() теж іде в stdout, тому при > out.txt вона опиняється у файлі разом із результатом.

Вводиться: 26. Скрипти командного рядка · 06. Діалог із користувачем

Стек викликів call stack

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

Саме цю стопку ти бачиш у traceback. Тим самим стеком піднімається виняток: Python питає кожен кадр, чи є там відповідний except.

Вводиться: 15. Функції · 19. Помилки та винятки

кирилицяТ

Таймаут timeout

Межа очікування, яку виставляють кожному мережевому запиту: requests.get(url, timeout=5). Без неї програма одного дня зависне назавжди — мережа має властивість, якої немає в диска: вона може не відповісти й не відмовити.

Тонкість, через яку таймаут ставлять не туди: це не обмеження на весь запит, а межа тиші — скільки чекати наступної порції даних. Сервер, який щосекунди надсилає по байту, з timeout=5 не обірветься ніколи. Форма timeout=(3, 10) задає окремо зʼєднання й читання. Коли межу перевищено, летить requests.exceptions.Timeout — ловити достатньо його, бо ConnectTimeout і ReadTimeout його нащадки.

Вводиться: 27. HTTP-запити

Термінал і оболонка terminal and shell

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

Тому «відкрий термінал» і «виконай у bash» — не синоніми: терміналів кілька (Terminal, iTerm, Windows Terminal), оболонок теж (bash, zsh, PowerShell, cmd), і одна працює в іншій. Різниця стає відчутною, щойно команда працює в одній оболонці й не працює в іншій.

Тернарний вираз conditional expression

Коротка форма розвилки, коли треба обрати одне з двох значень: значення_якщо_істина if умова else значення_якщо_хиба. Це вираз: він має значення, тому його можна присвоїти, передати аргументом чи покласти в список.

Правило, що знімає головну плутанину з включеннями: else буває тільки в тернарі, тож якщо else є — конструкція мусить стояти перед for; якщо немає — if іде після for і працює як фільтр.

Вводиться: 12. Умови · 14. Спискові включення

Тип type

Сорт, до якого належить обʼєкт, і набір того, що з ним можна робити; показує його type(x). Тип належить обʼєкту, а не імені — це й називають динамічною типізацією.

Динамічна типізація дає свободу, але типів не скасовує: "вік: " + 30 не «якось приведеться», а зупинить програму з TypeError.

Вводиться: 03. Змінні та обʼєкти

Токен token, Bearer

Довгий випадковий рядок, який сервіс видає один раз і який ти прикладаєш до кожного запиту в заголовку: {"Authorization": "Bearer demo-token"}. Слово Bearer («предʼявник») — це схема автентифікації, а не частина ключа: хто предʼявив рядок, той і має доступ, і тому токен рівносильний паролю.

Дві відмови на вигляд однакові, а лікуються протилежно: 401 — «я не знаю, хто ти» (ключа немає або сервер його не впізнав, треба виправити ключ), 403 — «я знаю, хто ти, і тобі сюди не можна» (ключ чинний, бракує прав, треба просити доступ). Міняти ключ на такий самий після 403 марно. Сам токен тримають поза кодом, у змінній оточення (os.environ["CAFE_TOKEN"]), а файл .env вписують у .gitignore: git памʼятає історію, і прибрати ключ наступним комітом не досить. Токен в адресі (?token=…) — найгірший варіант: адресу цілком записує в журнал і сервер, і кожен проксі по дорозі.

Вводиться: 28. Робота з API

Транзакція transaction, commit / rollback

Набір змін, який застосовується цілком або ніяк. Усе, що виконано після попереднього commit(), база тримає окремо; commit() фіксує це остаточно, rollback() повертає базу в стан на момент останньої фіксації. Саме цього не вміє файл: інша програма ніколи не побачить базу з половиною змін.

Забути commit() — найчастіша помилка новачка, і вона мовчазна: програма відпрацює, надрукує «збережено» — і не збереже нічого, бо незафіксовану транзакцію відкотять на close(). А рефлекс із файлів тут підводить: with con: — це межа транзакції, а не файлу. Успішний вихід робить commit, виняток усередині — rollback, зате зʼєднання лишається живим, і закривати його доводиться самому.

Вводиться: 23. Бази даних і SQL

Транслювання broadcasting

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

«Розтягування» — фігура мови: NumPy нічого не копіює, а просто ходить по тій самій памʼяті кілька разів, тому транслювання безкоштовне за памʼяттю. Будь-яке інше поєднання дає ValueError.

Вводиться: 38. NumPy: масиви

кирилицяФ

Фікстура fixture

Функція з декоратором @pytest.fixture, результат якої тест просить просто за іменем параметра; так кілька тестів дістають ту саму заготовку, не копіюючи підготовку.

Ключова властивість — фікстура виконується заново для кожного тесту, тому перший тест не зіпсує дані другому. Треба прибрати за собою — пиши yield замість return.

Вводиться: 20. Тестування з pytest

Функція function

Імʼя, почеплене на шматок коду: ти один раз описуєш дію, а далі згадуєш її імʼям. Рядок def не виконує тіло — він лише створює обʼєкт-функцію й вішає на нього ярлик.

Головна вигода не в економії рядків, а в тому, що правило записане в одному місці. Функція без return тихо повертає None; правило курсу — функція рахує й повертає, а друкує той, хто її викликав.

Вводиться: 15. Функції

кирилицяХ

Хеш і хешованість hash, hashability

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

Змінювані типи хеша не мають узагалі — це свідома заборона, а не забудькуватість. Кортеж хешований тоді й лише тоді, коли хешовані всі його елементи на будь-якій глибині; повідомлення unhashable type: 'list' називає винуватця всередині.

Вводиться: 08. Кортежі й розпакування · 09. Словники · 32. Магічні методи

кирилицяЦ

Цикл loop

Повторення тіла для кожного елемента (for) або доки істинна умова (while). Головна відмінність for у Python від інших мов: він нічого не рахує, а просить у джерела наступний елемент.

for i in range(len(...)) з наступним дані[i] — майже завжди ознака звички з іншої мови. Найдорожча пастка теми — видаляти елементи зі списку, який зараз обходиш: один елемент мовчки проскочить повз.

Вводиться: 13. Цикли

Цикл подій event loop

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

Задачі поступаються керуванням добровільно — рівно там, де написано await, і більше ніде; це називають кооперативною багатозадачністю. У лекціях трапляється й порядок слів «подієвий цикл» — канонічний варіант курсу «цикл подій».

Вводиться: 37. Асинхронність — базово

кирилицяЧ

Часовий пояс time zone

Правило, що звʼязує показ годинника в певному місці з єдиним світовим часом (UTC). Не просто «плюс дві години»: правило містить і зсув, і дати, коли він міняється.

Чому це не константа. Пояс Європа/Київ — це не «+2»: улітку він +3, а дати переходу задає закон і час від часу міняє. Тому програма не має зберігати зсув — вона зберігає назву поясу (Europe/Kyiv) і питає в бази часових поясів щоразу. Саме тому база tzdata оновлюється, як антивірусні бази.

Число з рухомою крапкою float

Тип для дробових чисел: 64 біти за стандартом IEEE 754. У памʼяті лежить не саме число 0.1, а найближче до нього, яке взагалі можна записати 64 бітами — тому 0.1 + 0.2 дає 0.30000000000000004.

Це властивість формату, а не Python: ті самі цифри видадуть JavaScript, C, Java, Go і Excel. Порівнюють такі числа через math.isclose, а точні гроші рахують у Decimal, створеному з рядка.

Вводиться: 04. Числа й арифметика

Чиста функція pure function

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

Чисту функцію перевіряють одним рядком assert; нечисту доводиться перехоплювати. Тому розрахунок і побічні дії тримають у різних функціях. Кешувати (lru_cache) можна теж лише чисту.

Вводиться: 15. Функції

кирилицяШ

Шлях path

Адреса файлу чи теки. Абсолютний шлях рахується від кореня файлової системи й працює звідки завгодно; відносний — від поточної теки. У pathlib шлях перестає бути рядком і стає обʼєктом Path, який знає власну будову.

Path нічого не читає з диска: Path("немає-такого.txt") створюється без скарг, бо це просто обʼєкт із текстом усередині. Плутанина з поточною текою породжує більшість перших помилок «файл не знайдено».

Вводиться: 02. Встановлення й перший запуск · 21. Файли й pathlib

кирилицяЯ

Якір anchor

Позначка в регулярному виразі, яка не збігається з жодним символом, а описує позицію між символами: ^ — початок, $ — кінець, \b — межа слова. Тому в неї нульова ширина.

Якорі — головний спосіб не знайти зайвого: r"\d{4}" зловить і рік, і номер замовлення, а r"^\d{4}" — лише рік.

Вводиться: 25. Регулярні вирази

латиницяA

API application programming interface

Домовленість про те, як одна програма звертається до іншої. Слово ширше за мережу — у list.append() теж API, — але в цьому блоці йдеться про вебʼAPI: інтерфейс, до якого ходять по HTTP і який відповідає даними, а не версткою.

Курс не перекладає абревіатуру: українського відповідника, коротшого за «програмний інтерфейс застосунку», немає, а читач зустріне саме API — у документації, в адресах і в назвах розділів. Виграш API рахується не в байтах, а в кроках: зі сторінки ціна приходить рядком "25 грн", а з API — числом 25, бо у JSON є типи. Тому правило просте: якщо для потрібних даних є API — бери API, а скрапінг лишай на потім.

Вводиться: 28. Робота з API

латиницяC

*args і **kwargs args and kwargs

Два записи, що дозволяють функції прийняти скільки завгодно аргументів: *args збирає зайві позиційні в кортеж, **kwargs — зайві іменовані у словник.

Імена args і kwargs — просто домовленість; сенс несуть зірочки, і назвати можна як завгодно. Ті самі зірочки працюють і в зворотному напрямку — на боці виклику вони не збирають, а розкладають: f(*список) роздає елементи по позиціях, f(**словник) — по іменах.

assert assert

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

Це не заміна перевіркам даних. Запуск із python3 -O викидає всі assert зовсім — тож на них не можна тримати перевірку введення користувача чи прав доступу. Їхнє місце — твердження про власний код: «на цьому кроці список уже відсортований».

BeautifulSoup BeautifulSoup

Бібліотека, що перетворює HTML-текст на дерево вузлів, яким можна ходити запитами: знайти всі <h3>, узяти сусіда, витягти текст.

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

Content-Type Content-Type

Заголовок, яким сервер каже, що саме він надіслав: application/json, text/html, image/png. Байти самі собою типу не мають — тип оголошують.

Найчастіша пастка новачка. Код 200 не означає «прийшло те, що я просив»: сервер міг віддати сторінку помилки або форму входу — теж успішно, теж із кодом 200, але з text/html замість JSON. Тому перед розбором дивляться саме на цей заголовок, а не лише на код стану.

CSS-селектор CSS selector

Мова, якою верстальник описує, до яких вузлів застосувати стиль, — і той самий спосіб знайти вузол при розборі сторінки. h3 — усі теги h3; .name — усі вузли з класом name; #page — вузол із таким ідентифікатором; h3.name — тег із класом. У BeautifulSoup це select (список) і select_one (перший збіг або None).

Головна пара, заради якої селектори й вивчають: пробіл означає «десь усередині, на будь-якій глибині» (.menu .name), а стрілка — «безпосередньо всередині, рівно один рівень» (.menu > article). Стрілка точніша й саме тому крихкіша: досить обгорнути вміст ще одним <div>, і вона перестане знаходити будь-що.

Вводиться: 29. Скрапінг сторінок

CSV comma-separated values

Текстовий формат для таблиці: один рядок файлу — один рядок таблиці, поля розділені комою, а перший рядок зазвичай шапка з назвами стовпців.

Розібрати рядок CSV через split(",") не можна: поле з комою всередині беруть у лапки, і наївний поділ ламається тихо, зсувом стовпців. Excel в українській локалі ставить не кому, а крапку з комою — це задають через delimiter=";".

Вводиться: 22. CSV і JSON

латиницяD

dataclass dataclass

Декоратор @dataclass зі стандартного модуля dataclasses, який читає перелік анотованих полів класу й дописує за тебе __init__, __repr__ і __eq__.

Українського відповідника курс не вигадує: «клас даних» ніде не вживається, а англійське слово збігається з іменем декоратора в коді. Змінюване значення за замовчуванням (теги: list = []) він відхиляє одразу, з ValueError.

Вводиться: 33. Dataclass і сучасний стиль

DataFrame DataFrame

Таблиця як один обʼєкт: рядки, іменовані стовпці, у різних стовпцях різні типи. Один стовпець окремо — це Series: послідовність значень одного типу плюс мітка для кожного.

Усередині кожного стовпця живе звичайний масив NumPy, тому арифметика над стовпцями векторна й швидка. Той самий запис таблиця[...] означає то «дай стовпець» (усередині назва), то «дай рядки» (усередині маска).

Вводиться: 39. Pandas: таблиці

латиницяE

dtype dtype

Тип елементів масиву — один на весь масив: int64, float64, bool. Задає і те, що можна зберігати, і скільки байтів займає кожне число.

Три наслідки, які помічають не одразу. Переповнення: int8 мовчки обертає 127 + 1 на −128. Точність: у float32 на мантису відведено 23 біти замість 52. І дірки: nan існує лише серед дробових, тож масив із пропусками завжди дробовий.

EAFP і LBYL EAFP / LBYL

Два стилі поводження з можливою бідою. EAFP (Easier to Ask Forgiveness than Permission) — дій одразу, а якщо не вийшло, обробляй виняток; це стиль Python за замовчуванням. LBYL (Look Before You Leap) — спершу перевір умову, потім дій.

EAFP краще там, де між перевіркою й дією щось може змінитись (файли, мережа, спільні дані). LBYL доречний, коли перевірка дешева й ти перевіряєш власний аргумент.

Вводиться: 19. Помилки та винятки

латиницяF

f-рядок f-string

Літера f перед лапками вмикає підстановку виразів у фігурних дужках: f"{місто}: {товар} коштує {ціна} грн". Усередині дужок може стояти будь-який вираз, не лише імʼя.

Гібридна назва курсу: перекладати string тут є чим, а літеру f — ні. f"{ціна=}" друкує одразу й вираз, і значення — найшвидший спосіб налагодження. Але f-рядком ніколи не збирають SQL, HTML чи команду оболонки з даних від людини.

Вводиться: 05. Рядки

Figure і Axes Figure, Axes

Figure — аркуш паперу: розмір, тло, роздільність, збереження у файл; сам він нічого не малює. Axes — накреслена на аркуші система координат, уся область побудови; малює саме вона: ax.plot, ax.set_title.

Найпідступніша назва в бібліотеці: Axes — це не «осі» в множині. Осі — це Axis (ax.xaxis, ax.yaxis), а Axes — уся область разом з ними.

Вводиться: 40. Графіки matplotlib

латиницяG

GIL Global Interpreter Lock

Глобальне блокування інтерпретатора: один замок на весь CPython, який гарантує, що байткод у кожен момент виконує рівно один потік.

Наслідок: потоки не прискорюють обчислення, скільки б ядер не було. Обійти GIL можна процесами (multiprocessing) — тому процеси для обчислень, потоки для очікувань. До асинхронності це не має стосунку: там потік один.

Вводиться: 01. Що таке програмування і навіщо Python · 37. Асинхронність — базово

латиницяH

HTML HyperText Markup Language

Мова розмітки, якою описують сторінку для очей. Файл плаский, а описує він дерево, і саме як дерево з ним треба працювати. Чотири поняття, яких вистачить на всю тему: тег — назва в кутових дужках, здебільшого парна (<h3>…</h3>); атрибут — іменована властивість у відкривному тезі (class="name"); вкладеність — теги один в одному; текст — усе, що не тег.

Саме через вкладеність HTML розбирають парсером, а не регулярним виразом: HTML не є регулярною мовою, а шаблон — машина зі скінченною памʼяттю, яка принципово не вміє рахувати рівні. Атрибут class особливий — він може містити кілька імен через пробіл; у BeautifulSoup його передають як class_, бо слово class у Python зайняте під оголошення класу.

Вводиться: 29. Скрапінг сторінок

HTTP HyperText Transfer Protocol

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

Назва історична: сьогодні HTTP возить не лише гіпертекст, а будь-що — таблиці, картинки, платежі. Постійного «підключення до сайту» не існує: те, що сайт «памʼятає» твій вхід, означає лише, що браузер щоразу докладає до запиту той самий розпізнавальний рядок. У стандартній бібліотеці для HTTP є urllib.request, але мовою реального коду став сторонній пакет requests.

Вводиться: 27. HTTP-запити

латиницяJ

ISO 8601 ISO 8601

Міжнародний стандарт запису дати й часу: 2026-09-08T14:30:00+03:00. Спершу найбільша одиниця, потім менші, зсув поясу в кінці.

Чому саме такий порядок — не смак. Записані так дати сортуються як звичайні рядки: «2026-01-02» менше за «2026-01-10» і за абеткою, і за календарем. Формат «02.01.2026» цієї властивості не має, і саме тому в обміні даними та в іменах файлів уживають ISO.

JOIN inner join, left join

Оператор SQL, який зшиває дві таблиці за умовою: from drinks join orders on orders.drink_id = drinks.id читається як «візьми меню, приший до нього замовлення там, де номери збігаються». Потрібен він тому, що дані розкладають по таблицях: кожен факт живе рівно в одному місці, а звʼязок іде через ключ.

Звичайний join (повна назва — inner join, «внутрішній») лишає тільки рядки, для яких пара знайшлася з обох боків: напій, якого ніхто не замовляв, у відповідь не потрапить. А питання «які напої не замовляють?» цілком осмислене — для нього є left join: він бере всі рядки лівої таблиці, а там, де пари немає, підставляє null. Курс не перекладає слово: це оператор, який пишуть у запиті.

Вводиться: 23. Бази даних і SQL

JSON JavaScript Object Notation

Текстовий формат для дерева: усередині запису може лежати список, усередині списку — ще словники, і так на будь-яку глибину. Виглядає майже як словник Python.

Синтаксис суворіший, ніж здається: тільки подвійні лапки, жодних коментарів, жодної коми після останнього елемента, true/false/null маленькими. Для українського тексту у файлі потрібен ensure_ascii=False.

Вводиться: 22. CSV і JSON

латиницяL

LEGB LEGB rule

Порядок, у якому Python шукає імʼя: Local — локальна памʼять виклику, Enclosing — памʼять зовнішньої функції-обгортки, Global — рівень модуля, Built-in — вбудовані імена.

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

Вводиться: 16. Аргументи й область видимості

латиницяM

match structural pattern matching

Конструкція для розбору форми значення, а не лише його рівності: зіставляє обʼєкт зі зразками й одночасно витягає з нього частини. Доступна з Python 3.10.

Не плутай зі switch з інших мов. Той порівнює значення; match порівнює структуру — може розібрати кортеж, список чи обʼєкт на складники й тут же привʼязати їх до імен. Тому ланцюжок elif замінює не завжди: там, де порівнюються прості рівності, звичайний elif читабельніший.

MRO method resolution order

Плаский список класів без повторів, яким Python іде зліва направо, шукаючи метод чи будь-який атрибут класу; береться перший знайдений. Побачити його можна через Клас.__mro__.

Українською це «порядок розвʼязання методів», але курс уживає абревіатуру: розгорнута назва довша за саме поняття. super() означає не «мій батько», а «наступний клас у MRO».

Вводиться: 31. Наслідування й композиція

латиницяN

NamedTuple NamedTuple

Кортеж, у якого поля мають імена: замість запис[2] пишеться запис.довгота. Лишається кортежем — незмінний, хешований, розпаковується.

Коли обирати його, а не dataclass. Потрібна незмінність і дешевизна, а поведінки майже немає — бери NamedTuple. Потрібні методи, значення за замовчуванням через default_factory, тонке налаштування полів — dataclass. Головна різниця не в записі, а в тому, що кортеж порівнюється з іншими кортежами й розпаковується, а обʼєкт — ні.

NaN not a number

Особливе значення для дірок у дробових даних — «не число». Воно заражає все, чого торкнеться: одна дірка перетворює середнє всього масиву на nan.

nan не дорівнює сам собі, тому шукати дірки порівнянням марно — для цього є np.isnan і isna(). У цілочисельному масиві його зберегти неможливо, тому стовпець із пропуском завжди стає дробовим.

Вводиться: 38. NumPy: масиви · 39. Pandas: таблиці

None None

Не «порожнеча», а конкретний обʼєкт єдиного свого роду з типом NoneType, який означає «тут значення не передбачене». Його повертає будь-яка функція без return.

Перевіряють через is None, а не == None: None існує в програмі в єдиному примірнику (такий обʼєкт звуть одинаком, singleton), а == — це виклик методу, який клас може перевизначити як завгодно.

Вводиться: 15. Функції · 12. Умови

латиницяP

PEP 8 PEP 8

Офіційна угода спільноти про вигляд коду: чотири пробіли на відступ, пробіли навколо = та знаків дій, імена малими_літерами_з_підкресленнями (стиль snake_case), порожній рядок між логічними частинами.

Не вчи напамʼять — форматувальники black чи ruff format приведуть файл до канону однією командою.

Вводиться: 02. Встановлення й перший запуск · 03. Змінні та обʼєкти

pip pip

Менеджер пакетів Python: ходить у сховище PyPI, завантажує пакет, розпаковує його в site-packages і повторює те саме для всіх залежностей.

Форма python -m pip знімає всі питання про те, чий саме pip спрацював. Через sudo pip не запускають ніколи; відмова externally-managed-environment — це не поломка, а натяк створити віртуальне середовище.

Вводиться: 18. Віртуальні середовища і pip

pytest pytest

Інструмент, яким у Python запускають тести. Головна його ідея — не вигадувати власних перевірок, а зробити розумнішим той самий assert («стверджую, що це істина»): у момент падіння він показує обидві сторони порівняння.

Тести він знаходить сам, за іменами: файли test_*.py, у них функції з test_ на початку. Зворотний бік домовленості — помилився на літеру, і тест не почервоніє, він просто не існуватиме. Сам assert — не заміна перевіркам вхідних даних: python3 -O викидає всі assert із байткоду, тому для даних від користувача пиши raise ValueError.

Вводиться: 20. Тестування з pytest

латиницяR

REPL Read-Eval-Print Loop

Режим діалогу з інтерпретатором: запускається командою python3 без імені файлу й показує >>>. Цикл із чотирьох дій — прочитати рядок, обчислити, надрукувати результат, повторити.

У REPL значення виразу друкується саме собою, а у файлі — ні. Вийти можна exit() або Ctrl+D.

Вводиться: 02. Встановлення й перший запуск

SettingWithCopyWarning SettingWithCopyWarning

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

Чому попередження, а не помилка. pandas сам не завжди знає, вигляд перед ним чи копія: це залежить від того, як саме зроблено вибірку. Тому він не забороняє, а попереджає. Ліки — писати через .loc[рядки, стовпці] = …, тобто одним зверненням замість двох, або явно взяти .copy(), коли копія й потрібна.

Unix-час Unix time

Кількість секунд, що минули від 1 січня 1970 року за UTC. Одне число, у якому немає ні поясу, ні літнього часу — тільки момент.

Чим зручний і чим небезпечний. Зручний тим, що момент однозначний і арифметика на ньому тривіальна. Небезпечний тим, що це не «дата»: щоб показати його людині, потрібен пояс, і без нього число мовчки перетворюється на неправильний день. Правило просте: зберігай момент, показуй у поясі.

__repr__ repr

Метод, який дає текстовий вигляд обʼєкта для того, хто налагоджує код: що це за обʼєкт і що в ньому лежить. Його бачать консоль, repr(x) і контейнери, коли друкують свій вміст.

Робиш один метод — роби саме __repr__: коли __str__ немає, Python бере для print() і f-рядків його, а зворотне неправда. Ідеал — рядок, який можна скопіювати назад у код.

Вводиться: 30. Класи й обʼєкти · 32. Магічні методи

REST representational state transfer

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

Не всі API — REST. Трапляється GraphQL, де адреса одна, а що саме повернути, описуєш ти сам у тілі запиту. Усе інше з теми — заголовки, коди станів, повтори, ліміти — лишається тим самим; міняється лише те, як формулюється питання.

Вводиться: 28. Робота з API

robots.txt robots.txt

Текстовий файл у корені сайту (site.com/robots.txt), у якому власник пише, куди роботам ходити не варто й з якою паузою: Disallow: /admin, Crawl-delay: 1. Читається одним запитом.

Головне про цей файл — те, чим він не є. Це прохання, а не технічний замок: жодної перевірки за ним немає, сервер віддасть закриті сторінки будь-кому, хто їх попросить. Файл існує рівно тому, що автори сайтів і автори роботів колись домовились його поважати. Умови користування — окремий документ, і читати його доводиться очима; а персональні дані лишаються чужими навіть тоді, коли лежали на видноті.

Вводиться: 29. Скрапінг сторінок

латиницяS

self self

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

Забути self в означенні методу — найчастіша перша помилка: виклик падає з TypeError: ... takes 0 positional arguments but 1 was given, бо обʼєкт передався сам, а прийняти його нікому.

Вводиться: 30. Класи й обʼєкти

Session Session

Обʼєкт requests, який тримає відкриті зʼєднання й видає їх наступним запитам до того самого сервера, а заразом зберігає спільні заголовки й cookies. Сорок запитів через Session відкривають одне зʼєднання, сорок окремих requests.get() — сорок.

Курс не перекладає імʼя: читач зустріне його як імʼя класу в коді (with requests.Session() as s:). Доказом користі тут навмисно взято кількість зʼєднань, а не час: у замірі на локальній петлі Session вийшла увосьмеро повільнішою — через давню оптимізацію TCP (алгоритм Нейгла) у парі з відкладеним підтвердженням. Справжній виграш зʼявляється там, де є рукостискання TLS. І дрібниця: requests.get() теж створює Session — на один запит; різниця не в тому, є вона чи ні, а в тому, скільки вона живе.

Вводиться: 27. HTTP-запити

SQL Structured Query Language

Мова, якою ставлять питання базі даних. Головна її риса — декларативність: ти пишеш, що хочеш отримати, а не як це знайти. Порядок частин у запиті суворий: select — які стовпці, from — з якої таблиці, where — які рядки лишити, order by — як упорядкувати, limit — скільки віддати.

Різниця з Python не косметична: рішення, читати таблицю підряд чи піти через індекс, ухвалює планувальник усередині бази — він знає розміри таблиць і наявні індекси, а ти ні. Окремо стоїть порожнє значення: = null писати не можна ніколи, бо null не дорівнює навіть сам собі — тільки is null та is not null.

Вводиться: 23. Бази даних і SQL

SQL-інʼєкція SQL injection

Дані, які втрутились у текст запиту й змінили його зміст. Виникає рівно з однієї причини — запит зібрали f-рядком. Апостроф із введення закриває рядковий літерал, і все, що йде далі, база читає вже не як дані, а як частину запиту.

Найвідоміший приклад '; drop table users; -- у Python не спрацює: execute виконує рівно один оператор і другий не пропускає (ProgrammingError: You can only execute one statement at a time). Побачивши цю помилку, легко зробити хибний висновок «інʼєкцій не буває». Вони бувають — просто виглядають інакше: неіснуючий' OR '1'='1 перетворює умову на «або одиниця дорівнює одиниці» й віддає всі рядки таблиці, разом із адміністратором. Справжня інʼєкція не стирає дані, а краде їх. Ліки одні — параметризований запит.

Вводиться: 23. Бази даних і SQL

SQLite SQLite

База даних, на якій курс усе показує: уся база — один файл, сервера немає (це бібліотека всередині твоєї програми, а не окремий процес), а модуль sqlite3 входить у стандартну бібліотеку. Найімовірніше, це найпоширеніша база на планеті — вона лежить у кожному телефоні й браузері.

Ціна простоти — дві жорсткі межі. Пише завжди хтось один: читачів скільки завгодно, а на час запису база блокується цілком, звідси OperationalError: database is locked. І доступу по мережі немає взагалі — SQLite читає файл, а не ходить до сервера. Тоді беруть PostgreSQL чи MySQL, і вчити все з нуля не доведеться: select, join, group by, індекси й транзакції там ті самі. Дрібниця: друкуй sqlite3.sqlite_version, а не sqlite3.version — останнє застаріле й зникне в Python 3.14.

Вводиться: 23. Бази даних і SQL

латиницяT

traceback traceback

Звіт, який Python друкує, коли виняток не спіймав ніхто: список кадрів, які виняток пролетів наскрізь. Останній рядок — діагноз (тип помилки й пояснення), рядки вище — маршрут, яким програма туди дійшла.

Курс не перекладає це слово: «трасування стека» довше й менш упізнаване, ніж напис, який читач бачить у себе на екрані. Читають traceback з кінця; якщо шапки Traceback (most recent call last) немає — значить, впало ще до старту, тобто це SyntaxError.

Вводиться: 02. Встановлення й перший запуск · 19. Помилки та винятки

латиницяY

yield yield

На відміну від return, який завершує роботу назавжди, yield віддає значення й ставить функцію на паузу: усі локальні змінні й точка зупинки лишаються жити всередині обʼєкта-генератора, і наступний крок продовжує з наступного рядка.

yield from джерело — скорочення для «віддавай назовні все, що дасть це джерело, поки воно не скінчиться».

Вводиться: 35. Ітератори й генератори