Teqvault.study β€” Python Series

Phase 1: Python Fast Track

You already code. This is translation, not learning from scratch β€” cover Python's fundamentals in 1–2 weeks and start thinking in the language.

🐍 ⚑ πŸ”₯ ✨ πŸš€
Phase Progress
0%
LESSON 01

Why Python, Honestly

Not because it's trendy. Three structurally independent reasons it's the right language to add in 2026 β€” and what makes it feel different from Java.

🐍 The Real Reasons

Most "why learn Python" articles give you one reason dressed up as ten. Here are three genuinely independent ones:

πŸ€–
AI Ecosystem

The entire ML/AI stack β€” PyTorch, TensorFlow, LangChain, Anthropic SDK, OpenAI SDK β€” is Python-first. Not Python-compatible. Python-first.

πŸ”
Automation Language

When a sysadmin, data analyst, or researcher needs to automate something, they reach for Python. It's become the universal scripting language across every field.

πŸ”—
Tightest AI Loop

AI coding assistants are best at Python β€” more training data, more community examples, better completions. The feedback loop between you and AI is fastest here.

βš–οΈ Python vs Java β€” The Philosophy Gap

Java is designed around explicitness and ceremony β€” you declare types, visibility, and structure up front. Python is designed around readability and speed of expression β€” the structure is still there, it's just not mandatory noise.

Neither is better. They optimize for different things. Understanding the trade-off is what makes you dangerous with both.

Java β€” explicit ceremony
public class Greeter {
  private final String name;

  public Greeter(String name) {
    this.name = name;
  }

  public String greet() {
    return "Hello, " + name + "!";
  }
}
Python β€” expressive brevity
class Greeter:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, {self.name}!"

# Same class. Half the lines.
πŸ—ΊοΈ What's the Same vs What's Different
ConceptJavaPython
VariablesString name = "Jude";name = "Jude"
TypesDeclared, checked at compile timeInferred, checked at runtime (optionally hinted)
Classespublic class Foo { }class Foo:
Methodspublic void foo() { }def foo(self):
Arrays/ListsList<String> itemsitems = [] (dynamic, mixed types)
For-eachfor (String s : list)for s in list:
NullnullNone
PrintSystem.out.println(x)print(x)
Entry pointpublic static void main()Just… run the file. Or if __name__ == "__main__":
SemicolonsRequiredNone. Indentation IS the block structure.
⚠️
The Indentation RulePython uses indentation (4 spaces, not tabs) to define code blocks instead of curly braces. This isn't optional formatting β€” it's syntax. Mis-indent and you get a bug, not a style warning.
🧠 Quick Check
In Python, what defines a code block (like the body of a function or if statement)?
LESSON 02

The REPL β€” Your New Best Tool

The Read-Eval-Print Loop is Python's secret weapon for learning and exploration. It changes how you think about writing code.

⚑ What the REPL Is

In Java, your feedback loop is: write β†’ compile β†’ run β†’ read output β†’ repeat. Each cycle takes seconds to minutes.

In Python, you open a terminal, type python3, and you're instantly in a live environment where every line executes immediately. No compile step. No main method. Just instant feedback.

Terminal β€” python3
>>> 2 + 2
4
>>> name = "Jude"
>>> f"Hello {name}, you're learning Python"
'Hello Jude, you're learning Python'
>>> cities = ["Bossier City", "New Orleans", "Austin"]
>>> [c.upper() for c in cities]
['BOSSIER CITY', 'NEW ORLEANS', 'AUSTIN']
>>> len(cities)
3
πŸ› οΈ How to Use the REPL Effectively
  1. Open a terminal and type python3 (macOS/Linux) or python (Windows). You'll see >>> β€” that's the prompt.
  2. Use the REPL to experiment with any syntax you're unsure about before using it in real code. Faster than googling, faster than writing a test file.
  3. Use help() for any object: help(str) shows all string methods. help("".upper) explains that specific method. Built-in documentation, always available.
  4. Use dir(obj) to see every method and attribute an object has: dir([]) shows everything a list can do.
  5. Use IPython or Jupyter Notebook for a more powerful REPL experience β€” tab completion, syntax highlighting, persistent history.
