假设我有以下简单代码:
useText = True
for i in range(20):
if useText:
print("The square is "+ str(i**2))
else:
print(i**2)
我使用变量useText来控制打印方块的方式。它在运行循环时不会改变,因此每次循环运行时检查它似乎效率低下。有没有办法在循环之前只检查一次useText,然后总是根据结果打印出来?
这个问题经常发生在我身上。在这个简单的情况下,当然没关系,但我可以想象这会导致在更复杂的情况下性能降低。
答案 0 :(得分:4)
useText
在这里完成的唯一区别是格式化字符串。所以把它移出循环。
fs = '{}'
if useText:
fs = "The square is {}"
for i in range(20):
print(fs.format(i**2))
(这个useText
在循环期间没有改变!在多线程程序中可能不是真的。)
答案 1 :(得分:2)
程序的一般结构是循环一个序列并以某种方式打印结果。
在代码中,这变为
for i in range(20):
print_square(i)
在循环运行之前,根据print_square
变量适当设置useText
。
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
,并且可以轻松扩展以支持在循环内打印结果的其他方法。
答案 2 :(得分:1)
如果您不打算在循环中更改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)
答案 3 :(得分:0)
我们可以将if
移到for
之外,因为您提到useText
没有变化。
答案 4 :(得分:0)
如果你写这样的东西,你需要检查条件,运行代码,移动到下一次迭代,然后重复,每次检查条件,因为你正在运行{的整个身体{1}}循环,包括for
语句,每次迭代:
if
如果你写了这样的内容,for i in a_list:
if condition:
code()
语句在 if
循环中,你就会检查条件并运行整个{{1} }}仅在条件为真时循环:
for
我认为你想要第二个,因为那个只在开始时检查一次。这样做是因为for
语句不在循环内。请记住,循环内的所有内容都在每次迭代中运行。