Hilfe benötigt, code ohne def lauffähig...

Code-Stücke können hier veröffentlicht werden.
Antworten
Odox
User
Beiträge: 9
Registriert: Montag 25. Juni 2018, 19:10

Montag 25. Juni 2018, 19:21

Hallo Community,
ich bringe mir gerade Python beide und löse verschiedene Aufgaben. Ich habe meine eine Aufgabe fast zufriedenstellend gelöst, bis ich bemerkt habe das ich das alles in eine Funktion packen sollte.

Code: Alles auswählen

total = 0
item_add = ""
items = "Items\n "
report = ""


def adding_report(report):
	report = input("Chose Report Type (\"A\" or \"T\"):")

	while True:

		item_add = input("Enter an integer or \"Q\"")

		if item_add.isdigit():

			total = total + int(item_add)

			items = items + item_add + "\n "

		elif item_add == "Q" :

			if report == "A":

				print(items)

				print("Total\n" + str(total))

				break

			elif report == "T":

				print("Total\n" + str(total))

				break

		else:

			print(item_add + " " + "is invalid input")


print("Report Types include All Items (\"A\" or Total Only \"T\")")
adding_report(report)
Die Fehlermeldung die mir gezeigt wird, versteh ich nicht :/

Traceback (most recent call last):
File "python", line 42, in <module> #???
File "python", line 15, in adding_report #???
UnboundLocalError: local variable 'total' referenced before assignment #ich hab doch die variable total gleich am Anfang platziert?

Für etwas Erleuchtung wäre ich sehr dankbar!

Gruß Odox
Zuletzt geändert von Odox am Montag 25. Juni 2018, 19:47, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 8433
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 25. Juni 2018, 19:33

das nächste mal bitte Code in Code-Tags einfassen (z.B. über den [ Python ]-Knopf über dem Editfeld im vollständigen Editor), dann kann man den Quelltext auch lesen.

Alle Variablen, die in einer Funktion verwendet werden (und nicht als global markiert sind, was man nicht tun sollte) sind lokal. `total` ist eine lokale Variable, die nie initialisiert wurde.

Der Parameter `report` ist unsinnig, weil er gleich mit einem Wert überschrieben wird. Es gibt verschiedene Arten von Anführungszeichen für literale Strings, so dass es unnötig ist, Anführungszeichen zu escapen. Hier einfach einfache Anführungszeichen verwenden.

Eingerückt wird immer mit 4 Leerzeichen, nicht mal 2 mal 4.

`item_add =="Q" or "q"` ist immer wahr, weil entweder `item_add == "Q"` wahr ist, oder `"q"` was als nicht leere Zeichenkette immer wahr ergibt. Du suchst entweder `item_add.lower()` oder den `in`-Operator.
Odox
User
Beiträge: 9
Registriert: Montag 25. Juni 2018, 19:10

Montag 25. Juni 2018, 19:42

Ich überarbeite den code nochmal fix...
Odox
User
Beiträge: 9
Registriert: Montag 25. Juni 2018, 19:10

Montag 25. Juni 2018, 20:14

Sirius3 hat geschrieben:
Montag 25. Juni 2018, 19:33
das nächste mal bitte Code in Code-Tags einfassen (z.B. über den [ Python ]-Knopf über dem Editfeld im vollständigen Editor), dann kann man den Quelltext auch lesen.
Check.
Sirius3 hat geschrieben:
Montag 25. Juni 2018, 19:33
Alle Variablen, die in einer Funktion verwendet werden (und nicht als global markiert sind, was man nicht tun sollte) sind lokal. `total` ist eine lokale Variable, die nie initialisiert wurde.
Sry, ich hab das vielleicht noch nicht richtig verstanden. Ich dachte das Total = 0 ein Initialisierung ist?
Sirius3 hat geschrieben:
Montag 25. Juni 2018, 19:33
Der Parameter `report` ist unsinnig, weil er gleich mit einem Wert überschrieben wird. Es gibt verschiedene Arten von Anführungszeichen für literale Strings, so dass es unnötig ist, Anführungszeichen zu escapen. Hier einfach einfache Anführungszeichen verwenden.
Check, wenn ich dich richtig verstanden hab.
Sirius3 hat geschrieben:
Montag 25. Juni 2018, 19:33
`item_add =="Q" or "q"` ist immer wahr, weil entweder `item_add == "Q"` wahr ist, oder `"q"` was als nicht leere Zeichenkette immer wahr ergibt. Du suchst entweder `item_add.lower()` oder den `in`-Operator.
Ja. .lower mach am meisten Sinn für mich.
Benutzeravatar
__blackjack__
User
Beiträge: 1230
Registriert: Samstag 2. Juni 2018, 10:21

Montag 25. Juni 2018, 20:22

@Odox: Du hast da zwei verschiedene `total`\s. Eins auf Modulebene und eines in der Funktion. Und bei dem in der Funktion versuchst Du auf den Wert zuzugreifen bevor der festgelegt wurde. Das gleiche Problem hast Du mit `items`. Auf Modulebene sollten die Namen auch überhaupt nicht existieren. Da gehören keine Variablen hin. Nur Code der Konstanten, Funktionen, und Klassen definiert.
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
Odox
User
Beiträge: 9
Registriert: Montag 25. Juni 2018, 19:10

Montag 25. Juni 2018, 20:54

Ist vielleicht noch nicht schön, aber es geht :)
Danke für die Hilfe!
Warum ignoriert der eigentlich meine Eingabe, wenn ich bei intem_add.lower() == "Q": sage?

Code: Alles auswählen

print("Report Types include All Items (\"A\" or Total Only \"T\")")
report = input("Chose Report Type (\"A\" or \"T\"):")

def adding_report(report="T",total=0,items="\n"):     
 
   while True:
      item_add = input("Enter an integer or \"Q\"")
      if item_add.isdigit():

        total = total + int(item_add)

        items = items + item_add + "\n "

      elif item_add == 'Q':

         if report == "A":

           print('Items\n'+items)

           print("Total\n" + str(total))

           break

         elif report == "T":

          print("Total\n" + str(total))

          break

      else:

        print(item_add + " " + "is invalid input")

adding_report(report)
Benutzeravatar
__blackjack__
User
Beiträge: 1230
Registriert: Samstag 2. Juni 2018, 10:21

Montag 25. Juni 2018, 21:03

@Odox: Was hast Du denn erwartet wann ``item_add.lower() == 'Q'`` jemals wahr werden sollte? Was macht denn Deiner Meinung nach die `lower()`-Methode?

Hier macht es jetzt keinen Sinn `total` und `items` als Parameter zu haben, genau aus dem gleichen Grund warum das vorher bei `report` keinen Sinn gemacht hat.

Das ``elif report == "T":`` kannst Du Dir eigentlich sparen da beide Zweige mit der Ausgabe der Gesamtsumme und einem ``break`` enden. Das sollte da nur einmal *nach* dem ``if`` stehen.

Das mit der Einrückung solltest Du echt in den Griff kriegen.
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
Odox
User
Beiträge: 9
Registriert: Montag 25. Juni 2018, 19:10

Montag 25. Juni 2018, 21:32

Wie gesagt, bin noch ein "Beginner".
Trotzdem werde ich mir deine Tipps nochmal zur Brust nehmen.
Danke nochmal an alle!
Antworten