πŸ’‘
The REPL Mental ModelEvery Java developer who picks up Python should spend their first hour just in the REPL. Type things. Break things. See what happens. The fast feedback loop is what makes Python so fast to learn β€” use it deliberately.
πŸ” REPL Exploration Techniques
Python REPL β€” Exploration Commands
# What type is this object?
type("hello")          # <class 'str'>
type([1, 2, 3])        # <class 'list'>
type(42)               # <class 'int'>

# What can I do with this object?
dir("hello")          # shows ALL string methods

# What does this method do?
help("".split)         # full docstring

# Is this what I think it is?
isinstance(42, int)    # True
isinstance("hi", str)  # True

# Quick test: does this list method modify in place or return?
nums = [3, 1, 2]
result = nums.sort()
print(result)           # None β€” sort() modifies in place!
print(nums)             # [1, 2, 3] β€” the list changed
LESSON 03

Dynamic Typing β€” Feature, Not Bug

Python doesn't require type declarations. That's not sloppiness β€” it's a deliberate design choice. Here's what it means in practice.

πŸ”€ Static vs Dynamic Typing
Java β€” type at declaration
// Type declared at compile time
String name = "Jude";
int age = 25;
// name = 42; ← compile error

List<String> tags = new ArrayList<>();
tags.add("python");
// tags.add(42); ← compile error
Python β€” type at runtime
# Type inferred, checked at runtime
name = "Jude"
age  = 25
# name = 42  ← works! (variable rebinds)

tags = ["python", "unity", 42]
# Mixed types in lists are allowed
# (usually a design smell, but possible)
🧠
Duck Typing"If it walks like a duck and quacks like a duck, it's a duck." Python doesn't care what type an object is β€” it cares whether it has the method you're trying to call. This is the mental model shift that unlocks Python's flexibility.
✍️ Type Hints β€” Optional but Recommended

Python 3.5+ supports optional type annotations. They don't enforce anything at runtime but make your code readable and enable tools like mypy to catch errors before you run the code.

Python β€” Type Hints (use these)
# Without hints β€” valid Python, but hard to read at scale
def process(data, multiplier):
    return data * multiplier

# With hints β€” self-documenting
def process(data: list[int], multiplier: float) -> list[float]:
    return [x * multiplier for x in data]

# Common built-in types
name:    str
age:     int
score:   float
active:  bool
items:   list[str]
scores:  dict[str, int]
maybe:   str | None        # Python 3.10+ union syntax
πŸ’‘
Start with hints immediatelyEven as a beginner, write type hints on every function signature. It forces you to think about what your function actually does, and it makes every course example more readable. This is a habit that separates professional Python from script-kiddie Python.
πŸ§ͺ Python's Basic Types
Python β€” Core Types
# Numbers
x  = 42          # int β€” arbitrary precision!
y  = 3.14        # float
z  = 2 + 3j      # complex (rarely needed)

# Strings β€” immutable sequences of characters
s1 = 'single quotes'
s2 = "double quotes"  # same thing
s3 = """triple quotes
span multiple lines"""

# Booleans β€” note the capitalization
t = True
f = False
print(type(True))   # <class 'bool'>
print(int(True))    # 1 β€” bool is a subclass of int!

# None β€” Python's null
result = None
print(result is None)  # True (use 'is', not '==')

# Truthiness β€” Python evaluates many things as bool
bool(0)       # False
bool("")      # False β€” empty string is falsy
bool([])      # False β€” empty list is falsy
bool(None)    # False
bool(42)      # True β€” any non-zero number
bool("hi")    # True β€” any non-empty string
🧠 Quick Check
Which of these evaluates to False in Python?
LESSON 04

Functions as First-Class Citizens

In Python, functions are objects. You can store them in variables, pass them as arguments, return them from other functions. This changes everything.

🧩 Python Functions vs Java Methods
Python β€” Function Fundamentals
# Basic function β€” no access modifiers, no return type required
def add(a: int, b: int) -> int:
    return a + b

# Default arguments (like Java overloading, but simpler)
def greet(name: str, greeting: str = "Hello") -> str:
    return f"{greeting}, {name}!"

greet("Jude")                   # "Hello, Jude!"
greet("Jude", "What's good")    # "What's good, Jude!"

# Keyword arguments β€” call by name, any order
greet(greeting="Yo", name="Jude")  # "Yo, Jude!"

