Eingabe prüfen

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
anonym109

Hallo liebes Forum,

ich bin neu im Forum und in Programmiersprachen überhaupt, ich hoffe es gibt jemanden der mir
etwas helfen kann das Ganze besser zu verstehen und zu lernen.

Ich möchte das der Nutzer seinen Namen eingibt,
die Eingabe soll dann überprüft werden.

Wenn die Eingabe nur Buchstaben enthält soll es im Programm weiter gehen.
Wenn die Eingabe eine Zahl enthält, soll ein ein Hinweis erscheinen das Zahlen nicht erlaubt sind und die Eingabefunktion wiederholt werden.

Ich habe jetzt schon viele Tutorials angesehen und viele Foreneinträge gelesen komme aber nicht auf die Lösung.

Ich bin auf das hier in einem Forum gestoßen:

inhalt = "Beispieltext"
ergebnis = inhalt.isalpha()
print(ergebnis)

allerdings weiß ich nicht wie man es nutzen kann um eine Eingabe zu prüfen.

Ich hoffe jemand kann mir helfen zur Lösung zu kommen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du brauchst zwei weitere Elemente:

- eine while-Schleife, die du abbrichst, wenn dein Kriterium erfuellt ist.
- eine if-Bedingung, die diese Pruefung vornimmt.

Code: Alles auswählen

while True:
    ...
    if bedingung:
        break
Die Bedingung hast du ja schon, und wie du eine Eingabe vom Benutzer in Python erhaelst, solltest du wissen, oder einfach ergoogeln koennen.
anonym109

Vielen dank für den Tipp ich werde mich daran versuchen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sculprica: Ich würde ein Grundlagentutorial empfehlen, denn Entscheidungen/Verzweigungen und Wiederholungen, sind grundlegende Programmflusssteuerungen, die natürlich in jedem Grundlagentutorial thematisiert werden. Es gibt ein Grundlagentutorial direkt in der Python-Dokumentation, das man mal durchgearbeitet haben sollte.

Warum sollten Ziffern in Namen verboten sein? Und mit `isalpha()` werden ja nicht nur Ziffern ausgeschlossen. Auf der anderen Seite enthält `isalpha()` sicher auch Zeichen die Du dann vielleicht auch nicht in Namen haben möchtest, warum auch immer.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
anonym109

__deets__ hat geschrieben: Montag 13. März 2023, 13:22 Du brauchst zwei weitere Elemente:

- eine while-Schleife, die du abbrichst, wenn dein Kriterium erfuellt ist.
- eine if-Bedingung, die diese Pruefung vornimmt.

Code: Alles auswählen

while True:
    ...
    if bedingung:
        break
Die Bedingung hast du ja schon, und wie du eine Eingabe vom Benutzer in Python erhaelst, solltest du wissen, oder einfach ergoogeln koennen.
Das habe ich bis jetzt daraus gebastelt und es funktioniert zumindest so weit, ist das so korrekt und sauber oder gibt es her noch etwas zu verbessern oder zu verkürzen?
Ich mache das erst 3 Tage mir ist es wichtig neben den Tutorials sich mit anderen auszutauschen um Praxisbezogenes Wissen mit einzubinden.

Code: Alles auswählen

def Vorname():
    while True:

        vorname = input('Bitte Vornamen eingeben')
        vorname = str(vorname.isalpha())
        if vorname != str(vorname.isalpha()):
            print('Bitte nur Buchstaben verwenden!')
            continue
        if vorname == str(vorname.isalpha()):
            print('Eingabe erfolgreich!')
            break
    Nachname()
    
__blackjack__ hat geschrieben: Montag 13. März 2023, 14:00 @Sculprica: Ich würde ein Grundlagentutorial empfehlen, denn Entscheidungen/Verzweigungen und Wiederholungen, sind grundlegende Programmflusssteuerungen, die natürlich in jedem Grundlagentutorial thematisiert werden. Es gibt ein Grundlagentutorial direkt in der Python-Dokumentation, das man mal durchgearbeitet haben sollte.

