有没有一种简洁的方法可以在循环的第一次迭代或执行之前检查变量?

3

我的代码是用Python编写的,但这个问题适用于任何编程语言。

基本上,我有一个循环,其结构类似于以下内容:

while True:
    if visual:
        print("Something meaningful")
    function1()
    function2()

用户在使用CLI参数调用脚本时,可以确定可视变量的值,它是一个布尔值。如果设置为True,则用户会得到视觉反馈,否则不会。
问题是循环会在每次迭代时检查该变量,稍微减慢执行速度。
因此,我想知道是否有一种简洁的方法来避免在每次迭代时检查“visual”是否为True,是否有办法告诉程序只在第一次迭代时检查该变量,因为变量不能在执行期间改变。
我考虑过类似这样的做法:
if visual:       
    while True:
        print("Something meaningful")
        function1()
        function2()
else:
    while True:
        function1()
        function2()

它可以工作,但似乎这并不是一个好的实践。

解决这个问题最干净的方式是什么?


2
"稍微减慢执行速度",当您已经使用Python时,一个静态布尔值的检查不是优化的重点。 - Olvin Roght
相关答案请参考 https://stackoverflow.com/questions/34572259/check-statement-for-a-loop-only-once - AverageHomosapien
2
@OlvinRoght 我同意,我实际上并不是在寻求优化,我只是好奇。如果你仔细想想,检查一个布尔值在执行时间上是毫无意义的,但如果我让这个循环运行一周或一个月,我相信每次迭代检查的那个变量会累积成为一些可以被认为有意义的东西。 - Shiverz
如果function1()和function2()不是微不足道的,布尔检查的影响将是可忽略的。你可以用相同的论点将这些函数内联,以减少子程序跳转的开销。 - MrSmith42
2个回答

2

我会从将while循环中的函数分组到一个新函数开始。然后,在循环之前,我们检查visual是否为True,如果是,则使用wrapper decoratefunctions()

def functions():
    function1()
    function2()

def _visual_decorator(func):
    def _wrapper(*args, **kwargs):
        print("Something meaningful")
        return func(*args, **kwargs)
    return _wrapper

if visual:
    functions = _visual_decorator(functions)

while True:
    functions()

完整的工作示例


1
嘿,是的,那个可以!正是我在寻找的答案类型。然而,我之前听说过装饰器,但从未真正学习过它们。您介意详细解释一下 _visual_decorator 函数的作用吗?提前感谢! - Shiverz
1
很高兴能帮上忙!我推荐这个答案或者这个视频来学习包装器和装饰器。_visual_decorator接受任何可调用对象作为参数,并返回具有相同签名的另一个可调用对象。返回的可调用对象在被调用时,将会调用print函数并返回第一个给定可调用对象的结果。 - Mandera

1
你需要一种无分支编程的方法。你应该转换你的循环,使其不使用第一个有分支的if语句。 通常这取决于你使用的语言和它提供的功能。 例如,在Python中,你可以将两个函数放在一个map中,并根据变量value使用其中一个函数。
functions = {True: print, False: lambda x: x}
value = False
func = functions[value]
while True:
  func("Something useful")
  function1()
  function2()

这是一种方法,但不是唯一的方法。其他语言有它们自己的实现方式。
请注意,虽然在Python中可能没有太大区别,但无分支编程通常可以通过优化程序运行时间来提高性能,有时甚至可以提高数个数量级!

1
嘿,感谢你的答复,我以前从未听过“无分支编程”。你是说在你提供的代码中,functions[value]("Something useful") 这一行只运行了一次? - Shiverz
1
不,它会在每次迭代中运行。但你可以把它拿出来。我会更新答案。 - Maaddy
1
无分支编程是一种编程方法,其中避免使用像ifswitch语句这样的分支,因为它们会清除处理器中的流水线。 - Maaddy
1
只会运行一次的是你将作为键“True”的值放入映射中的任何内容,这种情况下是print函数。 - Maaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接