For Loop: Schritt wiederholen.

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
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Hallo
Ich hoffe es sei gestattet dieses Forum mit einer, wie ich vermute, einfachen Frage zu behelligen.

Ich habe eine for-loop und diese soll wenn eine Bedingung nicht erfüllt wurde (einige Zufallsparameter) einen Schritt noch einmal ausführen.

Code: Alles auswählen

for i in x:
     if x:
        y
        y...

      else:
Nun und genau hier möchte ich gerne stehen haben, dass diese itterierung wiederholt wird und nochmal durchgelaufen wird, ohne dass ein Schritt weiter gegangen wird.
Zuletzt geändert von Anonymous am Dienstag 26. Januar 2016, 10:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dafür gibt es nichts fertiges, kann man sich aber selbst bauen.

Code: Alles auswählen

class RepeatableIterator(object):
    def __init__(self, iterable):
        self.iterator = iter(iterable)

        self.should_repeat_current = False

    def repeat(self):
        self.should_repeat_current = True

    def __iter__(self):
        return self

    def __next__(self):
        if self.should_repeat_current:
            self.should_repeat_current = False
            return self.current
        self.current = next(self.iterator)
        return self.current


iterator = RepeatableIterator(range(10))
seen_5 = False
for i in iterator:
    print(i)
    if i == 5 and not seen_5:
        iterator.repeat()
        seen_5 = True
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Etwa so?

Code: Alles auswählen

def iter_items(items, condition):
    for item in items:
        yield item
        if condition(item):
            yield item

def below_5(item):
    return item < 5

def main():
    for item in iter_items(range(10), below_5):
        print(item)
Wozu soll das gut sein?

EDIT:
Übrigens kann man das natürlich auch weniger abstrakt schreiben:

Code: Alles auswählen

def main():
    for item in range(10):
        print(item)
        if item < 5:
            print(item)
BlackJack

@Jens_J.: Wo ist denn da das „genau hier“? Da wo die Auslassungspunkte sind? Im ``else``-Zweig? Und welches konkrete Problem soll da gelöst werden? Auch wenn man das lösen kann, riecht es irgendwie nach einem XY-Problem.

Code: Alles auswählen

for x in xs:
    while True:
        # ...
        # Wenn `x` erfolgreich verarbeitet, dann mit ``break`` die
        # ``while``-Schleife verlassen.
        # ...
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Guten Morgen und vielen Dank für die bisherigen Antworten.

Entweder das Problem ist doch komplizierter als ich dachte, oder ich habe es falsch beschrieben. Ich versuch es nochmal:
Abstrahiert sieht mein code ungefähr so aus( alles zu posten wäre zu lang)

Code: Alles auswählen

for i in range(10):
    a=random()
  if a>0.5:
    print("alles groß")
  else:
     # Eigentlich will ich nur 10 mal einen Wert der größer ist als 0.5 (als ich möchte wenn a<0.5 den Schritt für i nochmal     ausführen.
Dazu muss es doch irgendeinen einfachen Befehl geben? und ich bin nur zu doof zu suchen.
Zuletzt geändert von Anonymous am Dienstag 26. Januar 2016, 11:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

So in etwa?

Code: Alles auswählen

from random import random

def get_random_float(low, high):
    while True:
        result = random()
        if low <= result <= high:
            return result

def main():
    random_floats = [get_random_float(0.5, 1) for _ in range(10)]
    print(random_floats)
BlackJack

@Jens_J.: Na die Lösung wäre eine ``while``-Schleife. Vergiss einfach das dieser Schritt selbst Teil einer Schleife ist, das spielt für das Problem doch gar keine Rolle. Du willst den Schritt solange wiederholen bis eine bestimmte Bedingung erfüllt ist. Also ``while True:`` und dann abbrechen wenn die Bedingung erfüllt ist.

Wobei das konkrete Beispielproblem hier natürlich auch ohne so eine Wiederholung formuliert werden kann in dem man gleich nur Zufallszahlen im richtigen Bereich generiert. Also bleibt immer noch die Frage was denn *eigentlich* gelöst werden soll.

Edit:

Code: Alles auswählen

# ...
    for _ in range(10):
        a = 1 - random() / 2
        # ...

    # Oder:
    
    for a in (1 - random() / 2 for _ in range(10)):
        # ...
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Ok Danke Nochmal. Mit einer while schleife ist es ja ganz einfach. Hat gut geklappt (hoffe ich).

Meins sieht jetzt in der Art so aus.

Code: Alles auswählen

for i in range(10)
  while True:
     x=random()
     if x > 0.5:
         print("t")
         break

Bedeutet "while True" , dass alles so lange ausgeführt wird bis "break" kommt oder auf welche Bedingung bezieht sich eigentlich das "True"?
Zuletzt geändert von Anonymous am Dienstag 26. Januar 2016, 14:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Jens_J. hat geschrieben:Bedeutet "while True" , dass alles so lange ausgeführt wird bis "break" kommt oder auf welche Bedingung bezieht sich eigentlich das "True"?
Bei `while` wird die Schleife solange ausgeführt, wie die dahinterstehende Bedingung wahr ist. Da `True` immer wahr ist, steht ``while True`` für eine Endlosschleife. Aus einer solchen Schleife kann man nur mit `break` oder mit `return` "ausbrechen".

Anstatt zu sagen, dass das `True` sich auf etwas bezieht, würde ich es eher so formulieren, dass sich das `while` auf das `True` bezieht und das `break` eben eine der Ausbruchsmöglichkeiten darstellt.
Antworten