Lecture VI - Modules and the Standard Library

Programming with Python

Author
Affiliation

Dr. Tobias Vlćek

Kühne Logistics University Hamburg - Fall 2026

📋 Checkpoint 3 — Sessions I–V

The first 40 minutes are the checkpoint. It starts now, before the investor sits down.

  • Individual work: no AI, no neighbors, no chat
  • The link and QR are handed out in class. Open it and start
  • ~6 short tasks: write code, trace code, fix a bug, answer a multiple choice
  • It sweeps everything from Sessions I–V: variables, control flow, functions, data structures, errors

. . .

When you’re done: menu → DownloadDownload Python code → upload the .py to the “Checkpoint 3” assignment on Moodle. No retakes: one sitting.

. . .

The green ✅ live checks are provisional. The final grading runs on our side. And take a breath: everything in it was rehearsed in the labs.

Episode 6: Due Diligence Week

The investor walks in

Pens down. The checkpoint is behind you. Now the reason today matters.

. . .

An hour ago the investor walked into the shop unannounced. It’s due-diligence week: before she signs anything, she wants to see how this place actually runs. Kevin offered her a coffee and a spreadsheet he “mostly trusts.”

. . .

She didn’t drink the coffee. She walked to the whiteboard, uncapped a marker, and wrote one question:

“Why is everything built from scratch?”

Part II: the rules change

For five sessions you built everything by hand, on purpose. From today, that changes.

  • AI is now allowed and taught. We work with it, deliberately, starting in tonight’s lab.
  • The disclosure habit: every submission that used AI carries a one-line note saying what you used it for. Not a confession. A professional reflex.
  • The course chatbot (sidebar widget) now gives you full code on request, not just hints.

. . .

Full details on the AI Tools page.

. . .

You spent five sessions learning to think without a co-pilot. Now you get one — and you’ll be the pilot.

Don’t build it, import it

What’s a module?

The investor’s question has an answer: you shouldn’t build it from scratch. Most of what you need is already written.

  • A module is a toolbox of code someone already wrote and tested
  • Python ships with a whole shelf of them: the standard library
  • You import a module, then reach for the tools inside it with a dot: math.ceil(...)

. . .

Kevin has been hand-rolling arithmetic for months. The standard library did most of it before he was born.

import math: stop rounding by hand

130 pastries need to ship. They go in crates of 48. How many crates? You need to round up: a half-full crate still ships as a whole one.

import math

pastries = 130
per_crate = 48
crates = math.ceil(pastries / per_crate)   # ceil = round UP
print(crates)
3

. . .

130 / 48 is 2.7…; math.ceil bumps it to 3. No fiddling with “if there’s a remainder, add one.” The tool already knows.

from statistics import ...

Sometimes you only want a couple of tools, not the whole box. Import them by name and use them directly, no statistics. prefix:

from statistics import mean, median

ratings = [4.5, 4.8, 1.0, 5.0, 4.2]
print(mean(ratings))     # the average
print(median(ratings))   # the middle value
3.9
4.5

. . .

One furious review (a 1.0) drags the mean down to 3.9. The investor asked for the typical rating: median sorts the values and hands back the middle one (4.5), unmoved by one angry customer.

Aliases: a shorter name

Some module names are long, or you’ll type them fifty times. import ... as gives a module a nickname for the rest of the file:

import statistics as stats

print(stats.median([4.5, 4.8, 1.0, 5.0, 4.2]))
4.5

. . .

stats.median is the same tool as statistics.median, just less to type. You’ll meet fixed conventions soon (import pandas as pd); using the community’s nickname makes your code instantly readable to everyone else.

Looking inside a module

You don’t have to memorize a module. Python will tell you what’s in it and what each tool does:

import math

dir(math)          # lists every name in the module
help(math.ceil)    # prints what ceil does, and how to call it

. . .

dir() is the drawer of tools; help() is the little instruction card taped to each one. Between them you can explore any module without leaving your editor.

Predict: which way does floor go?

math.ceil rounds up. Its partner math.floor rounds down, but down from a negative number is the tricky part. What does the last line print?

import math
print(math.floor(-2.5))

a) -3 b) -2 c) an error

. . .

Predict first. Commit to an answer before the next slide.

Answer: floor goes down, not toward zero

a) -3floor always heads down the number line, toward more negative. From -2.5, down is -3, not the -2 you’d get by rounding toward zero:

import math
print(math.floor(-2.5))   # down the number line → -3
-3

. . .

“Down” means smaller, and -3 is smaller than -2. Keep the number line in your head, not the distance to zero.

⚡ Your turn — 10 minutes

Open the exercise (scan the QR or type the link):

beyondsimulations.github.io/Introduction-to-Python/notebooks/ex_06_a/

