最简单的写法“虽然不是初始值”

时间:2019-03-03 13:38:46

标签: python python-3.x logic cycle

如果您想在变量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 :(得分:3)

使用无限循环,如果条件在主体的末端为真,则该循环显式中断。

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

答案 1 :(得分:1)

如果您正在寻找重复直到结构,那么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则需要额外的代码(和额外的注意)。

例如:

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

[UPDATE] 如果您更喜欢使用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)

请注意,您需要为每个while语句初始化loopUntilTrue()的新实例。这也意味着您必须在使用此方法的嵌套while循环中使用不同的变量名(用于reached

您可以在退出条件下执行相同的操作:

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)

答案 2 :(得分:0)

另一种干净的方法是在循环之前对语句进行一次评估。

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,然后进入循环。