Variable immer um 1 erhöhen und Startwert verä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
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

Hallo,

Ich habe eine Frage bezüglich einer Laufvariable. Und zwar soll eine Variable, nennen wir sie mal "k", immer um den Wert 1 erhöht werden, wenn eine while-Schleife durchlaufen wird. Hierzu habe ich erst (vor der while-Schleife) k=0 gesetzt. Das ist auch das Problem, da die Variable "k" nach der while-Schleife immer wieder den Wert Null annimmt.

Zum Beispiel:

Code: Alles auswählen

k = 0

while k >= 0:
    k = k + 1
    print(k)
    break

Hat jemand eine Idee, wie die Variable "k" den Wert annimmt, welchen er nach der while-Schleife haben sollte?

(Hinweis: Ja, die while-Schleife soll immer nur einmal durchlaufen werden, sodass "k" immer nur um den Wert 1 erhöht wird. Das hat etwas mit der anschließenden Anwendung zutun.)


Vielen Dank und viele Grüße
Sinusvonx
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, k hat nach der while-Schleife den Wert 1. Wie kommst Du darauf, dass k 0 wäre?
Die while-Schleife macht so keinen Sinn. Kannst Du bitte genau beschreiben, was Du eigentlich machen willst?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sinusvonx: Das Problem kann ich nicht nachvollziehen, bei mir hat `k` nach der Schleife den Wert 1. Wie kommst Du darauf, das es 0 wäre?

Letztlich ist der Code aber total unsinnig. Die Bedingung der ``while``-Schleife kann nie unwahr werden, also braucht da auch kein komplizierter Ausdruck stehen, sondern man könnte `True` hin schreiben:

Code: Alles auswählen

k = 0

while True:
    k = k + 1
    print(k)
    break
Da die Schleife die nur einmal durchlaufen wird, semantisch gar keine Schleife ist, kann man sich ``while`` und ``break`` sparen:

Code: Alles auswählen

k = 0
k = k + 1
print(k)
Hier macht es nun keinen Sinn `k` erst an 0 zu binden und da 1 drauf zu rechnen. Da das Ergebnis trivialerweise 1 ist, kann man auch gleich 1 zuweisen:

Code: Alles auswählen

k = 1
print(k)
Letztzer Schritt: `k` einsetzen:

Code: Alles auswählen

print(1)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

Der Sinn dahinter ist es, dass bei der Programmierung eines Discord Bots gezählt werden soll, wie häufig ein Command verwendet wurde. Hierbei bricht das Programm ja nicht nach der while-Schleife ab (Entschuldigung für meine Unverständlichkeit). k soll also immer um 1 erhöht werden, wenn ein Command ausgeführt wird. Angenommen, der von mir angegebene Code hat kein Ende, so wird k niemals größer als 1 werden. Aber k soll ja irgendwann größer als 1 sein.

Ich hoffe, dass es jetzt verständlicher ist, Entschuldigung.
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

__blackjack__ hat geschrieben: Montag 26. Juli 2021, 19:20 @sinusvonx: Das Problem kann ich nicht nachvollziehen, bei mir hat `k` nach der Schleife den Wert 1. Wie kommst Du darauf, das es 0 wäre?

Letztlich ist der Code aber total unsinnig. Die Bedingung der ``while``-Schleife kann nie unwahr werden, also braucht da auch kein komplizierter Ausdruck stehen, sondern man könnte `True` hin schreiben:

Code: Alles auswählen

k = 0

while True:
    k = k + 1
    print(k)
    break
Da die Schleife die nur einmal durchlaufen wird, semantisch gar keine Schleife ist, kann man sich ``while`` und ``break`` sparen:

Code: Alles auswählen

k = 0
k = k + 1
print(k)
Hier macht es nun keinen Sinn `k` erst an 0 zu binden und da 1 drauf zu rechnen. Da das Ergebnis trivialerweise 1 ist, kann man auch gleich 1 zuweisen:

Code: Alles auswählen

k = 1
print(k)
Letztzer Schritt: `k` einsetzen:

Code: Alles auswählen

print(1)

Und natürlich schonmal danke für die Antwort! :)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sinusvonx: Dann vermute ich mal Dein `k` ist ausserhalb einer Rückruffunktion und in der Funktion hast Du dann noch mal ein lokales `k` oder bekommst einen ``UnboundLocalError: local variable 'k' referenced before assignment``‽

Zeit für objektorientierte Programmierung (OOP) damit Du Dir Zustand über Methodenaufrufe hinweg merken kannst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du musst das Zählen halt auf einer höheren Ebene machen, d. h. unmittelbar vor dem Aufrufen eines Kommandos wird der Zähler erhöht. Im einfachsten Fall macht man das in main() oder einer Hilfsfunktion, die z. B. den Namen des Kommandos erhält und die passende Funktion für den Befehl aufruft. Wenn es flexibler sein soll, kann man sich einen Dekorator für das Mitzählen basteln und den an die jeweiligen Kommando-Funktionen "kleben". Wichtig ist auch, dass du wahrscheinlich nicht einen einzigen Zähler willst, sondern einen pro Kommando. Dafür bietet sich ein Wörterbuch an. Im Prinzip wäre es die Struktur: command_name -> (callback, counter).
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

snafu hat geschrieben: Dienstag 27. Juli 2021, 00:58 Du musst das Zählen halt auf einer höheren Ebene machen, d. h. unmittelbar vor dem Aufrufen eines Kommandos wird der Zähler erhöht. Im einfachsten Fall macht man das in main() oder einer Hilfsfunktion, die z. B. den Namen des Kommandos erhält und die passende Funktion für den Befehl aufruft. Wenn es flexibler sein soll, kann man sich einen Dekorator für das Mitzählen basteln und den an die jeweiligen Kommando-Funktionen "kleben". Wichtig ist auch, dass du wahrscheinlich nicht einen einzigen Zähler willst, sondern einen pro Kommando. Dafür bietet sich ein Wörterbuch an. Im Prinzip wäre es die Struktur: command_name -> (callback, counter).
Danke! Ich werde da mal etwas ausprobieren.
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

__blackjack__ hat geschrieben: Montag 26. Juli 2021, 21:17 @sinusvonx: Dann vermute ich mal Dein `k` ist ausserhalb einer Rückruffunktion und in der Funktion hast Du dann noch mal ein lokales `k` oder bekommst einen ``UnboundLocalError: local variable 'k' referenced before assignment``‽

Zeit für objektorientierte Programmierung (OOP) damit Du Dir Zustand über Methodenaufrufe hinweg merken kannst.
Vielen Dank für die Antwort!
Antworten