invalid syntax bei der Eingabe?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kein veraltetes Python 2 benutzen, das versucht den Input als Python Ausdruck auszuwerten.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomasL: Ich hatte das nur drin, weil es im Original schon importiert wurde. Von 0 an hätte ich das auch ohne `re` gemacht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten