Problem mit if, elif und else

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
C0dingT1me
User
Beiträge: 5
Registriert: Mittwoch 19. September 2018, 01:27

Hallo,

während ich Python lerne, erstelle ich mir einen virtuellen Einkaufsladen und halte ihn auf den aktuellsten Stand im Verhältnis zu meiner bishergelernten Fähigkeiten.


Habe ein Problem mit diesem Code:
Er beachtet nicht die Bedingungen ganzgleich, ob ich "Vodka" oder "blajsdjdsa" schreibe.
Das gleiche betrifft das Alter.
Die Variable "Vodka()" habe ich erstellt, weil er mir sonst sagt "NameError: name 'Vodka' is not defined", was ich nicht verstehen kann, denn das Wort "Vodka" fließt doch in die Variable "Ware" ein - oder nicht?

Bitte hackt mir nicht den Kopf ab :|

Code: Alles auswählen


#___________________Kauf____________

Ware = raw_input("Was willst du kaufen?")
Alter = raw_input("Bist du schon 18?")
Vodka = ()

if Ware == Vodka:
	print Alter
	if Alter < 18:
		print "Sorry du bist zu jung"
	elif Ware == Bier:
		print Alter
	elif Alter <= 15:
		print "Sorry du bist zu jung"
	else:
		print "Bitteschoen"		
Sirius3
User
Beiträge: 17709
Registriert: Sonntag 21. Oktober 2012, 17:20

`Ware` ist ein String, den Du mit einem anderen String vergleichen kannst, `Vodka` ist dagegen eine Variable die ein leeres Tuple enthält. Wenn Du Ware mit dem Wort Vodka vergleichen willst, dann mußt Du es, wie die anderen Strings bei print und raw_input in Anführungszeichen schreiben.

Weiter unten ist dann die Zeile mit Bier falsch eingerückt, denn so macht sie keinen Sinn: Ware kann nicht gleichzeitig Vodka und Bier sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ein weiteres Problem ist der Vergleich zwischen `Alter`, was eine Zeichenkette ist, und Zahlen. Das wird nicht wie gewünscht funktionieren, denn wenn man in Python 2 unterschiedliche Typen mit einander vergleicht, dann sind alle Werte des einen Typs grundsätzlich kleiner oder grösser als alle Werte des anderen Typs. Wie rum ist nicht definiert und kann sich sogar von einem Programmaufruf zum anderen ändern. Du musst das eingegebene Alter in eine Zahl umwandeln und die dann für die Vergleiche verwenden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hast du irgend einen ganz speziellen Grund, mit Python 2 zu lernen?
Aktuell gibt es Python 3.7 und Python 2 wird nur noch da benutzt, wo keiner mehr da ist um den Code nach Python 3 zu konvertieren. (imho :-) )
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
C0dingT1me
User
Beiträge: 5
Registriert: Mittwoch 19. September 2018, 01:27

Vielen Dank für die Antworten.
Ich lerne Python 2, weil auf codecademy.com für Python 3 kein Kurs zur Verfügung steht.

Also immerhin habe ich es jetzt hinbekommen, dass er auf das Alter reagiert (Aber erst am Schluss). Allerdings fragt er, nach der Beantwortung der 18-er Frage, ob ich schon 16 sei und dabei habe ich "Vodka" eingetippt.

Folgendes bekomme ich raus:

Was willst du kaufen?Vodka
Bist du schon 18?10
Bist du schon 16?13
10
Sorry du bist zu jung


So sieht der Code jetzt aus:

Code: Alles auswählen

Ware = raw_input ("Was willst du kaufen?")
AlterVodka = int(raw_input("Bist du schon 18?"))
AlterBier = int(raw_input("Bist du schon 16?"))
Vodka = str()
Bier = str()

if Ware == "Vodka":
	print AlterVodka
	if AlterVodka < 18:
		print "Sorry du bist zu jung"
elif Ware == "Bier":
	print AlterBier
	if AlterBier <= 15:
		print "Sorry du bist zu jung"
else:
	print "Bitteschoen"			
Sirius3
User
Beiträge: 17709
Registriert: Sonntag 21. Oktober 2012, 17:20

Du fragst erst nach Ware, dann nach AlterVodka dann nach AlterBier, wobei die zwei Fragen logisch mit Ja oder Nein als mit einer Zahl zu beantworten sind. Erst dann kommen die if-Abfragen.
Die Variablen Vodka und Bier werden nicht benutzt.
C0dingT1me
User
Beiträge: 5
Registriert: Mittwoch 19. September 2018, 01:27

