Jetzt machen wir aus dem „funktioniert“-Script ein „wartbar“-Script. Traditionell gesagt: Wir ziehen die Kabel in Kanäle statt sie lose hinterm Rack baumeln zu lassen.
Problem ohne Funktionen: Alles steht in einer langen Datei, Menü und Logik vermischen sich. Lösung: Jede Aufgabe bekommt eine eigene Funktion:
Das macht Code:
Kopiere das komplett als neue Datei:
#!/usr/bin/env python3 # 03_funktionen.py # Menü-Programm mit Funktionen: Hosts sammeln, Duplikate verhindern, anzeigen, zählen, filtern, sortieren # Importieren von Modulen import os """ Funktionen * Alle Funktionen haben einen Docstring, damit man später weiß, * was sie tun und welche Parameter sie erwarten. * welche Datentypen sie erwarten und zurückgeben (auch wenn Python das nicht erzwingt). * was sie tun, ohne den Code lesen zu müssen. * Alle Funktionen haben eine klare Trennung von Ein- und Ausgabe, damit man sie später leichter testen und wiederverwenden kann. * Alle Funktionen haben eine klare Trennung von Logik und Präsentation, damit man sie später leichter anpassen und erweitern kann. """ # Funktion zum Normalisieren von Text (z.B. für Vergleiche) def normalize(text: str) -> str: """Trimmt Leerzeichen und macht alles klein (für Vergleiche).""" return text.strip().lower() # Funktion zum Bildschirm löschen (plattformunabhängig) def cls() -> None: os.system("cls" if os.name == "nt" else "clear") # Funktion zum Sammeln von Hostnamen def eingaben_sammeln() -> list[str]: """Fragt Hosts ab und gibt eine Liste zurück (Duplikate werden ignoriert).""" hosts: list[str] = [] hosts_norm: set[str] = set() print("Gib Hostnamen ein (leer lassen zum Beenden)") while True: eingabe = input("Host: ") if eingabe == "": break key = normalize(eingabe) if key in hosts_norm: print("Host bereits vorhanden.") continue hosts.append(eingabe.strip()) hosts_norm.add(key) return hosts # Funktion zum Anzeigen der gesammelten Hosts def hosts_anzeigen(hosts: list[str]) -> None: cls() print("\n--- Gespeicherte Hosts ---") if not hosts: print("(keine Hosts gespeichert)") return for index, host in enumerate(hosts, start=1): print(f"{index} - {host}") # Funktion zum Anzeigen der Anzahl der gesammelten Hosts def anzahl_anzeigen(hosts: list[str]) -> None: cls() print(f"\nAnzahl der Hosts: {len(hosts)}") if not hosts: print("Keine Hosts eingegeben.") # Funktion zum Filtern der Hosts nach TLD def tld_filtern(hosts: list[str]) -> None: cls() if not hosts: print("Keine Hosts gespeichert.") return tld = input("Gib die TLD ein (z.B. .com, .de oder de): ").strip() if tld and not tld.startswith("."): tld = "." + tld treffer = [h for h in hosts if normalize(h).endswith(normalize(tld))] print(f"\nHosts mit der TLD '{tld}':") for index, host in enumerate(treffer, start=1): print(f"{index} - {host}") print(f"\nTreffer: {len(treffer)}") # Funktion zum Sortieren der Hosts def sortieren(hosts: list[str]) -> None: cls() if not hosts: print("Keine Hosts gespeichert.") return sortierte = sorted(hosts, key=lambda x: normalize(x)) print("\n--- Gespeicherte Hosts (sortiert) ---") for index, host in enumerate(sortierte, start=1): print(f"{index} - {host}") # Funktion zum Anzeigen des Menüs und Abfrage der Auswahl def menue() -> str: print( "\n1. Alle Hosts anzeigen" "\n2. Anzahl der Hosts anzeigen" "\n3. TLD filtern" "\n4. Sortieren" "\n5. Beenden" ) return input("Wähle eine Option: ").strip() # Hauptfunktion, die den Ablauf steuert def main() -> None: hosts = eingaben_sammeln() auswahl = input("\nMöchtest du die gespeicherten Hosts anzeigen? (j/n): ") if normalize(auswahl) != "j": print("Programm wird beendet.") input("\nEnter zum Beenden...") return cls() while True: wahl = menue() if wahl == "1": hosts_anzeigen(hosts) elif wahl == "2": anzahl_anzeigen(hosts) elif wahl == "3": tld_filtern(hosts) elif wahl == "4": sortieren(hosts) elif wahl == "5": print("Programm wird beendet.") break else: print("Ungültige Option. Bitte wähle 1-5.") input("\nEnter zum Beenden...") # Nur ausführen, wenn das Skript direkt gestartet wird (nicht importiert) if __name__ == "__main__": main()
Wichtiges neues Konzept:
if __name__ == "__main__": sorgt dafĂĽr, dass main() nur startet, wenn du die Datei direkt ausfĂĽhrst.
Füge eine neue Menüoption 6 hinzu: „Host hinzufügen (nachträglich)“.
Regeln:
Hinweis: Damit das sauber geht, brauchen wir zusätzlich eine Datenstruktur für hosts_norm oder wir normalisieren beim Nachtragen auch gegen die Liste. (Wir machen es gleich sauber.)
Ziel: Code in kleine Bausteine zerlegen, damit er ĂĽbersichtlich, wartbar und erweiterbar wird.
—
Eine Funktion ist ein benannter Codeblock.
def begruessung(name):
print("Hallo", name)
def startet eine Funktionreturn (optional) gibt etwas zurĂĽckOhne Funktionen wird ein Programm schnell unĂĽbersichtlich. Mit Funktionen kann man:
def hosts_anzeigen(hosts):
for index, host in enumerate(hosts, start=1):
print(index, "-", host)
Aufruf:
hosts_anzeigen(hosts)
Viele Programme haben eine Funktion main(), die alles steuert.
def main():
print("Programm startet")
if __name__ == "__main__":
main()
Das bedeutet:
main() wird ausgefĂĽhrt.main() wird NICHT automatisch ausgefĂĽhrt.Das ist Standard in Python.
normalize() und cls() sind Hilfsfunktioneneingaben_sammeln() sammelt Hosts und gibt eine Liste zurückmain() steuert den AblaufErweitere das Menü um eine Option, um nachträglich einen Host hinzuzufügen (Duplikate verhindern).
Erweitere das Menü um „Host löschen“ (mit Fehlerbehandlung).
Speichere die Hostliste in eine Textdatei hosts.txt.
Wenn du Baustein 3 ausführst und mir sagst „läuft“, machen wir als nächstes Baustein 4: Dateien lesen/schreiben (Hostliste speichern & wieder laden). Das ist dann die Brücke zu echten Admin-Tools.