For counter erhöhen

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
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Wie kann ich den for counter erhöhen?
Folgender Code

Code: Alles auswählen

for i in range(0,10):
    print "for counter:", i
    if (i == 4):
        i = 7
        print "set for counter to:", i
gibt aus

for counter: 0
for counter: 1
for counter: 2
for counter: 3
for counter: 4
set for counter to: 7
for counter: 5
for counter: 6
for counter: 7
for counter: 8
for counter: 9

erwartet hätte ich

for counter: 0
for counter: 1
for counter: 2
for counter: 3
for counter: 4
set for counter to: 7
for counter: 8
for counter: 9

Danke
Claudia
BlackJack

@myxin: Gar nicht. ``for`` ist in Python keine Zählschleife, sondern eine „for each”-Schleife, die in jedem Schleifendurchlauf den nächsten Wert von dem Iterator an den Schleifenvariablennamen bindet. Ob man in der Schleife den Namen neu bindet kann der Iterator nicht mit bekommen, und deshalb kann das auch keine Auswirkungen haben.

Die Klammern um die Bedingung bei ``if`` sind übrigens unnötig.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@myxin: Du hast da leider nen Denkfehler: Stell dir's so vor, dass bei jedem Schleifendurchlauf immer wieder ein neues `i` erstellt wird. Da ist also keine Obstkiste namens `i` (ich will das mal als Bild zur besseren Vorstellung nutzen), wo immer wieder ein neuer Wert reingelegt wird, sondern die alte Obstkiste wird durch eine neue Obstkiste ersetzt, oder anders gesagt: Die alte Kiste zählt nicht mehr, weil es eine Kiste mit exakt dem selben Namen gibt, wodurch die vorherige aus dem Lager geschmissen wird. In deinem `if`-Block legst du bei zutreffender Bedingung jetzt nochmal eine Obstkiste `i` an, die einen Wert zugewiesen bekommt. Auch hier steckst du also nicht in eine bestehende Kiste was neues rein, sondern du legst eine komplett neue *Kiste* an. Wenn jetzt aber wieder einer neuer Schleifendurchlauf beginnt, dann wird abermals eine Ersetzung der Obstkiste vorgenommen, und nicht, wie von dir erwartet, etwa des Wertes aus der Kiste. Daher läuft der Ablauf einfach stumpf weiter, als sei nichts gewesen. ;)
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

@snafu und BlackJack,

vielen Dank für die Aufklärung.
Wie kann ich aber solch eine Problemstellung
Durchlaufe solange eine Schleife bis ein Bedingung erfüllt ist und mache dann an einer anderen Stelle weiter
dann mit python lösen?
Setze ich da vor der for (each) Schleife eine Variable die dementsprechend geprüft wird also etwas wie

Code: Alles auswählen

j = 0
for i in range(0,10):
    if i == j:
        print "for counter:", i
        if (i == 4):
            j = 8
            print "set for counter to:", j
        else:
            j += 1
oder geht das anders vernünftiger?

Danke
Claudia
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es gibt auch noch while.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

@DasIch

while ist nicht wirklich eine Alternative, wenn ich das richtig sehe, da ich dort nur eine Bedigung abprüfen kann.
Ich muss aber einen bytestream durchlaufen und ggf. immer x bytes springen.

Gruß
Claudia
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Du kehrst die Bedingung um. Problem gelöst. Entspräche einem "Solange Bedingung X nicht erfüllt ist, tue dies:".
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Aber mal angenommen, du liest immer 4 Bytes aus und machst irgendeine Prüfung darauf, dann würde sowas ja trotzdem gehen:

Code: Alles auswählen

i = 0
chunk = stream.read(4)
while chunk:
    if chunk == MAGIC_CHUNK:
        i += 7
    else:
        i += 1
    chunk = stream.read(4)
Das ist zwar nicht ganz so schön, dürfte aber wohl nicht viel anders zu lösen sein. Eventuell kannst du auch etwas genauer werden, was dein eigentliches Vorhaben ist, denn vielleicht gibt es bessere Alternativen. :)
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Erstmal vielen Dank für die Anregungen.
Meine Herausforderung ist,

- durchlaufe einen bytestream byte für byte bis zum Ende
- prüfe das byte auf stop bit
- wenn ja, speichere Wert
- wenn nein, merke werte und durchlaufe weiter

Irgendwann wird dann aus den gesammelten Bytes eine Nachricht und jenachdem welchem Typ die Nachricht enspricht, muss
ich weiterlesen oder kann um x bytes springen und dort wieder von neu anfangen.

Ich denke ich habe jetzt auch das gefunden was ich suche: Buffered Streams
scheint mir das zu sein was ich brauche und read und seek die Methoden die mein Problem lösen.

Also doch while ;-)

Danke
Claudia
lunar

@myxin: Das hört sich an, als würdest Du Binärdaten parsen. In diesem Fall ist vielleicht ein Blick auf das "construct"-Modul hilfreich. Dieses Modul erlaubt Dir, die Struktur der Binärdaten zu beschreiben, und anschließend einfach Objekte aus den Binärdaten zu lesen.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

XY-Problem. :mrgreen:

Ich wollte das auch mal sagen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BlackJack

@myxin: Wenn Du eine Schleife über die Bytewerte haben willst, warum hast Du dann eine „Zählschleife”? Schreib einfach eine Schleife über die Bytes. Beziehungsweise über einen Iterator mit den Bytes, denn dann kannst Du mit dem innerhalb der Schleife auch Elemente überspringen, in dem Du entsprechend oft `next()` darauf aufrufst.
Benutzeravatar
Jean-P.
User
Beiträge: 48
Registriert: Freitag 27. Januar 2012, 14:41
Wohnort: Berlin

Code: Alles auswählen

x = 0
for i in range(0,10):
    print "for counter:", x
    if x == 4:
        x = 7
        print "set for counter to:", x
    x = x + 1
Mit einer for Schleife wird es wohl nur so gehen :K
kotz...
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Jean-P. hat geschrieben:

Code: Alles auswählen

x = 0
for i in range(0,10):
    print "for counter:", x
    if x == 4:
        x = 7
        print "set for counter to:", x
    x = x + 1
Welchen Vorteil soll diese merkwürdige Konstruktion gegenüber einer mit einem einfachen while realisierten Schleife haben?
Benutzeravatar
Jean-P.
User
Beiträge: 48
Registriert: Freitag 27. Januar 2012, 14:41
Wohnort: Berlin

Gar keinen wollte das nur für die Nachwelt vervollständigen :P

Edit:
Auch ein klarer Hinweis das ich von PHP gekommen bin, wir sind Spagetti Code gewöhnt :K
kotz...
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Vielen lieben Dank an Euch alle.
Ihr seht, ich bin noch am lernen :wink:

@BlackJack - warum? :K hmm - wahrscheinlich weil ich es noch immer nicht gewöhnt bin in Objekten zu denken. :oops:
@lunar - das sieht allerdings interessant aus, muss ich mir noch genauer anschauen :shock:

Gruß
Claudia
Antworten