Aufwärmen · Aufgabe 1 von 7
// B5.1 · ca. 25 Min. · Einstieg
Module und Importe
Nach dieser Lektion teilen Sie ein Programm in main.py und ein Modul helpers.py auf, importieren es in der passenden Form und schützen Skript-Code mit if __name__ == "__main__":.
Lektion 1 von 5 in B5 Module, Dateien und Fehler
Danach können Sie
- Ein Modul oder einzelne Namen daraus mit import und from … import einbinden
- Ein Programm auf main.py und eine zweite Datei aufteilen, Skript-Code mit if __name__ == "__main__": geschützt
- Mit dir() auflisten, was ein Modul definiert, und erklären, wo Python ein Modul sucht
Vorhersagen · Aufgabe 2 von 7
Sagen Sie es vorher, bevor Sie weiterlesen. dir() ohne Argument listet die Namen, die in dieser Datei definiert sind. Was gibt das aus?
from math import sqrt print(sqrt(25), "math" in dir())Üben · Aufgabe 3 von 7
Setzen Sie das Schlüsselwort ein, damit der Name math auf das ganze Modul math verweist.
____ mathmathÜben · Aufgabe 4 von 7
Diese Datei heißt main.py und wird mit python main.py gestartet. Was gibt sie aus?
print("name is", __name__)Üben · Aufgabe 5 von 7
Ordnen Sie jedem Import den Namen oder die Namen zu, die er liefert.
Denksport · Aufgabe 6 von 7
Knobelaufgabe. Was gibt das aus?
from math import pi pi = 3 import math print(pi, math.pi > 3)Anwenden · Aufgabe 7 von 7
Mini-Aufgabe, auf Ihrem eigenen Rechner. Legen Sie temperature.py an, mit einer Funktion c_to_f(celsius), die celsius * 9 / 5 + 32 zurückgibt, und einem Selbsttest unter if __name__ == "__main__":. Importieren Sie das Modul dann in main.py im selben Ordner und geben Sie für 0, 20 und 100 je eine Zeile wie 0 C = 32.0 F aus. Starten Sie beide Dateien.
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Selbst programmieren
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Ein Hauptprogramm und sein Hilfsmodul
Zwei Dateien liegen nebeneinander: helpers.py definiert zwei Textfunktionen, und main.py importiert sie in beiden Formen. helpers.py gibt auf oberster Ebene eine Zeile aus, damit Sie sehen, wann es läuft, und hält seinen Selbsttest hinter der __main__-Abfrage. Starten Sie main.py und sehen Sie nach, welche Zeilen von helpers.py erschienen sind.
main.py
import helpers
from helpers import word_count
sentence = "modules keep programs tidy"
print(helpers.shout(sentence))
print("words:", word_count(sentence))
print("helpers.__name__ is", helpers.__name__)
print("__name__ here is", __name__)
print([name for name in dir(helpers) if not name.startswith("_")])
helpers.py
"""Small text helpers, imported by main.py."""
def shout(text: str) -> str:
return text.upper() + "!"
def word_count(text: str) -> int:
return len(text.split())
print("loading helpers")
if __name__ == "__main__":
# Runs only with: python helpers.py
print("self-test:", shout("hi"), word_count("a b c"))
Ausführen mit
python main.pyAusgabe
loading helpers
MODULES KEEP PROGRAMS TIDY!
words: 4
helpers.__name__ is helpers
__name__ here is __main__
['shout', 'word_count']- loading helpers erscheint einmal, obwohl main.py helpers zweimal importiert: Code auf oberster Ebene läuft nur beim ersten Import.
- Der Selbsttest lief nicht, weil __name__ von helpers.py beim Import "helpers" ist.
- main.py nutzt helpers.shout mit dem Modulnamen, word_count aber allein, weil es mit from importiert wurde.
- dir(helpers) listet auch Namen wie __name__ und __doc__; die List Comprehension verwirft alles, was mit _ beginnt.
Ändern und ausführen
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
Übungen
Übung 1 von 2
Das Modul helpers nutzen
helpers.py (zweiter Reiter) definiert average(scores) und grade(score). Lassen Sie die Datei unverändert. Lesen Sie in main.py eine Zeile ganzzahliger Punktzahlen, durch Leerzeichen getrennt, und geben Sie average: mit dem Durchschnitt und grade: mit der Note aus. Verwenden Sie import helpers für average und from helpers import grade für grade. Für 80 65 lautet die Ausgabe average: 72.5 und grade: C.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Beginnen Sie main.py mit zwei Zeilen: import helpers, dann from helpers import grade.
Hinweis 2
Nach import helpers erreichen Sie average über das Modul: helpers.average(scores). grade rufen Sie allein auf: grade(mean).
Hinweis 3
print("average:", mean) setzt das Leerzeichen zwischen Beschriftung und Zahl von selbst.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
import helpers
from helpers import grade
scores = [int(word) for word in input().split()]
mean = helpers.average(scores)
print("average:", mean)
print("grade:", grade(mean))
Auf dem eigenen Computer ausführen
Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.py
# helpers.py, next to this file, defines average(scores) and grade(score).
# Import them, then print the average and the grade of the scores typed in.
scores = [int(word) for word in input().split()]
print("average:", 0)
test_main.py
from learnrun import run_main
def report(line):
return run_main(line + "\n").strip().splitlines()
def test_average_and_grade():
"""80 65 ergibt Durchschnitt 72.5 und Note C"""
got = report("80 65")
assert got == ["average: 72.5", "grade: C"], f"für 80 65 gab das Programm {got!r} aus"
def test_top_grade():
"""90 100 ergibt Durchschnitt 95.0 und Note A"""
got = report("90 100")
assert got == ["average: 95.0", "grade: A"], f"für 90 100 gab das Programm {got!r} aus"
def test_uses_helpers():
"""main.py importiert helpers, statt die Funktionen zu kopieren"""
with open("main.py", encoding="utf-8") as f:
source = f.read()
assert "import helpers" in source, "in main.py fehlt die Zeile import helpers"
assert "from helpers import grade" in source, "in main.py fehlt die Zeile from helpers import grade"
assert "def " not in source, "main.py definiert eine eigene Funktion; nutzen Sie die aus helpers.py"
helpers.py
"""Score helpers for main.py. Leave this file as it is."""
def average(scores: list[int]) -> float:
return sum(scores) / len(scores)
def grade(score: float) -> str:
if score >= 90:
return "A"
if score >= 75:
return "B"
if score >= 50:
return "C"
return "F"
Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.
Programm ausführen:
python main.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenÜbung 2 von 2
main.py importierbar machen
main.py definiert greet(name), das shout aus helpers.py nutzt, fragt dann nach einem Namen und gibt den Gruß aus. Die Tests importieren main.py, um greet aufzurufen, und dabei darf nichts gelesen oder ausgegeben werden. Verschieben Sie die input- und print-Zeilen unter if __name__ == "__main__":, damit sie nur laufen, wenn main.py selbst gestartet wird.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Wenn ein Test main.py importiert, ist dessen __name__ gleich "main". Wenn Sie es starten, ist __name__ gleich "__main__".
Hinweis 2
Fügen Sie unten die Zeile if __name__ == "__main__": ein und rücken Sie die beiden Zeilen darunter um vier Leerzeichen ein.
Hinweis 3
Lassen Sie das def, wo es ist: Die Tests brauchen greet nach dem Import.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
from helpers import shout
def greet(name: str) -> str:
return shout("hello, " + name)
if __name__ == "__main__":
name = input()
print(greet(name))
Auf dem eigenen Computer ausführen
Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.py
from helpers import shout
def greet(name: str) -> str:
return shout("hello, " + name)
name = input()
print(greet(name))
test_main.py
import contextlib
import importlib
import io
import sys
from learnrun import run_main
def import_main():
sys.modules.pop("main", None)
printed = io.StringIO()
saved = sys.stdin
sys.stdin = io.StringIO("")
try:
with contextlib.redirect_stdout(printed):
module = importlib.import_module("main")
finally:
sys.stdin = saved
return module, printed.getvalue()
def test_import_is_quiet():
"""Der Import von main.py liest keine Eingabe und gibt nichts aus"""
try:
_, printed = import_main()
except EOFError:
assert False, "beim Import von main.py lief input(): verschieben Sie es unter if __name__ == \"__main__\":"
assert printed == "", f"beim Import gab main.py {printed!r} aus: verschieben Sie das print unter if __name__ == \"__main__\":"
def test_greet():
"""greet(\"ada\") gibt HELLO, ADA! zurück"""
try:
module, _ = import_main()
except EOFError:
assert False, "main.py ließ sich nicht importieren: es ruft input() auf oberster Ebene auf"
got = module.greet("ada")
assert got == "HELLO, ADA!", f"greet(\"ada\") gab {got!r} zurück, erwartet war 'HELLO, ADA!'"
def test_run_as_script():
"""Als Skript gestartet, fragt es weiter nach einem Namen und grüßt"""
got = run_main("Grace\n").strip()
assert got == "HELLO, GRACE!", f"für Grace gab das Programm {got!r} aus, erwartet war 'HELLO, GRACE!'"
helpers.py
"""Text helpers for main.py. Leave this file as it is."""
def shout(text: str) -> str:
return text.upper() + "!"
Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.
Programm ausführen:
python main.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenHäufige Fehler
Den Dateinamen in den Import schreiben
import math.py
print(math.sqrt(16))
Was Python ausgibt
ModuleNotFoundError: No module named 'math.py'; 'math' is not a packageWarum, und die Lösung
import erwartet einen Modulnamen, keinen Dateinamen. Python liest math.py als „das Modul py im Paket math“, und das gibt es nicht. Schreiben Sie import math, oder import helpers für Ihre eigene helpers.py.
Den Modulnamen nach from … import benutzen
from math import sqrt
print(math.sqrt(16))
Was Python ausgibt
NameError: name 'math' is not defined. Did you forget to import 'math'?Warum, und die Lösung
from math import sqrt definiert nur sqrt, nicht math. Rufen Sie entweder sqrt(16) direkt auf, oder ändern Sie den Import in import math und behalten Sie math.sqrt(16). Wählen Sie pro Modul eine Form und bleiben Sie dabei.
Eine Funktion ohne ihren Modulnamen aufrufen
import math
print(sqrt(16))
Was Python ausgibt
NameError: name 'sqrt' is not definedWarum, und die Lösung
import math bindet nur den Namen math. Seine Funktionen bleiben darin: Schreiben Sie math.sqrt(16). Wenn Sie den kurzen Namen wollen, importieren Sie ihn: from math import sqrt.
Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode
Abschlussquiz
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.