在循环外保持Python条件?

2024-10-02 12:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我在Python中学习了这个等分搜索算法,并应用它来寻找一个数的平方根。至于算法,尽管有其局限性,但我在JavaScript中经常做的一件事是将条件封装在变量中,以便更易于阅读,例如:

var isGreaterThanFive = num > 5;
if(isGreaterThanFive && otherConditions...)

虽然在JavaScript中这样做非常好,但在Python中尝试这样做时,我的程序似乎进入了一个无限循环。这是我的JavaScript代码:

function sqrtOf (x) {
  var min = 0
  var max = x
  var epsylon = 0.001
  var guess = (max + min) / 2 
  var guessNumber = 0;

  //I created these two so it is easier to understand
  var notCloseEnough = Math.abs(Math.pow(guess, 2) - x) >= epsylon;
  var stillPlausible = guess <= x;

  while (notCloseEnough && stillPlausible) {
    guessNumber += 1

    if(Math.abs(Math.pow(guess, 2)) > x) {
      max = guess;
    } else {
      min = guess;
    }

    guess = (max + min) / 2;
  }

  return guess;
}

console.log(sqrtOf(25)); // 5

现在在Python中:

def sqrtOf (x)
  minVal = 0
  maxVal = x
  epsylon = 0.001
  guess = (maxVal + minVal) / 2.0 
  guessNumber = 0;

  notCloseEnough = abs(guess ** 2 - x) >= epsylon
  stillPlausible = guess <= x

  while notCloseEnough and stillPlausible:
    guessNumber += 1

    if abs(guess ** 2) > x:
        maxVal = guess
    else:
        minVal = guess

    guess = (maxVal + minVal) / 2.0

  return guess

print sqrtOf(25)

Tags: ifvarmathabsjavascriptminmaxguess
2条回答

当你写信的时候

notCloseEnough = abs(guess ** 2 - x) >= epsylon

您计算了语句abs(guess ** 2 - x) >= epsylon,并将其结果赋给notCloseEnough。不会再次进行该计算,因为您稍后在代码中碰巧引用了它的结果。你知道吗

如果你想重新评估事物,你需要一个函数对象。可以定义对外部函数的局部变量具有可见性的内部函数。你知道吗

def sqrtOf (x):
  minVal = 0
  maxVal = x
  epsylon = 0.001
  guess = (maxVal + minVal) / 2.0 
  guessNumber = 0

  def notCloseEnough():
    return abs(guess ** 2 - x) >= epsylon

  def stillPlausible():
    return guess <= x

  while notCloseEnough() and stillPlausible():
    guessNumber += 1

    if abs(guess ** 2) > x:
        maxVal = guess
    else:
        minVal = guess

    guess = (maxVal + minVal) / 2.0

  return guess

print sqrtOf(25)

这也很好,stillPlausible让我困惑。输入应该在循环之前得到验证。你知道吗

def sqrtOf(x):
  minVal = 0
  maxVal = x
  epsylon = 0.001
  guess = (maxVal + minVal) / 2.0
  guessNumber = 0;
  def trytrytry():
    while True:
      yield (abs(guess ** 2 - x) < epsylon, guess - x < epsylon)

  for (closeEnough, stillPlausible) in trytrytry():
    if closeEnough or not stillPlausible:
      break
    guessNumber += 1

    if abs(guess ** 2) > x:
        maxVal = guess
    else:
        minVal = guess

    guess = (maxVal + minVal) / 2.0

  return guess

print sqrtOf(25)

相关问题 更多 >

    热门问题