Variablen durch Schleife ändern

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
Benutzeravatar
MrBrightside
User
Beiträge: 10
Registriert: Dienstag 14. November 2017, 16:01

Hallo nochmal,

ich hätte erneut eine sehr grundlegende Frage.
Bisher konnte ich dazu keine Antwort finden, falls es dazu bereits einen Beitrag gibt entschuldige ich mich hiermit und würde mich riesig über einen Link freuen.

Im folgenden erstmal der Code auf den ich mich beziehen werde:

Code: Alles auswählen

question_1="bla bla bla"
question_2="blo blo blo"
question_3="blu blu blu"

i=1
max_rounds=20
while i<=max_rounds:
	print("Question",i)
	print(question_i)
	i=i+1

Mein Ziel ist es, mit jedem Durchauf der Schleife die Variable "i" um einen zu erhöhen und so nach und nach die Fragen abzuarbeiten.
Wie sage ich dem Programm das er bei "print(question_i)" die variable erkennt?

Die Fehlermeldung bei dem aktuellen Code ist "Name Error: name 'question_i' is not defined".

Ich hoffe ich habe mich deutlich ausgedrückt, falls nicht, immer her mit den Nachfragen.

Vielen Dank und viele Grüße
Flo
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


in deinem Programm hast du ja mehrere Fragen, für gewöhnlich kann man diese mit in einer Liste strukturieren (bzw. array in perl).
Heißt also:

Code: Alles auswählen

fragen=["Wie alt bin ich?","Warum lese ich mir das Grundlagentutorial zu Python nicht durch?","Würden sich dann so viele Fragen erübrigen?"]
Das wären 3 Fragen in einer Liste. Angesprochen werden diese über ihr Index.

Code: Alles auswählen

print(fragen[0])
# Wie alt bin ich?
print(fragen[2])
# Würden sich dann so viele Fragen erübrigen?
Wenn du jetzt in einer Schleife alle Fragen durchgehen möchtest kann man das folgendermaßen machen:

Code: Alles auswählen

max_rounds = 3
for index in range(max_rounds):
    print(fragen[index])
Fragst du als nächstes wie du an die Eingabe des Nutzers kommst?
Das sehe dann so aus

Code: Alles auswählen

antwort = input("Antwort: ")
Benutzeravatar
MrBrightside
User
Beiträge: 10
Registriert: Dienstag 14. November 2017, 16:01

Hallo,

vielen Dank für die Antwort. Die Möglichkeit der Liste habe ich tatsächlich schon gesehen gehabt. (Der Beitrag in diesem Forum bezüglich des "Schere, Stein, Papier" Spiels.)
Das funktioniert so lange, wie ich eine limitierte Anzahl an Fragen habe.
Wie wäre denn die richtige Herangehensweise wenn ich Beispielsweise 100 Fragen habe? Da wäre der Code ja schnell ziemlich überladen.

Danke schonmal für deine Hilfe, ich weiß das sehr zu schätzen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sebastian0202: und jetzt hast Du einem Anfänger gezeigt, wie man es nicht macht.
Richtig wäre, über die Liste direkt zu iterieren (foreach in Perl):

Code: Alles auswählen

for frage in fragen:
    print(frage)
@MrBrightside: was wäre denn bei 100 Fragen am Code überladen? So viele Fragen würde man wahrscheinlich in einer Text-Datei speichern und diese dann laden:

Code: Alles auswählen

with open("fragen.txt") as lines:
    fragen = [l.strip() for l in lines]
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,



ich habe das max_rounds so interpretiert, dass eine Frage eine Runde darstellt.
Die Anzahl der Schleifendurchläufe sollte also auch davon abhängen.

Besser wäre es natürlich sich eine bestimmte Menge an Fragen aus dem
Fragenkatalog auszuwählen (abhängig von max_rounds) und darüber zu iterieren.
Benutzeravatar
MrBrightside
User
Beiträge: 10
Registriert: Dienstag 14. November 2017, 16:01

Erneut danke für die Antworten.
Ich fasse mal zusammen was ich verstanden habe und wo mir noch etwas unklar ist.

@sebastian0202

Code: Alles auswählen

max_rounds = 3
for index in range(max_rounds):
    print(fragen[index])