# Multiple return values (Java can't do this natively)
def min_max(numbers: list[int]) -> tuple[int, int]:
    return min(numbers), max(numbers)

lo, hi = min_max([3, 1, 7, 2])   # lo=1, hi=7
πŸ”₯ Functions as Objects β€” The Key Shift
Python β€” Higher-Order Functions
# Functions are objects β€” store them in variables
def shout(text: str) -> str:
    return text.upper() + "!!!"

transform = shout         # no () β€” storing the function itself
print(transform("hello"))  # "HELLO!!!"

# Pass functions as arguments
def apply_to_list(items: list, func) -> list:
    return [func(item) for item in items]

words = ["python", "java", "rust"]
apply_to_list(words, str.upper)
# ['PYTHON', 'JAVA', 'RUST']

# Lambda β€” anonymous function for simple one-liners
# (like Java's lambda but more concise)
square = lambda x: x ** 2
print(square(5))              # 25

# Sort by custom key using lambda
players = [("Jude", 42), ("Ana", 87), ("Max", 15)]
players.sort(key=lambda p: p[1], reverse=True)
# [('Ana', 87), ('Jude', 42), ('Max', 15)]
🧠
Why This MattersFirst-class functions are the foundation of Python's style. map(), filter(), sorted() β€” all take functions as arguments. Decorators (Phase 2) are functions that wrap functions. This mental model unlocks half of the Python ecosystem.
πŸ”¨ Try It

Function Practice

  • Write a function clamp(value, lo, hi) that returns value clamped between lo and hi.
  • Write a function that takes a list of strings and a function, and returns only the strings where the function returns True.
  • Sort a list of dicts by a specific key using a lambda.
LESSON 05

Lists & Comprehensions

Python's most iconic syntax. List comprehensions collapse loops into single expressive lines β€” once you see it, you can't unsee it.

πŸ“‹ Python's Collection Types
Python β€” Four Core Collections
# List β€” ordered, mutable, allows duplicates
skills = ["java", "python", "unity"]
skills.append("rust")
skills[0]           # "java"
skills[-1]          # "rust" β€” negative indexing!

# Tuple β€” ordered, IMMUTABLE, allows duplicates
point = (3.0, 7.5)   # x, y coordinate β€” won't change
x, y = point         # unpack into variables

# Dict β€” key-value pairs, ordered (Python 3.7+)
player = {"name": "Jude", "hp": 100, "level": 5}
player["hp"]         # 100
player.get("mp", 0)  # 0 β€” safe access with default

# Set β€” unordered, unique values only
seen = {"a", "b", "a", "c"}
print(seen)           # {'a', 'b', 'c'} β€” deduplicated
⚑ List Comprehensions β€” Python's Superpower

A list comprehension creates a new list by applying an expression to each item in an iterable, optionally filtered by a condition. All on one line.

Java β€” verbose loop
List<Integer> squares =
    new ArrayList<>();
for (int n : numbers) {
    if (n % 2 == 0) {
        squares.add(n * n);
    }
}
Python β€” comprehension
squares = [
    n * n
    for n in numbers
    if n % 2 == 0
]

# Or on one line:
squares = [n*n for n in numbers if n%2==0]
πŸ”₯ Comprehension Patterns You'll Use Every Day
Python β€” Comprehension Patterns
# 1. Transform every item
names   = ["jude", "ana", "max"]
upper   = [n.upper() for n in names]
# ['JUDE', 'ANA', 'MAX']

# 2. Filter items
numbers  = [1, 2, 3, 4, 5, 6]
evens    = [n for n in numbers if n % 2 == 0]
# [2, 4, 6]

# 3. Transform and filter together
long_upper = [n.upper() for n in names if len(n) > 3]
# ['JUDE']

# 4. Dict comprehension β€” same idea, for dicts
scores   = {"jude": 85, "ana": 92, "max": 78}
passing  = {k: v for k, v in scores.items() if v >= 80}
# {'jude': 85, 'ana': 92}

# 5. Set comprehension β€” unique results
words    = ["python", "PYTHON", "Java", "java"]
unique_lower = {w.lower() for w in words}
# {'python', 'java'}

# 6. Flatten nested list
matrix   = [[1,2], [3,4], [5,6]]
flat     = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6]
🧠 Quick Check
What does [x**2 for x in range(5) if x % 2 != 0] produce?
LESSON 06

