# importiere die Funktion reduce() aus dem Modul functools
from functools import reduce

# ein Wort (Zeichenkette) in eine Zahl vom Typ int, float oder complex
# konvertieren
def konvertiere(wort):
    zahl = None

    # der Reihe nach die Konvertierungsfunktionen probieren
    for funktion in int, float, complex:
        try:
            zahl = funktion(wort)
            # bei Erfolg verlassen wir die Schleife hier
            break
        except:
            # eine Ausnahme ignorieren
            pass

    # die ermittelte Zahl zurückgeben
    return zahl

# das Produkt der Zahlen einer Zeile bilden
def produkt(zeile):
    produkt = None

    # die Wörter der Zeile durchlaufen
    for wort in zeile.split():
        # das Wort in eine Zahl konvertieren
        zahl = konvertiere(wort)

        if zahl is None:
            # die Konvertierung schlug fehl
            print(f'{wort} wurde wegen Syntaxfehler ignoriert')
        else:
            # die erste Zahl einer Zeile als Produkt übernehmen und ab der 2.
            # Zahl diese mit dem bisherigen Produkt multiplizieren
            produkt = zahl if produkt is None else produkt * zahl

    # Rückgabe des Produkts bzw. von 0, wenn wir kein Produkt bilden konnten
    return 0 if produkt is None else produkt
    
# andere Implementierung der Produktbildung
def produkt2(zeile):
    # verschachtelte List Comprehension, die alle Wörter in Zahlen oder None
    # konvertiert und die None-Einträge entfernt
    zahlen = [zahl for zahl in [konvertiere(wort) for wort in zeile.split()] if zahl is not None]

    # mit reduce() und einer anonymen Lambda-Funktion die Elemente schrittweise
    # multiplizieren
    return reduce(lambda x, y: x * y, zahlen) if zahlen else 0

# MAIN

# die Daten als mehrzeiligen String definieren
daten = '''# ein Kommentar
2
3 4
aaa
2.5 3
2+3j
STOP
1000
'''

# die Daten in eine Datei schreiben; with sorgt für das Schließen der Datei
with open('daten.txt', 'w') as f:
    f.write(daten)

# Liste der gebildeten Produkte
produkte = []

# die Summe der Produkte
summe = 0

# die Datei zeilenweise auswerten (hier ohne with)
for zeile in open('daten.txt'):
    zeile = zeile.strip()

    if not zeile or zeile.startswith('#'):
        # Leer- und Kommentarzeilen übergehen
        continue

    if zeile == 'STOP':
        # Abbruch bei einer STOPP-Zeile
        break
    
    # das Produkt nach dem ersten Verfahren bilden und summieren
    summe += produkt(zeile)

    # das Produkt nach dem zweiten Verfahren bilden und an die Liste der
    # Produkte anhängen
    produkte.append(produkt2(zeile))

# die erste Summe ausgeben
print('Summe  =', summe)

# die Produktliste ausgeben, summieren und die Summe ausgeben
print('Produkte =', produkte)
print('Summe2 =', sum(produkte))