Warum sollten Ziffern in Namen verboten sein? Und mit `isalpha()` werden ja nicht nur Ziffern ausgeschlossen. Auf der anderen Seite enthält `isalpha()` sicher auch Zeichen die Du dann vielleicht auch nicht in Namen haben möchtest, warum auch immer.
Ja da hast du natürlich recht, ich hatte mir ein paar Grundlagentutorials angesehen, habe dann einfach angefangen das "Hello World" einfach mal zu erweitern um zu sehen wie sich die Dinge zueinander verhalten.
Ich werde mich natürlich weiter einlesen und auch weitere Übungen machen so wie eigene kleine Zeilen um diese Dinge zu verinnerlichen.

Du hattest ja angesprochen das ja noch Zeichen zugelassen werden die man vielleicht nicht haben möchte, könntest du hierzu Beispiele nennen und vielleicht einen Ansatz wo ich diese Parameter einbinden muss damit Sie greifen.

Vielen Dank nochmal, ich finde es sehr gut das hier nur ein paar Denkanstöße gegeben werden so hat man die Möglichkeit den Weg zu finden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen werden wie Variablennamen auch, komplett klein geschrieben. Funktionen sollten nach Tätigkeiten benannt sein, also vorname_eingeben.
`continue` sollte man sehr sparsam einsetzen, wird auch selten gebraucht, und ist hier komplett überflüssig. Wenn man einmal ein if-Bedingung hat und gleich danach die exakte Umkehrung, dann benutzt man else:

Code: Alles auswählen

def vorname_eingeben():
    while True:
        vorname = input('Bitte Vornamen eingeben')
        vorname = str(vorname.isalpha())
        if vorname != str(vorname.isalpha()):
            pass
        else:
            print('Eingabe erfolgreich!')
            break
Natürlich würde man hier die Bedingung einfach umdrehen und den pass-Block weglassen.
Jetzt solltest Du die einzelnen Befehle durchgehen, und schauen, was das Ergebnis ist.
Zuerst liest Du einen String ein, und vergleichst den per isalpha. Das kann die Boolschen Werte True oder False annehmen, den Du dann in einen String ("True" bzw. "False") umwandelst. Dann machst Du das selbe nochmal `str(vorname.isalpha())`, da aber nun vorname entweder "True" oder "False" enthält, ist die isalpha-Abfrage immer True, was immer "True" ergibt.
Wir kommen also zu:

Code: Alles auswählen

def vorname_eingeben():
    while True:
        vorname = input('Bitte Vornamen eingeben')
        vorname = str(vorname.isalpha())
        if vorname == "True":
            print('Eingabe erfolgreich!')
            break
Einen boolschen Wert aber in einen String umzuwandeln um dann mit einem String zu vergleichen ist sehr umständlich, kann man einfach weglassen:

Code: Alles auswählen

def vorname_eingeben():
    while True:
        vorname = input('Bitte Vornamen eingeben')
        vorname = vorname.isalpha()
        if vorname == True:
            print('Eingabe erfolgreich!')
            break
Mit True muß man nicht explizit vergleichen, so dass wir letztlich auf diesen Code kommen:

Code: Alles auswählen

def vorname_eingeben():
    while True:
        vorname = input('Bitte Vornamen eingeben')
        if vorname.isalpha():
            print('Eingabe erfolgreich!')
            break
Der Wert von `vorname` hat sich jetzt natürlich geändert, da Du aber eh nichts weiter mit dem Wert machst, ist das in Ordnung.
Eine Funktion, die den Vornamen abfragt sollte nicht eine Funktion aufrufen, die den Nachnamen abfragt, das sollte an der Stelle passieren, wo vorname_eingeben aufgerufen wird.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ist ne Menge falsch. Es fängt damit an, dass du deine Eingabe durch die Verwendung des gleichen Namens für das Ergebnis der Prüfung auf Buchstaben einfach zerstörst. Du weißt jetzt also nur, das mal wer das richtige eingegeben hat, aber nicht mehr, was.

Das str(…) um einen boolschen wert herum ist auch unsinnig, genauso wie die Bedingung danach im if. Du wandelst einen boolsche Wert in einen String, und prüfst, ob das Wort „True“ oder „False“ isalpha ist. Das ist natürlich immer wahr. Das gehört alles auf den Müll, ein simple

Code: Alles auswählen

if name.isalpha():
   …. 
ist alles, was da benötigt wird.