Unpacking & Slicing

Two Python idioms that make data manipulation feel effortless once you internalize them.

πŸ“¦ Unpacking β€” Destructuring on Steroids
Python β€” Unpacking Patterns
# Basic tuple unpacking
x, y = 10, 20
first, second, third = ["a", "b", "c"]

# Swap without temp variable
a, b = 1, 2
a, b = b, a    # a=2, b=1 β€” Pythonic!

# * operator β€” collect the rest
first, *rest     = [1, 2, 3, 4, 5]
# first=1, rest=[2, 3, 4, 5]

*head, last      = [1, 2, 3, 4, 5]
# head=[1,2,3,4], last=5

first, *mid, last = [1, 2, 3, 4, 5]
# first=1, mid=[2,3,4], last=5

# Unpack in for loop
pairs = [("Jude", 85), ("Ana", 92), ("Max", 78)]
for name, score in pairs:
    print(f"{name}: {score}")

# Unpack dict into function
def make_player(name, hp, level):
    return f"{name} (HP:{hp} LVL:{level})"

data = {"name": "Jude", "hp": 100, "level": 5}
make_player(**data)   # ** unpacks dict as kwargs
πŸ”ͺ Slicing β€” Extract Any Subsequence
Python β€” Slicing Syntax: [start:stop:step]
items = [0, 1, 2, 3, 4, 5, 6, 7]

items[2:5]        # [2, 3, 4]     β€” index 2 up to (not including) 5
items[:3]         # [0, 1, 2]     β€” start to index 3
items[5:]         # [5, 6, 7]     β€” index 5 to end
items[-3:]        # [5, 6, 7]     β€” last 3 items
items[::-1]       # [7,6,5,4,3,2,1,0] β€” reverse!
items[::2]        # [0, 2, 4, 6]  β€” every 2nd item
items[1:6:2]      # [1, 3, 5]     β€” every 2nd from 1 to 6

# Works on strings too!
s = "Hello, World!"
s[7:12]     # "World"
s[::-1]     # "!dlroW ,olleH"
LESSON 07

Strings & f-strings

Python strings are immutable sequences with a rich built-in API. f-strings make string formatting so clean you'll never want to go back.

πŸ’¬ f-strings β€” Python's Best String Feature
Python β€” f-string Syntax (Python 3.6+)
# Basic embedding
name  = "Jude"
level = 5
f"{name} is level {level}"     # "Jude is level 5"

# Expressions inside braces
f"{2 ** 10}"                    # "1024"
f"{name.upper()}"               # "JUDE"
f"{level * 100} XP to next"    # "500 XP to next"

# Number formatting
score = 98765.4321
f"{score:,.2f}"                 # "98,765.43"
f"{score:>12.1f}"               # right-align in 12 chars
f"{level:03d}"                  # "005" β€” zero-padded

# Debug trick β€” Python 3.8+ self-documenting
x = 42
f"{x = }"                       # "x = 42"  ← prints name AND value

# Multiline f-strings
report = (f"Player: {name}\n"
          f"Level:  {level}\n"
          f"Score:  {score:,.0f}")
πŸ› οΈ Essential String Methods
Python β€” String Methods You'll Use Daily
s = "  Hello, World!  "

# Clean up
s.strip()          # "Hello, World!"     β€” remove whitespace
s.lower()          # "  hello, world!  " β€” lowercase
s.upper()          # "  HELLO, WORLD!  "

# Search
s.startswith("  H") # True
s.endswith("!  ")  # True
s.find("World")     # 9 (index), or -1 if not found
"World" in s       # True β€” membership test

# Transform
s.replace("World", "Python")  # "  Hello, Python!  "

# Split and join
"a,b,c".split(",")             # ['a', 'b', 'c']
", ".join(["a", "b", "c"])    # "a, b, c"

# Lines
"a\nb\nc".splitlines()          # ['a', 'b', 'c']
LESSON 08

*args & **kwargs

You'll see these in every Python library signature. Once you understand them, all those cryptic function definitions become readable.

πŸŽ›οΈ *args β€” Variable Positional Arguments
Python β€” *args
# *args collects extra positional arguments into a TUPLE
def total(*numbers: int) -> int:
    return sum(numbers)

