Ключевые выводы по функциям и модулям
Module 03 — последний модуль Phase 65. Мы прошли:
- M01 — primitives (PyLong, PyUnicode/PEP 393, PyFloat/IEEE 754, refcount, geometric reallocation, big-O).
- M02 — структуры данных (PyListObject, PyTupleObject, PyDictObject open addressing + perturbation, PEP 468 compact dict, PySetObject, mutability/cache).
- M03 — функции и модули (defaults trap, *args/**kwargs, comprehensions, functional tools, import machinery).
В Phase 66 (M04-M06) — OOP / iterators / decorators. Этот урок — мост между двумя фазами: synthesis того, что вы освоили, плюс preview того, что впереди.
Что мы узнали в Module 03
| # | Topic | Главный takeaway |
|---|---|---|
| 01 | Function basics + defaults | Default values evaluated один раз at def-time → mutable default trap. Sentinel pattern None + создание внутри. PEP 570 / 3102 markers |
| 02 | *args / **kwargs / unpacking | *args → tuple (immutable, hashable, free-list cache); **kwargs → dict (insertion order). PEP 448 unpacking в literals; PEP 3132 extended unpacking |
| 03 | Comprehensions / gen-expr | List/dict/set comprehension — bytecode-оптимизированы. Generator expression — () вместо [], lazy, O(1) память, single-pass. Aggregates → gen-expr |
| 04 | Functional tools (PYTH-10) | functools.reduce / partial / lru_cache (cache использует dict, args обязаны быть hashable). itertools — zoo lazy combinators. operator module — callable operators быстрее lambda |
| 05 | Modules / packages / imports | Module = .py; Package = dir + init.py. import = execute + cache в sys.modules + bind. if __name__ == '__main__': для dual-purpose script/library |
Cross-module synthesis — связи M01-M03
| Связка | Где |
|---|---|
| Mutable default trap → tuple/dict ARC | Урок 1 ссылается на M02 урок 06 (mutable vs immutable) для понимания, почему shared mutable state опасен |
| *args = tuple → free-list cache | Урок 2 ссылается на M02 урок 02 (PyTupleObject + free-list) для объяснения, почему tuple быстрый для маленьких args |
| **kwargs = dict → insertion order | Урок 2 ссылается на M02 урок 04 (PEP 468 compact dict) для гарантии порядка |
| Gen-expr → iterator protocol | Урок 3 предвосхищает Phase 66 M05 (generators / yield) — gen-expr — это special case generator function |
| lru_cache использует dict → hashable | Урок 4 ссылается на M02 урок 03 (open addressing) — почему args обязаны быть hashable |
| itertools реализованы на iterator protocol | Урок 4 предвосхищает Phase 66 M05 |
| Comprehension bytecode (LIST_APPEND opcode) | Урок 3 связывает с M01 урок 1 (что значит «компилироваться в bytecode») |
Эти cross-references — не случайны: они показывают, что Python — связная система, где знание одного слоя усиливает понимание других.
Что в Phase 66 (M04-M06)
M04 — OOP (4-5 уроков):
- Classes, instances,
__init__,__new__. - Inheritance, MRO (Method Resolution Order),
super(). - Dunder methods:
__eq__,__hash__,__repr__,__str__,__iter__,__add__, и др. - Dataclasses, slots, descriptors.
M05 — Iterators / generators (3-4 урока):
- Iterator protocol:
__iter__+__next__, StopIteration. - Generator functions с
yield. - Generator expressions (раскрытие урока 3 этого модуля).
- itertools под капотом — каждый — small generator.
M06 — Decorators / context managers (3-4 урока):
- Function decorators — closures + functools.wraps.
- Class decorators.
- Parameterized decorators (декораторы-фабрики).
- Context managers:
with,__enter__/__exit__, contextlib.
Self-assessment перед экзаменом
Чек-лист (8 пунктов). Проверьте каждое утверждение для себя — если не уверены, перечитайте указанный урок:
- ☐ Я могу прочитать
def f(*args, **kwargs):и объяснить, какие типы уargsиkwargs— и почему именно они выбраны (Урок 2). - ☐ Я могу избежать mutable default trap через
Nonesentinel pattern и объяснить, почему trap происходит на уровнеfunc.__defaults__(Урок 1). - ☐ Я знаю, когда выбирать list-comp над gen-expr (multi-pass / API contract) и наоборот (агрегаторы) — и понимаю memory implications (Урок 3).
- ☐ Я могу написать reduce-based aggregator с initial value и объяснить, почему initial критичен для пустого iterable (Урок 4).
- ☐ Я понимаю
lru_cache: что args обязаны быть hashable, какcache_info()показывает hits/misses, что внутри — dict (Урок 4). - ☐ Я могу explain в одном предложении, что делают
itertools.chain,islice,count,groupby(Урок 4). - ☐ Я могу нарисовать import lookup order: sys.modules cache → sys.path → execute (Урок 5).
- ☐ Я понимаю rationale
if __name__ == '__main__':и могу объяснить, почему он не исполняется при import (Урок 5).
Если по 7+ пунктам уверенность — переходите к экзамену.
Финальная мысль
Phase 65 — это глубинная фаза. ULTRA-DEEP уроки M01-M02 закладывают MM model: вы знаете, что list — это PyObject** array, dict — это open addressing с perturbation, hashable требует immutability. Этот foundation окупится в M04 (когда __hash__ + __eq__ для custom классов перестанут быть магией) и в M05 (когда iterator protocol будет очевидным extension того, что вы уже видели в M03 урок 3).
Phase 66 будет проще усваиваться, потому что вы готовы.