Seite 1 von 1
For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 22:37
von myxin
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
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 22:47
von 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.
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 22:54
von snafu
@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.

Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:09
von myxin
@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
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:10
von DasIch
Es gibt auch noch while.
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:18
von myxin
@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
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:24
von webspider
Du kehrst die Bedingung um. Problem gelöst. Entspräche einem "Solange Bedingung X nicht erfüllt ist, tue dies:".
Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:29
von snafu
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.

Re: For counter erhöhen
Verfasst: Mittwoch 8. Februar 2012, 23:38
von myxin
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
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:05
von 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.
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:11
von Kebap
XY-Problem.
Ich wollte das auch mal sagen.
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:27
von 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.
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:28
von Jean-P.
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
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:41
von /me
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?
Re: For counter erhöhen
Verfasst: Donnerstag 9. Februar 2012, 11:43
von Jean-P.
Gar keinen wollte das nur für die Nachwelt vervollständigen
Edit:
Auch ein klarer Hinweis das ich von PHP gekommen bin, wir sind Spagetti Code gewöhnt :K
Re: For counter erhöhen
Verfasst: Freitag 10. Februar 2012, 00:05
von myxin
Vielen lieben Dank an Euch alle.
Ihr seht, ich bin noch am lernen
@BlackJack - warum? :K hmm - wahrscheinlich weil ich es noch immer nicht gewöhnt bin in Objekten zu denken.
@lunar - das sieht allerdings interessant aus, muss ich mir noch genauer anschauen
Gruß
Claudia