Zu guter letzt rufst du Nachname() auf, obwohl das nichts darin zu suchen hat, und eh keinen Sinn hat: ein Nachname unterscheidet sich doch garnicht (für deine Prüfung zumindest) von einem Vornamen. Da kannst du also einfach zweimal die gleiche Funktion benutzen.

Code: Alles auswählen

vorname = erfrage_name(“Bitte Vornamen eingeben”)
nachname = erfrage_name(“Bitte Nachnamen eingeben”)
anonym109

Vielen Dank für eure Korrekturen und Hinweise.

Ich habe spaß daran etwas zu programmieren und möchte mich damit etwas ausgiebiger beschäftigen.

Für die meisten von euch ist das Code schreiben wahrscheinlich relativ einfach, aber für mich noch viel Neuland gerade was Struktur/Aufbau/Sauberkeit und verknüpfen angeht.

Ob nun sauber / richtig oder nicht, fasziniert mich die Tatsache das es trotzdem funktioniert auch wenn man die genannten Doppelschritte /Fehler macht,
ich denke das diese auch daher rühren weil man nur einige wenige Grundbegriffe und Funktionen so wie deren Einsatz kennt.

Ich werde mal eine Projektaufgabe im Forum einstellen und hier mal ein etwas ausführlicher in die Materie einsteigen trotz vorhandener Übungen reizt es mich schon sehr auch mal etwas abseits der üblichen Übungen zu schauen und ein Problem einfach so anzugehen.

Nochmal vielen Dank für eure Freizeit und die Bereitschaft einem Anfänger aufs Fahrrad zu helfen :-)
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

while True:
name = input("Bitte geben Sie Ihren Namen ein: ")
if name.isalpha():
print("Vielen Dank, dass Sie Ihren Namen eingegeben haben!")
break
else:
print("Ihr Name darf nur Buchstaben enthalten. Bitte geben Sie Ihren Namen erneut ein.")

für if name.isalpha(): kann man auch einen regulären Ausdruck (import re) wählen, die abfragt ob in name [a-zA-Z] +Leerzeichen drin sind.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

@Ernie1412: Die Lösung mit dem regulären Ausdruck ist falsch. Ich soll dir schöne Grüße von Jürgen ausrichten, der jetzt nicht mitspielen darf.

Code: Alles auswählen

>>> import re
>>> pattern = re.compile("^[a-zA-Z]*$")
>>> "Paul".isalpha()
True
>>> print(pattern.match("Paul"))
<re.Match object; span=(0, 4), match='Paul'>
>>> "Jürgen".isalpha()
True
>>> print(pattern.match("Jürgen"))
None
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Denk mal weiter, warum False ? äüö evtl ? Ich habe damit nur andeuten wollen das man auch ein regulären Ausdruck verwenden kann. Wie genau aussieht hab ich garnicht geschrieben. Das müsste man natürlich anpassen. Ich dachte immer hier sind nur kluge Köpfe unterwegs :mrgreen:
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ernie1412 hat geschrieben: Mittwoch 15. März 2023, 10:17 Denk mal weiter, warum False ? äüö evtl ? Ich habe damit nur andeuten wollen das man auch ein regulären Ausdruck verwenden kann. Wie genau aussieht hab ich garnicht geschrieben. Das müsste man natürlich anpassen. Ich dachte immer hier sind nur kluge Köpfe unterwegs :mrgreen:
Ich dachte du leistest Hilfe vom Anfänger für Anfänger, ohne Fachchinesisch. Und jetzt gibt’s eine halb funktionierend Lösung, und der arme Anfänger darf selbst sehen, wie er das löst? Da wollte wohl nur wer angeben, dass er auch was weis….
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Wohin soll jetzt die Diskussion führen @deets ? Schreib doch bitte auch mal Vorschläge, Lösungen anstatt immer wieder solche Diskussionen anzufangen?!!
Benutzeravatar
grubenfox
User
Beiträge: 413
Registriert: Freitag 2. Dezember 2022, 15:49

darf ich darauf hinweisen dass die ganzen Lösungen mit .isalpha() auch alle fehlerhaft sind? ;)