total(1, 2)              # 3
total(1, 2, 3, 4, 5)    # 15
total()                  # 0 β€” empty tuple, sum=0

# Mix required and *args
def log(level: str, *messages: str) -> None:
    for msg in messages:
        print(f"[{level}] {msg}")

log("INFO", "Server started", "Port: 8000")
# [INFO] Server started
# [INFO] Port: 8000
πŸŽ›οΈ **kwargs β€” Variable Keyword Arguments
Python β€” **kwargs
# **kwargs collects extra keyword arguments into a DICT
def create_player(name: str, **stats) -> dict:
    return {"name": name, **stats}

create_player("Jude", hp=100, mp=50, level=5)
# {'name': 'Jude', 'hp': 100, 'mp': 50, 'level': 5}

# The full signature order (must always be in this order):
def full_example(
    pos1,               # required positional
    pos2,               # required positional
    default="value",   # optional with default
    *args,              # extra positional β†’ tuple
    **kwargs            # extra keyword β†’ dict
):
    print(pos1, pos2, default, args, kwargs)

# You see this CONSTANTLY in frameworks:
# def __init__(self, *args, **kwargs):
#     super().__init__(*args, **kwargs)
LESSON 09

Python's Object Model

Classes in Python feel familiar coming from Java, but there are key differences. Here's what transfers, what changes, and what Python can do that Java can't.

πŸ›οΈ Classes β€” Java vs Python
Python β€” Class Fundamentals
class Character:
    # Class variable β€” shared across ALL instances
    game_version: str = "1.0"

    # __init__ is Python's constructor
    def __init__(self, name: str, hp: int = 100) -> None:
        self.name = name   # instance variable
        self.hp   = hp
        self._alive = True  # _ prefix = "private by convention"

    # Regular method β€” always takes self
    def take_damage(self, amount: int) -> None:
        self.hp = max(0, self.hp - amount)
        if self.hp == 0:
            self._alive = False

    # @property β€” getter without calling .get_hp()
    @property
    def is_alive(self) -> bool:
        return self._alive

    # __str__ β€” what print(obj) shows (like toString())
    def __str__(self) -> str:
        status = "alive" if self._alive else "dead"
        return f"{self.name} [{self.hp} HP] ({status})"

# Usage
hero = Character("Jude")
hero.take_damage(30)
print(hero)             # Jude [70 HP] (alive)
print(hero.is_alive)    # True β€” property, not method call
πŸ”‘ Key Differences From Java OOP
JavaPython
private, protected, publicAll public. _name = "don't touch". __name = name mangled (harder to reach)
thisself β€” must be explicit as first param
interfaceNo interfaces β€” use Abstract Base Classes or just duck typing
extends one classMultiple inheritance supported (use carefully)
super()super().__init__() β€” same idea, different syntax
Overloading by signatureNo overloading β€” use default args or *args
Checked exceptionsNo checked exceptions β€” all unchecked
LESSON 10

Modules & The Standard Library

Python ships with "batteries included." The standard library handles most common tasks without installing anything extra β€” know what's in it.

πŸ“š Imports β€” How Python Finds Code
Python β€” Import Patterns
# Import whole module β€” access via namespace
import math
math.sqrt(16)       # 4.0
math.pi             # 3.141592...

# Import specific names β€” no namespace needed
from math import sqrt, pi, ceil
sqrt(25)            # 5.0 β€” direct access

# Import with alias β€” long module names
import datetime as dt
dt.datetime.now()

# Your own modules: just other .py files
# my_utils.py in same folder
from my_utils import format_name

# __name__ == "__main__" guard
# Code inside only runs when THIS file is the entry point
# Not when it's imported by another module
if __name__ == "__main__":
    print("Running directly")
πŸ”‹ Standard Library β€” The Most Useful Modules
πŸ“
pathlib

Modern file system. Path("data") / "file.txt". Replaces os.path entirely.

πŸ“„
json

json.dumps(obj) and json.loads(text). Dict in, JSON out. JSON in, dict out.

πŸ“…
datetime

Dates, times, timedeltas. Essential for any real application.

πŸ”€
collections

defaultdict, Counter, deque, namedtuple. Reach for these often.

πŸ”„
itertools

Infinite iterators, combinations, permutations, chaining. Functional magic.

πŸ”
re

Regular expressions. re.findall(), re.sub(), re.match().

