【问题标题】:Stop iterative function python that keeps iterating停止不断迭代的迭代函数python
【发布时间】:2020-08-06 00:21:01
【问题描述】:

我在下面有一个函数,它将一个值作为输入,并确定一个 new_value(new_value 将始终小于 original_value)。如果 new_value 和 original_value 之间的差异小于指定的容差,则返回 new_value。如果容差更大,则以 new_value 作为参数再次调用该函数,以计算 new_new_value。 根据输入的 original_value,有时永远不会满足公差条件。 如何使函数在一定次数的迭代后停止迭代?我试图在 else 之后输入 count=0,count+=0,但这不起作用,因为每次再次调用该函数时它都会返回零。谢谢

def calc_value(original_value):
   # equations to calculate new_value
   if original_value - new_value < tolerance:
      return new_value
   else calc_value(new_value)

【问题讨论】:

  • 这具体取决于您在已注释掉的部分中所做的工作。
  • @jfaccioni 怎么来的?有什么方法可以计算函数 calc_value 被调用的次数,并在一定次数后返回一个 new_value?
  • @Anna 你有点需要static vairables。看我的回答

标签: python loops stopiteration


【解决方案1】:

您不应该为此使用递归。使用for 循环迭代固定次数,并在适当的情况下使用容差测试提前中断。

def calc_value(original_value):
    old_value = original_value
    for _ in range(10):
        new_value = ...
        if abs(old_value - new_value) < tolerance:
            break
        old_value = new_value
    return new_value

【讨论】:

  • 这是一个无限循环,不要忘记在while循环中i += 1
  • 改为使用for 循环;考虑到我构建循环的方式,无论如何我都没有在循环条件下使用容差测试。
【解决方案2】:

如果您想在达到某个迭代深度后停止迭代,您需要将一个计数器传递给函数。这可以通过函数中的default 参数来完成:

def calc_value(original_value, count = 0):
   # equations to calculate new_value
   if original_value - new_value < tolerance:
      return new_value
   else:
      if count > 100:
          return new_value  # Handle reaching limit
      calc_value(new_value, count + 1)

每次递归调用函数时,计数加1,检查是否达到限制。

通过使用default 参数,您无需在调用函数时进行设置:

calc_value(42)

您甚至可以更进一步,添加一个限制参数来指定迭代限制:

def calc_value(original_value, count = 0, limit = 100):
    # ...
    if count > limit:
        return new_value
    calc_value(new_value, count, limit)

然后您可以按顺序定义参数,也可以通过指定参数来定义:

# Default values: count = 0, limit = 100
calc_value(42)

# Will set count to default 0, and limit to 150
calc_value(42, limit=150)

# Will set count to 5, and limit to 200
calc_value(42, 5, 200)

# Will set count to 5, and limit to 150
calc_value(42, limit=150, count=5)

【讨论】:

    【解决方案3】:

    您可以使用function attributes。像这样的。

    def fun(x):
        if fun.counter<=max_value:
            fun.counter+=1
        else:
            return
        print x
        if x:
            fun(x-1)
    fun.counter = 0
    max_value = 3
    fun(5)
    

    【讨论】:

    • 我以前从未见过这些,所以这些和c中的静态变量一样吗?有没有办法像在 C 中那样在函数中初始化它们?
    • @GTBebbo 不完全相同,但可以这样使用
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多