Sirius3 hat geschrieben: Mittwoch 19. September 2018, 20:39 wobei die zwei Fragen logisch mit Ja oder Nein als mit einer Zahl zu beantworten sind.
Das ist richtig, aber im Grunde genommen, ist das doch egal, ob da jetzt diese Frage steht oder "Wie alt bist du?" oder "jsalhffdads".
Ich möchte, dass er die Zahlengrößen überprüft und dementsprechend reagiert.
C0dingT1me
User
Beiträge: 5
Registriert: Mittwoch 19. September 2018, 01:27

OK habs hinbekommen :)
Vielen vielen Dank für die Hinweise TOP!!!

Code: Alles auswählen

Ware = raw_input ("Was willst du kaufen?")

if Ware == "Vodka":
	Vodka = str()
	AlterVodka = int(raw_input("Wie alt bist du?"))
	print AlterVodka
	if AlterVodka < 18:
		print "Sorry du bist zu jung"
elif Ware == "Bier":
	Bier = str()
	AlterBier = int(raw_input("Wie alt bist du?"))
	print AlterBier
	if AlterBier <= 15:
		print "Sorry du bist zu jung"
else:
	print "Bitteschoen"	

Nachtrag: Ich merke grad, dass die Variablen "Vodka = str()" und "Bier = str()" unnötig sind. Hab mich schon gefragt, wozu die da sind...^^
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@C0dingT1me: An der Lösung ist die Codewiederholung unschön. Sowohl Code als auch Daten sollte man nicht wiederholen. Wenn man daran etwas ändern will/muss, dann muss man das bei allen Kopien im Quelltext machen und bei allen gleich machen. Das ist fehleranfällig, weil man eine Kopie vergessen kann, oder nicht jede gleichwertig ändert. Die beiden ``if``/``elif``-Zweige unterscheiden sich im Grunde ja nur durch das Alter, also kann man das als Funktion herausziehen, die das Alter als Argument erwartet:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function


def pruefe_alter(mindestalter):
    alter = int(raw_input('Wie alt bist Du?'))
    if alter < mindestalter:
        print('Sorry, Du bist zu jung')


def main():
    ware = raw_input('Was willst du kaufen?')

    if ware == 'Vodka':
        pruefe_alter(18)
    elif ware == 'Bier':
        pruefe_alter(16)
    else:
        print('Bitteschoen')


if __name__ == '__main__':
    main()
So ganz schön ist auch diese Lösung noch nicht, denn die Zuordnung von Getränk zu Mindestalter ist hier als Code ausgedrückt — eigentlich sind das aber Daten:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function


def main():
    ware_zu_mindestalter = {
        'Bier': 16,
        'Vodka': 18,
    }
    ware = raw_input('Was willst du kaufen?')
    mindestalter = ware_zu_mindestalter.get(ware)
    if mindestalter != None:
        alter = int(raw_input('Wie alt bist Du?'))
        if alter < mindestalter:
            print('Sorry, Du bist zu jung')
    else:
        print('Bitteschoen')


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
C0dingT1me
User
Beiträge: 5
Registriert: Mittwoch 19. September 2018, 01:27

Eine Funktion für die Altersprüfung, habe ich auch schon erstellt (Ich behandle grad das Thema "Funktionen" im Tutorial) und das ist schon ganz praktisch.
Im letzten Code ist das noch geschickter: Da braucht man zukünftig nur die Ware und das Mindestalter eintragen und der Rest wird schon gemacht.

Allerdings sind mir manche Dinge im Code von der Bedeutung nicht ganz so klar. Ich versuche es aber mal spontan (ohne zu googeln) zu interpretieren:
Korrigiert mich, falls ich falsch liege. Im Code ist die Interpretation als Kommentar zu lesen.

Code: Alles auswählen

from __future__ import absolute_import, division, print_function 


def main(): # Eine Funktion, die "main" heißt.
    ware_zu_mindestalter = { # Eine art Liste der Waren bzw. Variablen ???
        'Bier': 16,     
        'Vodka': 18,
    }
    ware = raw_input('Was willst du kaufen?')
    mindestalter = ware_zu_mindestalter.get(ware)   # Ich beziehe "ware_zu_mindestalter" mit ein und berücksichtige die Eingabe "ware" wegen "get(ware)?
    if mindestalter != None:  # Wenn die Variable "mindestalter" ohne Zeichen steht, dann.....
        alter = int(raw_input('Wie alt bist Du?'))
        if alter < mindestalter:
            print('Sorry, Du bist zu jung')
    else:
        print('Bitteschoen')


if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17709
Registriert: Sonntag 21. Oktober 2012, 17:20

›ware_zu_mindestalter‹ ist ein Wörterbuch (eine Art Liste von Schlüsseln mit Werten). ›ware_zu_mindestalter.get‹ ist eine Methode, um Werte zu Schlüsseln abzufragen. Der Wert ›None‹ bedeutet hier, „Schlüssel existiert nicht”.
Antworten