Warum Funktioniert mein Python Programm nicht, obwohl es fehlerfrei ist?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich denke, es funktioniert deswegen nicht, denn

def ep1wam1():
        ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))

die Variable ep1wam1 ist eine locale Variable und wird unten nicht erkannt. Eigentlich müsste eine Fehler rauskommen...

FormulaSun12 
Fragesteller
 13.07.2022, 14:25

Und was kann ich dagegen tun?

0
pushido  13.07.2022, 14:28
@FormulaSun12

vor dem def schreib sowas wie ep1wam1 = 0, damit diese Variable im Hauptverlauf einmal definiert wird.

1
FormulaSun12 
Fragesteller
 13.07.2022, 14:39
@pushido

Tut mir leid, aber es klappt immer noch nicht.

Ich habe es so eingetippt:

ep1wam1 = 0


def ep1wam1():
        ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
0
GuteAntwort2021  13.07.2022, 14:46
@FormulaSun12

Muss man in Python nicht beim Deklarieren/Verändern einer Variable das Schlüsselwort global benutzen, wenn man die globale Variable ansprechen möchte, statt einer lokalen zu erzeugen?

Man kann globale Variablen zwar abfragen ohne das Schlüsselwort, aber keine Werte zuweisen, sonst wird eine lokale erstellt.

ep1wam1 = 0
def ep1wam1():
	global ep1wam1
	ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
2
pushido  13.07.2022, 14:54
@GuteAntwort2021

genau das wollte ich auch schreiben!

Und schreibe bitte (übersichtshalber) unterschiedliche Namen für eine Funktion und eine Variable, aber GuteAntwort2021 hat recht und somit funktioniert es auch!

1
FormulaSun12 
Fragesteller
 13.07.2022, 15:21
@GuteAntwort2021

Vielen Dank! So Funktioniert es wirklich. Blöd ist: Wenn ich bei Erneut versuchen auf die 1 klicke dann Passiert das gleiche wie vorhin. Warum???

0
GuteAntwort2021  13.07.2022, 15:26
@FormulaSun12

Du musst auf den Zeileneinzug etc. achten.

In Python ist:

if True:
	if False:
		print("Falsch")
	if True:
		print("Wahr")

etwas anderes als

If True:
	if False:
		print("Falsch")
		if True:
			print("Wahr")
0
GuteAntwort2021  13.07.2022, 15:37
@FormulaSun12

Ansonsten beherzige den Tipp von pushido und nenn die Funktion anders.

# ep = Episode
# wam = wahlmöglichkeiten
# wa = Wahl
# er = erneut
# sf = sicherheitsnachfrage

from time import sleep

episode1 = True
episode2 = False
ep1wam1 = 0

def func_ep1wam1():
    global ep1wam1
    ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))

# Begrüßung
name = input ("Name?") # Frägt nach Namen
print ("Wilkommen", name, ",")
print ("Beantworte die Fragen mit den angegebenen Antworten. Die angegebenen Antworten sind in Klammern")
sleep (1.0)
input ("Drücken sie eine Taste um fortzufahren!")
print ("Spiel Ladet, bitte warten...")
sleep (3.0)

# Episodenauswahl
episode = int(input ("Episodenauswahl, bitte wählen sie einen Episod! (1);(2)"))

# Wenn Episode 1 wurde ausgewählt und episode1 ist True dann:
if episode1 == True and episode == 1:
    print ("EPISODE 1")
    sleep (1.5)
    print ("20. JUNI 2022")
    sleep (1.5)
    print ("DU STEHST VOR EINEM RIESEGNEN, GUT BEWACHTEN GELDSPEICHER WO DU EINBRECHEN WILLST!")
    sleep (1.5)
    print()
    print ("WÄHLE EINEN DIESER SACHEN UND PROBIERE REINZUKOMMEN! ABER PASS AUF! DAS GEBÄUDE WIR SEHR STRENG ÜBERWACHT! VIEL GLÜCK!")
    print ()
    sleep (1.5)
    func_ep1wam1()

    # Wenn der Laserschneider ausgewählt wurde:
    if ep1wam1 == 1:
        print ("Die Maschine schneidet einen großen Loch in die Wand.")
        sleep(1.5)
        print ("Das hätte prima funktioniert wenn das ausgeschneidete Teil nicht auf dich draufgefallen wäre :/")
        sleep(1.5)
        print ("FAIL!")
        ep1wam1wa1er = int(input ("Erneut versuchen? (1 für ja);(2 für nein)"))

        if ep1wam1wa1er == 1:
            func_ep1wam1()
        elif ep1wam1wa1er == 2:
            ep1wam1wa1sf = int (input ("Das Spiel hört hier auf. Bist du sicher das du verlassen möchtest? Das Spiel Speichert NICHT! (1=ja);(2=nein)"))

            if ep1wam1wa1sf == 1:
                func_ep1wam1()
                
            elif ep1wam1wa1sf == 2:
                quit()

# Wenn Episode 2 noch nicht freigeschalten ist dann:

elif episode2 == False and episode == 2:
    print ("Diese Episode ist noch gesperrt! Schliese erst die Anderen ab!")

Aber: Du hast keinerlei Schleifenmechanik implementiert. Es läuft also quasi von oben nach unten durch. Es wird dann zwar erneut die Funktion abgerufen, aber das Programm springt dann nicht zu dem Funktionsaufruf oder so. Es führt die Funktion aus und läuft dann von dem Punkt weiter.

Also führt es:

if ep1wam1wa1er == 1:
            func_ep1wam1()

aus und danach ist Ende.

0

Die Variable "ep1wam1" existiert nur im lokalem Scope deiner Funktion "ep1wam1", da sie dort erstmalig verwendet wird.

Da, wo du die gleichnamige Variable prüfst, greifst du aber auf eine gleichnamige Variable im globalem Scope zu, die noch keinen Wert hat, deshalb evaluiert die if-Abfrage zu "false".

Zum lösen musst du entweder "ep1wam1" vor deiner Funktion deklarieren oder den Wert der Abfrage anderweitig (beispielsweise als Rückgabewert) aus deiner Funktion hinaus propagieren.

Habe nur mal kurz darüber geschaut. Nenne die Variablen und Funktionen nicht gleich. Eventuell ist der Fehler da. Ich bin kein Python Experte, aber das sieht falsch aus. Probiere es mal und gib dann gerne eine Rückmeldung, ob es das war

FormulaSun12 
Fragesteller
 13.07.2022, 14:34

Sorry, bin auch kein Python Experte aber wenn ich das jetzt richtig verstanden habe dann muss ich den

def ep1wam1():
        ep1wam1 = int(input ("")

nicht zwischen die True und False Variablen hintun?

0
FaTech  13.07.2022, 15:08
@FormulaSun12

Nein, meine Idee war, die Variable nicht so zu nennen, wie die Funktion.

def ep1wam1(): und ep1wam1 heißen gleich. Benenne einen der beiden um

1
FormulaSun12 
Fragesteller
 13.07.2022, 15:10
@FaTech

Nein klappt leider auch nicht. Aber trotzdem Danke!

0
obwohl es fehlerfrei ist?

Offensichtlich ist es nicht fehlerfrei, sonst würde es ja funktionieren.

FormulaSun12 
Fragesteller
 13.07.2022, 18:16

Naja damit meine ich das es keine Fehlermeldung gibt.

0
Schachpapa  13.07.2022, 22:48
@FormulaSun12

Ja, aber wie du spätestens jetzt gelernt hast: Nicht jedes Programm, das keine Syntaxfehler hat und auch zur Laufzeit nicht abstürzt, macht was es soll. Das sind dann die logischen Fehler, die meist viel schwerer zu finden sind.

0
müsste schon bei


 "name = input ("Name?")" 


ein prompt anzeigen und auf Eingabe warten.

Also stimmt vermutlich irgendetwas mit entweder
dem Aufruf des Scriptes nicht, oder mit deiner
Python Installation.

Sorry. ich hab Stückel gequotet, und
bekomme jetzt das quote attribut vom Text nicht weg.

FormulaSun12 
Fragesteller
 13.07.2022, 14:37

Tut mir Leid aber Irgendwie glaube ich das es hier nicht der Fall ist. Falls doch, dann Melde ich mich nochmal.

Aber vielen Dank für die Antwort!

0
FormulaSun12 
Fragesteller
 13.07.2022, 14:46
@Bushmills145

Gerade Eben ja. Ergebnis:

Das gleiche wie im Python.

Aber Vielen Dank für den Versuch!

0
Bushmills145  13.07.2022, 14:50
@FormulaSun12

biddewas? dasselbe? nee - der screenshot zeigt doch, dass es ausgeführt wird - da wird das Prompt nach Name doch angezeigt. Ohne dass der Script abgearbeitet würde, könnte doch auch das Prompt nicht angezeigt werden.

Also nicht dasselbe, sondern anderes, weil bei dir: "das Programm nicht ausgeführt wird"

0
FormulaSun12 
Fragesteller
 13.07.2022, 14:53
@Bushmills145

Entschuldigung, aber irgendwie kapier ich das irgendwie nicht richtig. Also was ist der unterschied statt es im Python Shell laufen zu lassen?

0
Bushmills145  13.07.2022, 14:59
@FormulaSun12

Sollte kein Unterschied sein. Bei Unixoiden würdest du aber auf der ersten Zeile noch ein hashbang aka shebang zufügen wollen, in dem angegeben wird, mit welchem Programm der Script zu öffnen ist. Ausserdem würdest du execute-permission setzen wollen. Aber ohne Meldung abbrechen würde Fehlen von keinem der beiden machen.

Gesehen dass da weder ein hashbang drinsteht noch ich execute permission gesetzt hatte, hab ich darum den Namen der Datei des Scripts als Argument an den Aufruf des Interpreters mitgegeben.

0