First predict what happens, then run it.

Rehearsing luck

The random toolbox

The investor wants to see how the shop copes with a busy day, but the busy day hasn’t happened yet. So we rehearse it with made-up numbers. The random module deals them:

import random

print(random.random())                       # a float in [0.0, 1.0)
print(random.randint(1, 20))                  # an integer 1–20, ends included
print(random.choice(["latte", "mocha", "tea"]))  # one item, picked at random

queue = [1, 2, 3, 4, 5]
random.shuffle(queue)                         # reorders the list in place
print(queue)
0.9252263675891648
20
latte
[4, 2, 3, 5, 1]

. . .

Four tools, four flavors of luck: a raw float, a bounded integer, a pick from a list, and a reshuffle.

“Run it again”

The investor leans over and says: “Run it again.” Kevin does, and gets completely different numbers:

import random

print([random.randint(1, 20) for _ in range(5)])   # one run
print([random.randint(1, 20) for _ in range(5)])   # ...and again — different!
[4, 9, 13, 8, 17]
[5, 11, 15, 17, 7]

. . .

Two runs, two answers. That’s exactly what random is supposed to do, but it’s useless for due diligence. A projection nobody can reproduce is a projection nobody can trust.

random.seed makes luck repeatable

random.seed(n) fixes the starting point of the number stream. Same seed → same sequence, every time:

import random

random.seed(7)
print([random.randint(1, 20) for _ in range(5)])   # → [11, 5, 13, 2, 3]

random.seed(7)
print([random.randint(1, 20) for _ in range(5)])   # same seed → same list
[11, 5, 13, 2, 3]
[11, 5, 13, 2, 3]

. . .

Both lines print [11, 5, 13, 2, 3]. The numbers still look random, but now the investor can run it herself and land on the identical result.

Predict: seeded once, built twice

Kevin seeds once, then builds two lists the same way, without touching the seed in between. Are first and second equal?

import random

random.seed(42)
first  = [random.randint(1, 20) for _ in range(3)]
second = [random.randint(1, 20) for _ in range(3)]

print(first)
print(second)

a) different: the second list continues where the first stopped b) equal: the seed is set, so both come out the same c) an error: the stream is empty after three draws

. . .

Predict first. Commit to an answer before the next slide.

Answer: different

a) different — a seed doesn’t freeze random, it fixes the whole sequence. The first list eats the first three numbers of the stream; the second list simply continues from number four:

import random

random.seed(42)
first  = [random.randint(1, 20) for _ in range(3)]
second = [random.randint(1, 20) for _ in range(3)]

print(first)    # [4, 1, 9]  — the stream's first three numbers
print(second)   # [8, 8, 5]  — the stream carries on
[4, 1, 9]
[8, 8, 5]

. . .

To get the same list twice, you re-seed before each run, and that rewinds the stream to the start. One seed, one fixed sequence: that’s the entire job of a seed.

⚡ Your turn — 10 minutes

Open the exercise (scan the QR or type the link):

beyondsimulations.github.io/Introduction-to-Python/notebooks/ex_06_b/

First predict what happens, then run it.

To the Lab

Tonight’s episode

  • Head to the lab notebook: Episode 6 — Due Diligence Week
  • You’ll import math and statistics for investor-grade counts and averages, then use random (with and without a seed) to rehearse a busy day she can reproduce
  • It’s the first lab where AI is allowed, so try the chatbot, and add your one-line disclosure note
  • It runs entirely in your browser: no setup, just click and code

. . .

Download your .py before you leave. Closing the tab without downloading loses your work, and downloading is exactly how you handed in the checkpoint this morning.

Wrap-up

Three things to remember

  1. Don’t build it, import it. A module is a toolbox someone already wrote: import math, from statistics import median, import ... as for a nickname. dir() and help() show you what’s inside.
  2. random deals the luck (random(), randint, choice, shuffle), perfect for rehearsing a day that hasn’t happened yet.
  3. random.seed(n) makes luck repeatable. Same seed → same sequence, every run. A projection you can reproduce is a projection an investor can trust.

. . .

Next episode: one array to rule a thousand orders. The shop’s data has outgrown plain lists, and NumPy turns a thousand numbers into a single, fast object.

Literature

Books to start with

  • Downey, A. B. (2024). Think Python: How to think like a computer scientist (Third edition). O’Reilly. Link to free online version
  • Elter, S. (2021). Schrödinger programmiert Python: Das etwas andere Fachbuch (1. Auflage). Rheinwerk Verlag.

. . .

New this session: the AI Tools page: how and when to use AI in Part II, and the one-line disclosure habit that goes on every submission from here on.

. . .

For more, see the literature list of this course.