Die Variable "max_rounds" habe ich tatsächlich dafür eingebaut, um dem Spieler zu überlassen, wie viele Runden gespielt werden sollen. Entsprechend soll pro Runde eine Frage gestellt werden.
Handelt es sich bei "index" nicht um eine Variable und muss entsprechend deklariert werden bevor ich sie in der Schleife verwende?
Verstehe ich das richtig, das in der Schleife der Wert hinter "index" hochgezählt wird bis er den Wert hinter range(max_rounds) erreicht? Warum überhaupt "range" benutzen? Die Variable als Limit müsste es hier doch auch tun?

@Sirius3
Überladen meine ich, das die Listenform, in Bezug darauf, dass alles hintereinander weggeschrieben wird, enorm lang wird. Sollte mir im Nachhinein aufallen das ich einen Rechtschreibfehler oder ähnliches gemacht habe, würde es doch Ewigkeiten dauern bis ich die Frage in meinem Quellcode gefunden habe.
Das mit der externen Datei hatte ich schon überlegt und gefällt mir als Lösung sehr gut. Besonders da ich meine bereits gelesen zu haben das die antworten ebenfalls in der Variable definiert werden müssen aber das Versuche ich später auszutüffteln. Bin ja noch am Anfang und nutze solche Beispiele nur um auch ein Ziel beim Programmieren zu haben.

Bezüglich deines Codes.

Code: Alles auswählen

for frage in fragen:
   print(frage)
"fragen" wird sicherlich die Liste sein. Definiere ich die Variable "frage" ersst in der for Schleife um auf diese dann im "print" zuzugreifen? Außerdem frage ich mich ob die Schleife selber merkt wenn sie alle Einträge der Liste durch hat.

Viele Grüße
Flo
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,



wenn du den 3-Zeilen Code einfach mal testest, siehst du ja ob es funktioniert.
Der Code von Sirius ist der eindeutig bessere.
Wenn du später noch einen Zähler brauchst löst man das über enumerate:

Code: Alles auswählen

for index, frage in enumerate(fragen):
    print("Frage Nummer %s: %s" % (index+1, frage))
Ich würde mir die Schleife so übersetzen: "für index, frage von jedem Element mache..."
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

MrBrightside hat geschrieben:Handelt es sich bei "index" nicht um eine Variable und muss entsprechend deklariert werden bevor ich sie in der Schleife verwende?
Du bist wieder in irgendeiner anderen Programmiersprache und nicht in Python (diesmal auch nicht Perl). Variablen muß man nicht deklarieren, man benutzt sie einfach.
MrBrightside hat geschrieben:Verstehe ich das richtig, das in der Schleife der Wert hinter "index" hochgezählt wird bis er den Wert hinter range(max_rounds) erreicht? Warum überhaupt "range" benutzen? Die Variable als Limit müsste es hier doch auch tun?
Diese Frage würde sich von alleine lösen, wenn Du beim Lesen des Tutorials hiermit durch bist. Wie weit hast Du das Tutorial inzwischen durchgearbeitet?
Benutzeravatar
MrBrightside
User
Beiträge: 10
Registriert: Dienstag 14. November 2017, 16:01

Nochmals danke für die Antwort.

Bezüglich der anderen Programmiersprache: Ich habe vorher in C# gearbeitet, das ist aber auch schon Jahre her deswegen kann ich nichtmal sagen ob das noch als Ausrede gilt. Ich würde bei C# wohl auch ähnliche Probleme bekommen.

Das Tutorial habe ich nicht an A nach Z durchgearbeitet. Ich versuche eher anhand meiner Ideen für ein Programm die Sachen zu finden die ich wissen möchte, allerdings fällt es mir häufig schwer genau die Beispiele zu finden nach denen ich Suche.
Hatte ehrlich gesagt gehofft das mit dem bisschen vorerfahrung, die ich habe, der Einstieg leichter fällt und sich vieles schnell selbst erklärt.
Hab mich wohl ein wenig übernommen und tret mal ein wenig auf die Bremse.

Trotzdem herzlichen Dank für die Hilfe, ihr habt mir um einiges weitergeholfen.
Ich werde versuchen beim nächsten Mal mit angemesseneren Fragen zurückzukehren.

Gruß
Flo
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MrBrightside: mit etwas Vorerfahrung kann man das Tutorial relativ schnell durcharbeiten. "Durcharbeiten" heißt, das was erklärt wird an eigenen kleinen Beispielen auszuprobieren, bis man es wirklich verstanden hat. Dabei Kapitel 1 bis 5 auf jeden Fall komplett nacheinander durcharbeiten, den Rest kann man auch bei Bedarf lesen.
Antworten