【问题标题】:Check statement for a loop only once循环检查语句仅一次
【发布时间】:2016-01-03 00:43:26
【问题描述】:

假设我有以下简单代码:

useText = True

for i in range(20):
    if useText:
        print("The square is "+ str(i**2))
    else:
        print(i**2)

我使用变量 useText 来控制打印正方形的方式。它在运行循环时不会改变,所以每次循环运行时检查它对我来说似乎效率低下。有没有办法在循环之前只检查一次useText,然后总是根据该结果打印出来?

这个问题经常出现在我身上。在这个简单的情况下当然没关系,但我可以想象这会在更复杂的情况下导致性能下降。

【问题讨论】:

  • 为什么不使用两个循环?
  • 那么如果useText发生变化,它会如何变化?这个例子是否像一个简单的 UI,其中 useText 是一个切换,而 for 循环在某处的主运行循环中?我只是想把它放在一个上下文中。

标签: python loops


【解决方案1】:

useText 在这里完成的唯一区别是格式化字符串。所以把它移出循环。

fs = '{}'
if useText:
    fs = "The square is {}"

for i in range(20):
    print(fs.format(i**2))

(这假设 useText 在循环期间不会改变!在多线程程序中这可能不是真的。)

【讨论】:

    【解决方案2】:

    程序的一般结构是循环一个序列并以某种方式打印结果。

    在代码中,这变成了

    for i in range(20):
        print_square(i)
    

    在循环运行之前,根据useText 变量适当地设置print_square

    if useText:
        print_square = lambda x: print("The square is" + str(x**2))
    else:
        print_square = lambda x: print(x**2)
    
    for i in range(20):
        print_square(i)
    

    这具有不重复循环结构或检查useText 的优点,并且可以轻松扩展以支持在循环内打印结果的其他方法。

    【讨论】:

    • 谢谢。这对我来说似乎是最优雅的解决方案,因为它避免了重新编写整个循环(如果你要在 if 语句中创建一个 for 循环)。
    【解决方案3】:

    如果您不打算在循环内更改useText 的值,您可以将其移到for 之外:

    if useText:
        for i in range(20):
            print("The square is "+ str(i**2))
    else:
        for i in range(20):
            print(i**2)
    

    【讨论】:

      【解决方案4】:

      我们可以将if 移到for 之外,因为您提到useText 没有改变。

      【讨论】:

        【解决方案5】:

        如果你写这样的东西,你正在检查条件,运行代码,移动到下一次迭代,并重复,每次检查条件,因为你正在运行 for 循环的整个主体,包括if 语句,在每次迭代中:

        for i in a_list:
            if condition:
                code()
        

        如果你写这样的东西,用if 语句inside for 循环,你正在检查条件并仅在条件为真时运行整个for 循环:

        if condition:
            for i in a_list:
                code()
        

        我想你想要第二个,因为那个只在开始时检查一次条件。这样做是因为if 语句不在循环内。请记住,循环中的所有内容都在每次迭代时运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-04
          • 1970-01-01
          • 1970-01-01
          • 2019-01-12
          • 1970-01-01
          • 2015-10-02
          • 2021-08-07
          相关资源
          最近更新 更多