Basically covering "how to read your Python code to reason about algorithmic complexity". I would like to reference Ned Batchelder's talk and blog post on this topic: https://nedbatchelder.com/text/bigo.html
Basically covering where and when to use:
- lists: sequences of identically-typed objects
- dictionaries: simple mappings from hashable type to arbitrary objects
- (named) tuples: more complex mappings
- objects: when more complexity is needed
Basically covering the tell-tale signs of when functional programming may be a better choice, and when object-oriented programming may be a better choice, and what to do when the choice isn't crystal clear. (In my biased opinion, stick with functional programming as much as possible.)