Seite 1 von 1

invalid syntax bei der Eingabe?

Verfasst: Montag 14. März 2022, 09:15
von efix
Hallo Leute,

ich mache gerade die Aufgabe 16 von:

https://trainyourprogrammer.de/index.pl ... llposition

Vokale zählen in einem Satz.

Code: Alles auswählen

import re

string = ""
A = 0
E = 0
I = 0
O = 0
U = 0

while True:
    try:
        string = str(input("Geben Sie einen Satz ein:"))
        break
    except KeyboardInterrupt:
        break
    except:
        print("Es gab ein Fehler bei der Eingabe!")
        pass
    
A = len(re.findall('[Aa]', string))

print(A)
Wenn ich jetzt zum Beispiel "Am Anfang sind" eingebe bekomme ich einen - SyntaxError: invalid syntax - und ich verstehe nicht warum. Kann mir jemand bitte helfen das zu verstehen!?!

Grüße

Re: invalid syntax bei der Eingabe?

Verfasst: Montag 14. März 2022, 09:24
von __deets__
Kein veraltetes Python 2 benutzen, das versucht den Input als Python Ausdruck auszuwerten.

Re: invalid syntax bei der Eingabe?

Verfasst: Montag 14. März 2022, 10:35
von __blackjack__
@efix: Der `str()`-Aufruf beim `input()` ist überflüssig, weil `input()` in Python 3 bereits eine Zeichenkette liefert.

Die ``pass``-Anweisung ist sinnfrei.

Ein nacktes ``except`` ohne eine konkrete Ausnahme ist keine gute Idee, schon gar nicht, wenn man dann auch noch sämtliche Informationen unterdrückt, was das denn für eine Ausnahme war und wo genau die aufgetreten ist. Das macht die Fehlersuche nahezu unmöglich.

Wenn man das weg lässt, wird die Schleife sinnlos. Ich frage mich auch welcher Fehler auf diese Weise sinnvoll behandelt werden könnte.

Die ganzen Variablen am Anfang sollte nicht *dort* definiert werden, sondern erst da wo sie tatsächlich benötigt werden. `string` als leere Zeichenkette wird nur benötigt wenn ein `KeyboardInterrupt` behandelt wird. *Dort* sollte das dann auch stehen, damit das deutlich(er) wird, dass das genau für diesen, und nur für diesen Fall gedacht ist.

Die 0en von `A`, `E`, `I`, `O`, und `U` werden nirgends verwendet.

Hier kodieren die Namen zudem Werte, sollten also gar keine Namen sein. Denn das führt so wie es jetzt da steht, ja unweigerlich zu Codewiederholungen, die man nicht haben sollte, weil man für jeden Vokal den gleichen Vorgang schreiben muss. Das ist also ein Fall für eine Schleife.

Code: Alles auswählen

#!/usr/bin/env python3
import re
from collections import Counter


def main():
    try:
        text = input("Geben Sie einen Satz ein:\n")
    except KeyboardInterrupt:
        text = ""

    vowels = "aeiou"

    pattern = "|".join(map(re.escape, vowels))
    vowel_to_count = Counter(
        match.group(0) for match in re.finditer(pattern, text.lower())
    )

    print(f"Anzahl der Vokale: {sum(vowel_to_count.values())}")
    for vowel in vowels:
        print(f"{vowel.upper()}: {vowel_to_count[vowel]}")


if __name__ == "__main__":
    main()

Re: invalid syntax bei der Eingabe?

Verfasst: Montag 14. März 2022, 14:46
von ThomasL
Hi __blackjack__,

ist das mit re nicht ein wenig wie mit den Kanonen und Spatzen?
Geht doch auch so. (no pun intended)

Code: Alles auswählen

#!/usr/bin/env python3
from collections import Counter


def main():
    try:
        text = input("Geben Sie einen Satz ein:\n")
    except KeyboardInterrupt:
        text = ""

    vowels = "aeiou"
    vowel_to_count = Counter(text.lower())
    
    print(f"Anzahl der Vokale: {sum(value for char, value in vowel_to_count.items() if char in vowels)}")
    for vowel in vowels:
         print(f"{vowel.upper()}: {vowel_to_count[vowel]}")


if __name__ == "__main__":
    main()

Re: invalid syntax bei der Eingabe?

Verfasst: Montag 14. März 2022, 19:11
von __blackjack__
@ThomasL: Ich hatte das nur drin, weil es im Original schon importiert wurde. Von 0 an hätte ich das auch ohne `re` gemacht.