Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:grundlagen:03_funktionen

**Dies ist eine alte Version des Dokuments!**

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:

03_funktionen.py
#!/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.
Alle Funktionen haben Typ-Hinweise, damit man später weiß, welche Datentypen sie erwarten und zurückgeben (auch wenn Python das nicht erzwingt).
Alle Funktionen haben sprechende Namen, damit man später weiß, 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.)


4) DokuWiki-Seite (Teil 3)

DokuWiki – 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.

python/grundlagen/03_funktionen.1772290940.txt.gz · Zuletzt geändert: von lars