[[start|zurück]] # Python Teil 3: Funktionen und saubere Programmstruktur 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. --- ## 1) Warum Funktionen? **Problem ohne Funktionen:** Alles steht in einer langen Datei, Menü und Logik vermischen sich. **Lösung:** Jede Aufgabe bekommt eine eigene Funktion: * Hosts anzeigen * Anzahl anzeigen * TLD filtern * Sortieren * (später) Export / Löschen / Ping Das macht Code: * leichter zu lesen * leichter zu testen * leichter zu erweitern --- ## 2) Dein nächstes Script: `03_funktionen.py` 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. --- ## 3) Mini-Übung (Baustein innerhalb Baustein) Füge eine **neue Menüoption 6** hinzu: „Host hinzufügen (nachträglich)“. Regeln: * Duplikate sollen weiterhin verhindert werden * Normalisierung berücksichtigen 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.) --- ## Python Teil 3: Funktionen und main() > Ziel: Code in kleine Bausteine zerlegen, damit er übersichtlich, wartbar und erweiterbar wird. --- ### 1. Was ist eine Funktion? Eine Funktion ist ein benannter Codeblock. def begruessung(name): print("Hallo", name) * `def` startet eine Funktion * in Klammern stehen Parameter (Eingaben) * `return` (optional) gibt etwas zurück --- ### 2. Warum Funktionen? Ohne Funktionen wird ein Programm schnell unübersichtlich. Mit Funktionen kann man: * Code wiederverwenden * leichter testen * leichter erweitern * Fehler schneller finden --- ### 3. Beispiel: Hosts anzeigen als Funktion def hosts_anzeigen(hosts): for index, host in enumerate(hosts, start=1): print(index, "-", host) Aufruf: hosts_anzeigen(hosts) --- ### 4. main() – der Startpunkt Viele Programme haben eine Funktion `main()`, die alles steuert. def main(): print("Programm startet") --- ### 5. Warum `if __name__ == "__main__":`? if __name__ == "__main__": main() Das bedeutet: * Wenn die Datei direkt gestartet wird → `main()` wird ausgeführt. * Wenn die Datei als Modul importiert wird → `main()` wird NICHT automatisch ausgeführt. Das ist Standard in Python. --- ### 6. Programmstruktur (überblick) * `normalize()` und `cls()` sind Hilfsfunktionen * `eingaben_sammeln()` sammelt Hosts und gibt eine Liste zurück * Menüoptionen sind jeweils eigene Funktionen * `main()` steuert den Ablauf --- ### 7. Übungsaufgaben ==== Übung A: Menüoption „Host hinzufügen“ ==== Erweitere das Menü um eine Option, um nachträglich einen Host hinzuzufügen (Duplikate verhindern). ==== Übung B: Menüoption „Host löschen“ ==== Erweitere das Menü um „Host löschen“ (mit Fehlerbehandlung). ==== Übung C: Export in Datei ==== 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.