(geschrieben im Auftrag von Karl-Heinz Rummenigge und Heinz-Harald Frentzen und ...)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Du hast den Beitrag von sparrow falsch verstanden. Der braucht nicht weiter denken, das hatte er nämlich bereits und ihm war auch klar, das Jürgen wegen dem "ü" nicht geht. Genau das war ja der Punkt, das es gar nicht so einfach ist einen regulären Ausdruck dafür zu schreiben ohne willkürlich Namen auszuschliessen oder Leute zu zwingen ihren Namen zu verfälschen, damit sie ihn eingeben können.

Es gibt ja auch nicht nur Umlaute (übrigens nicht nur äöü, sondern beispielsweise auch ï), sondern auch Accents, Cedilla, Tilde, ”durchgestrichene” Buchstaben (Bjørn), Kringel/Kreise (Ångström), Ligaturen wie æ/Æ oder in Martijn, und selbst innerhalb von Europa komplett andere Alphabete wie griechisch oder kyrillisch. Es gibt Doppelnamen die mit einem Bindestrich getrennt werden. Also auch tatsächlich mit "–" oder "—" statt einem ASCII-Minus ("-"). Es gibt Namen die eine Ordnungszahl enthalten, oft als römische Ziffern geschrieben (Johannes–Paul Ⅳ.) und so weiter ("Ⅳ" ist *ein* Zeichen!).
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Jedes Unicode-Zeichen ist einer Kategorie zugeordnet. Laut Dokumentation erlaubt isalpha alle Letter-Kategorien,also lowercase, modifier, other, titelcase und uppercase.
Wörter, die mit Kombinierten Zeichen geschrieben werden, wie 'Jürgen' fallen also nicht darunter. Die Frage hier ist, ob jemand der sich gerne 'J̈urgen' schreibt, als Namen erlaubt sein soll, oder nicht, und wie unterscheidet das sich von 'Jürgen'?
Eine Variante wäre also, Zeichen in ihre kombinierte Form zu bringen um dann alle Letter-Kategorien und Bindestrich und nicht umbrechender Viertelgeviertstrich (falls jemand seinen Namen nicht getrennt sehen möchte) zu erlauben.

Code: Alles auswählen

name = 'Heinz‑Jürgen'
re.fullmatch(r"([^\W\d_]|[-‑])+", unicodedata.normalize('NFC', name))
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

siehste der Sirius3 kommt mit einer Lösung. Sowas wie unicodedata.normalize('NFC', name) kannte ich vorher garnicht. :o
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ernie1412 hat geschrieben: Mittwoch 15. März 2023, 11:24 Wohin soll jetzt die Diskussion führen @deets ? Schreib doch bitte auch mal Vorschläge, Lösungen anstatt immer wieder solche Diskussionen anzufangen?!!
Ich hab die Erfahrung gemacht, er hilft ein mehr als hier. Das ist meine persönliche Erfahrung.
ich hab ne Idee, ich erstell ein kleines Programm, das mir den code bei variablen kleinschreibt. (text.lower()). Danach kriege ich sicherlich hier Top Antworten von Professionellen Users :D
Man hätte auch sagen können überflüssig, doppeltgemoppelt. Aber natürlich redudant hört sich sehr schlau an.
Alles Zitate von dir... du bist derjenige, der permanent seinem Minderwertigkeitskomplex freien Lauf laesst, und hier gegen Leute staenkert. Und das sind ja nur die letzten 2 Wochen oder so... also, mach's selber besser, und wenn du rumpaulst, wird halt auch zurueckgepault. So einfach ist das.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Ernie1412 hat geschrieben: Mittwoch 15. März 2023, 10:17Ich habe damit nur andeuten wollen das man auch ein regulären Ausdruck verwenden kann. Wie genau aussieht hab ich garnicht geschrieben.
Ähm, ja doch. Hast du geschrieben:
Ernie1412 hat geschrieben: Mittwoch 15. März 2023, 03:04 für if name.isalpha(): kann man auch einen regulären Ausdruck (import re) wählen, die abfragt ob in name [a-zA-Z] +Leerzeichen drin sind.
Gut, ich habe die Leerzeichen draußen gelassen, aber darum ging es mir ja auch nicht.
Mir ging es darum, dass deine Alternative ("für [...] kann man auch [...] wählen") keine Alternative mit identischem Verhalten ist.
Antworten