Seite 1 von 1

For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 02:42
von Jens_J.
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.

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 03:42
von DasIch
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

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 08:37
von snafu
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)

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 10:30
von 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.
        # ...

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 11:21
von Jens_J.
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.

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 11:32
von snafu
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)

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 11:36
von 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)):
        # ...

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 12:34
von Jens_J.
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"?

Re: For Loop: Schritt wiederholen.

Verfasst: Dienstag 26. Januar 2016, 13:02
von snafu
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.