Самый простой способ написания "пока не начальное значение" - PullRequest
0 голосов
/ 03 марта 2019

Если вы хотите что-то сделать, пока переменная foo! = 5, имеет начальное значение 5 (например).

Кто-нибудь знает более чистый способ сделать это? Один способэто:

def try1():
    foo = 5
    aux = False
    while (foo != 5) or (aux == False):
        aux = True
        foo = (random.randint(1,100) // (foo +1)) +1
        print(foo)

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Если вы ищете структуру с повторением до, в 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)
0 голосов
/ 17 марта 2019

Другой простой способ сделать это - вычислить оператор один раз перед циклом.

def try1():
    foo = 5

    foo = (random.randint(1,100) // (foo +1)) +1
    print(foo)

    while foo != 5:
        foo = (random.randint(1,100) // (foo +1)) +1
        print(foo)

Таким образом, foo генерируется один раз, затем вводится цикл.

0 голосов
/ 03 марта 2019

Используйте бесконечный цикл, который явно прерывается, если условие истинно на конце тела.

def try1():
    foo = 5
    while True:
        foo = (random.randint(1,100) // (foo +1)) +1
        print(foo)
        if foo == 5:
            break
...