Problem mit einer if Anweisung?

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
Subtalis

Guten Abend, ich bin seit gestern dabei Python zu lernen.

Zur Übung bin ich gerade dabei ein Skript zu schreiben was Charaktere erstellt und in Zukunft in eine Datei speichern soll.
Sitze jedoch gerade an ein Problem fest mit der if Anweisung, es geht um eine Abfrage, das fragt um welches Geschlecht bei dem Charakter es sich handeln soll (M oder F)

Code:

Code: Alles auswählen

def RegisterCharacter():
	name = input('Hello & welcome to my Character Creator tool.\n What is your name?')
	while True:
		gender = input('Is your gender M or F?\n')
		if gender != 'M' or gender != 'F':
			print('Failed, you must type M or F only!: ' + gender)
		else:
			break
			
RegisterCharacter()
print('Character successful created!')
Beim ausführen dieses Skript, springt es immer wieder erneut auf "print('Failed, you must type M or F only!: ' + gender)" zu wenn ich den Buchstabe M oder F (Auch großgeschrieben) eingebe.

Zur Testzwecke habe ich mal die if Anweisung umgeschrieben auf:
if gender != 'M':

Da habe ich "or gender != 'F':" weg gelassen und die Eingabe "M" wird bei mir erkannt bzw. wird die while schleife auch abgebrochen und erhalte die Meldung "Character successful created!"

Woran kann es genau liegen?
Zuletzt geändert von Subtalis am Samstag 24. Juni 2017, 00:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Subtalis

Problem erledigt! :mrgreen:

Ich habe nun "==" benutzt anstatt "!=" und das break & print in den Zeilen vertauscht.
So funktioniert das ganze nun. Warum auch immer :K
BlackJack

@Subtalis: Nicht warum auch immer sondern weil ``or`` zwei Bedingungen verknüpft und das Ergebnis genau dann wahr ist wenn die eine *oder* wahr ist. Und wenn Du M oder F eingibst, dann ist halt entweder die erste Teilbedingung wahr oder die zweite und damit der gesamte Ausruck. Und wenn der Ausdrück hinter dem ``if`` wahr ergibt, dann wird der ``if``-Zweig ausgeführt. Das kann man doch auch ganz einfach in einer Python-Shell nachvollziehen:

Code: Alles auswählen

In [3]: gender = 'M'

In [4]: gender != 'M'
Out[4]: False

In [5]: gender != 'F'
Out[5]: True

In [6]: False or True
Out[6]: True

In [7]: gender = 'F'

In [8]: gender != 'M'
Out[8]: True

In [9]: gender != 'F'
Out[9]: False

In [10]: True or False
Out[10]: True
Interessant auch:

Code: Alles auswählen

In [11]: gender = 'X'

In [12]: gender != 'M'
Out[12]: True

In [13]: gender != 'F'
Out[13]: True
Das heisst es gibt überhaupt gar keine Eingabe bei der jemals gesamt `False` heraus käme, denn das müsste eine Zeichenkette sein die *gleichzeitig* 'M' und 'F' ist.

Äquivalent zu Deinem Ausdruck wäre ``not (gender == 'M' and gender == 'F')`` — vielleicht hilft das beim Verständnis warum das nicht gehen kann weil das immer wahr ist.

Was Du ohne Vertauschen der Zweige hättest schreiben können wäre

Code: Alles auswählen

not (gender == 'M' or gender == 'F')
oder

Code: Alles auswählen

gender != 'M' and gender != 'F'
Subtalis

Vielen Dank für deine Ausführliche Erklärung dazu! Ab dem Punkt:
Äquivalent zu Deinem Ausdruck wäre ``not (gender == 'M' and gender == 'F')`` — vielleicht hilft das beim Verständnis warum das nicht gehen kann weil das immer wahr ist.'
hat es bei mir klick gemacht :mrgreen:
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

Subtalis hat geschrieben:Guten Abend, ich bin seit gestern dabei Python zu lernen.

Zur Übung bin ich gerade dabei ein Skript zu schreiben was Charaktere erstellt und in Zukunft in eine Datei speichern soll.
Sitze jedoch gerade an ein Problem fest mit der if Anweisung, es geht um eine Abfrage, das fragt um welches Geschlecht bei dem Charakter es sich handeln soll (M oder F)

Code:

Code: Alles auswählen

def RegisterCharacter():
	name = input('Hello & welcome to my Character Creator tool.\n What is your name?')
	while True:
		gender = input('Is your gender M or F?\n')
		if gender != 'M' or gender != 'F':
			print('Failed, you must type M or F only!: ' + gender)
		else:
			break
			
RegisterCharacter()
print('Character successful created!')
Beim ausführen dieses Skript, springt es immer wieder erneut auf "print('Failed, you must type M or F only!: ' + gender)" zu wenn ich den Buchstabe M oder F (Auch großgeschrieben) eingebe.

Zur Testzwecke habe ich mal die if Anweisung umgeschrieben auf:
if gender != 'M':

Da habe ich "or gender != 'F':" weg gelassen und die Eingabe "M" wird bei mir erkannt bzw. wird die while schleife auch abgebrochen und erhalte die Meldung "Character successful created!"

Woran kann es genau liegen?


Ich würde dies so lösen:

Code: Alles auswählen

def RegisterCharacter():
    name = input("Hello & welcome to my Character Creator tool.\n What is your name?")
    gender = input("Is your gender M or F?\n")
    while gender != "M" or gender != "F"
        input('Failed, : ' + gender + " is not a valid letter. Is your gender M or F?\n")
    print('Character successful created!')
         
if __name__ == "__main__":      
    RegisterCharacter()
Liebe Grüsse
nono
Zuletzt geändert von Anonymous am Samstag 24. Juni 2017, 14:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@nono191: Das ist eine Endlosschleife weil innerhalb der Schleife nichts passiert was die Bedingung ändern würde.
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

BlackJack hat geschrieben:@nono191: Das ist eine Endlosschleife weil innerhalb der Schleife nichts passiert was die Bedingung ändern würde.

Code: Alles auswählen

    
    def RegisterCharacter():
        name = input("Hello & welcome to my Character Creator tool.\n What is your name?")
        gender = input("Is your gender M or F?\n")
        while gender != "M" or gender != "F"
            gender = input('Failed, : ' + gender + " is not a valid letter. Is your gender M or F?\n")
        print('Character successful created!')
             
    if __name__ == "__main__":      
        RegisterCharacter()
Aha Ja Sorry so wie oben.
Wie kann ich den Code als Python Code definieren?

LG nono
Zuletzt geändert von Anonymous am Samstag 24. Juni 2017, 15:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@nono191: Über dem Eingabefeld für den Beitrag ist eine Dropdown-Auswahl mit dem Titel „Code auswählen“. Übersieht man leicht. :-)

@Subtalis: M und F sind übrigens sehr einschränkend. Gerade bei Rollenspielcharakteren sollte man da mehr Freiheiten lassen. Vielleicht möchte ja jemand ein Engel sein. Oder ein Baum. Oder ein Wesen bei dem das Geschlecht wechseln kann, oder das in einer Lebensphase ist, wo es noch gar keines hat, oder ein Zwitter, oder…
Antworten