Если вы ищете структуру с повторением до, в Python ее нет.Но вы можете получить нечто подобное, создав итератор.Затем вы можете использовать этот итератор в операторе for _ in ...
для получения желаемого поведения.
def repeatUntil(condition):
yield
while not condition(): yield
foo = 5
for _ in repeatUntil(lambda:foo==5):
foo = (random.randint(1,100) // (foo +1)) +1
print(foo)
Или repeatWhile (), если вы хотите выразить условие продолжения вместо условия остановки.(в обоих случаях условие будет проверено в конце цикла)
def repeatWhile(condition):
yield
while condition(): yield
foo = 5
for _ in repeatWhile(lambda:foo!=5):
foo = (random.randint(1,100) // (foo +1)) +1
print(foo)
Обратите внимание, что этот подход обеспечит правильную обработку continue
, тогда как while True: ... if foo==5: break
потребует дополнительного кода (и дополнительногоcare).
Например:
foo = 5
while True:
foo = (random.randint(1,100) // (foo +1)) +1
if someCondition == True: continue # loop will not stop even if foo == 5
print(foo)
if foo == 5: break
[ОБНОВЛЕНИЕ] Если вы предпочитаете использовать оператор while и не хотите использовать lambda:
в пути, вы можете создать функцию loopUntilTrue()
для общего управления форсированием первого прохода:
def loopUntilTrue(): # used in while not loop(...):
firstTime = [True]
def loop(condition):
return (not firstTime or firstTime.clear()) and condition
return loop
foo = 5
reached = loopUntilTrue()
while not reached(foo==5):
foo = (random.randint(1,100) // (foo +1)) +1
print(foo)
Обратите внимание, что вам нужно инициализировать новый экземпляр loopUntilTrue()
для каждого оператора while.Это также подразумевает, что вам придется использовать разные имена переменных (для reached
) во вложенных циклах while, использующих этот подход
Вы можете сделать то же самое с условием выхода:
def loopUntilFalse(): # used in while loop(...):
firstTime = [True]
def loop(condition):
return (firstTime and not firstTime.clear()) or condition
return loop
foo = 5
outcome = loopUntilFalse()
while outcome(foo!=5):
foo = (random.randint(1,100) // (foo +1)) +1
print(foo)