βš™οΈ
os / sys

Environment variables, command-line args, process info, file operations.

πŸ“Š
csv

Read and write CSV files properly β€” handles quoting, delimiters, headers.

πŸ”
hashlib / secrets

Hashing (SHA256, MD5), cryptographically secure random values.

Python β€” stdlib Quickfire Examples
from pathlib import Path
from collections import Counter
import json, datetime

# pathlib β€” read all .py files in current directory
py_files = list(Path(".").glob("**/*.py"))

# Counter β€” most common words
words   = ["python", "java", "python", "rust", "python"]
counts  = Counter(words)
counts.most_common(2)  # [('python', 3), ('java', 1)]

# json β€” instant serialization
data    = {"name": "Jude", "skills": ["python", "unity"]}
s       = json.dumps(data, indent=2)
back    = json.loads(s)

# datetime β€” time arithmetic
now     = datetime.datetime.now()
in_week = now + datetime.timedelta(days=7)
print(f"One week from now: {in_week:%Y-%m-%d}")
PHASE PROJECT 🏁

Rewrite Something You Know

The best way to feel Python is to take a program you already understand in Java and rebuild it in Python. The contrast teaches you more than any tutorial.

🎯 The Challenge

Take the simplest version of a task manager (tasks with a title, status, and priority) that you could write in Java in 15 minutes β€” and rebuild it in Python, deliberately using everything from Phase 1.

πŸ“‹
RequirementsA task manager that: creates tasks, lists them, marks them complete, filters by status, and saves/loads from a JSON file. No frameworks, no libraries beyond stdlib.
πŸ’‘ Reference Solution β€” Study After Attempting
Python β€” Task Manager (Phase 1 Style)
from dataclasses import dataclass, field
from enum        import Enum, auto
from pathlib     import Path
import json, datetime

class Priority(Enum):
    LOW    = auto()
    MEDIUM = auto()
    HIGH   = auto()

@dataclass
class Task:
    title:     str
    priority:  Priority    = Priority.MEDIUM
    done:      bool         = False
    created:   str          = field(
        default_factory=lambda: datetime.datetime.now().isoformat()
    )

    def complete(self) -> None:
        self.done = True

    def __str__(self) -> str:
        status = "βœ“" if self.done else "β—‹"
        return f"[{status}] {self.title} ({self.priority.name})"

class TaskManager:
    def __init__(self, filepath: str = "tasks.json"):
        self._path  = Path(filepath)
        self._tasks: list[Task] = self._load()

    def add(self, title: str, priority: Priority = Priority.MEDIUM) -> Task:
        task = Task(title, priority)
        self._tasks.append(task)
        self._save()
        return task

    def pending(self) -> list[Task]:
        return [t for t in self._tasks if not t.done]

    def complete(self, title: str) -> bool:
        matches = [t for t in self._tasks if title.lower() in t.title.lower()]
        if not matches: return False
        matches[0].complete()
        self._save()
        return True

    def _save(self) -> None:
        data = [
            {"title": t.title, "priority": t.priority.name,
             "done": t.done,  "created": t.created}
            for t in self._tasks
        ]
        self._path.write_text(json.dumps(data, indent=2))

    def _load(self) -> list[Task]:
        if not self._path.exists(): return []
        data = json.loads(self._path.read_text())
        return [
            Task(d["title"], Priority[d["priority"]], d["done"], d["created"])
            for d in data
        ]

if __name__ == "__main__":
    mgr = TaskManager()
    mgr.add("Learn Python Phase 2", Priority.HIGH)
    mgr.add("Finish Death Road prototype", Priority.HIGH)
    mgr.add("Read The Pragmatic Programmer")
    for task in mgr.pending():
        print(task)
🎯 Extend the Challenge

After the baseline works, try these extensions:

  • Add a due_date field with a is_overdue property
  • Sort pending tasks by priority using a list comprehension and sorted()
  • Add a search(query) method that filters by any field using a comprehension
  • Pretty-print the task list using f-strings with formatting (aligned columns)
πŸš€
You've completed Phase 1. Count the lines of your Python version vs what this would take in Java. Notice how much you naturally used: f-strings, list comprehensions, dataclasses, unpacking, stdlib modules. That instinct is what Phase 2 (Pythonic Thinking) sharpens into something dangerous.
Roadmap