Learning Platform
Глоссарий Troubleshooting
Урок 04.06 · 10 мин
Средний
SummarySelf-assessment
Требуемые знания:

Ключевые выводы по функциям и модулям

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
01Function basics + defaultsDefault 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
03Comprehensions / gen-exprList/dict/set comprehension — bytecode-оптимизированы. Generator expression — () вместо [], lazy, O(1) память, single-pass. Aggregates → gen-expr
04Functional tools (PYTH-10)functools.reduce / partial / lru_cache (cache использует dict, args обязаны быть hashable). itertools — zoo lazy combinators. operator module — callable operators быстрее lambda
05Modules / packages / importsModule = .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 пунктов). Проверьте каждое утверждение для себя — если не уверены, перечитайте указанный урок:

  1. ☐ Я могу прочитать def f(*args, **kwargs): и объяснить, какие типы у args и kwargs — и почему именно они выбраны (Урок 2).
  2. ☐ Я могу избежать mutable default trap через None sentinel pattern и объяснить, почему trap происходит на уровне func.__defaults__ (Урок 1).
  3. ☐ Я знаю, когда выбирать list-comp над gen-expr (multi-pass / API contract) и наоборот (агрегаторы) — и понимаю memory implications (Урок 3).
  4. ☐ Я могу написать reduce-based aggregator с initial value и объяснить, почему initial критичен для пустого iterable (Урок 4).
  5. ☐ Я понимаю lru_cache: что args обязаны быть hashable, как cache_info() показывает hits/misses, что внутри — dict (Урок 4).
  6. ☐ Я могу explain в одном предложении, что делают itertools.chain, islice, count, groupby (Урок 4).
  7. ☐ Я могу нарисовать import lookup order: sys.modules cache → sys.path → execute (Урок 5).
  8. ☐ Я понимаю 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 будет проще усваиваться, потому что вы готовы.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 4. Какие конструкции использует выражение `[y for x in data if (y := f(x)) > 0]`?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6