我在 Python 中的分数简化函数中的 return 语句不起作用

My return statement in a fraction-simplifying function in Python doesn't work

我有这个函数可以化简分数。

当我调用函数简化a = 12b = 36,然后打印它们时,为什么它们仍然是a = 12b = 36而不是a = 1b = 3?

这个Python代码:

def simp(n, d):

  # Find the smaller number
  limit = min(n,d)

  # For loop that repeatedly divides numerator and denominator by a common dividend
  for dividend in range(limit, 2, -1):
    if (n % limit == 0) and (d % limit == 0):
      n = n / limit
      d = d / limit
  
  # Return the simplified numbers
  return (n, d)

a = 12
b = 36
print(a, "/", b,)
print("should be simplified down to")
simp(12, 36)
print(a, "/", b)

输出:

12 / 36
should be simplified down to
12 / 36

我认为不是算法的问题,因为当我在函数中尝试print(n, "/", d)时,它正确输出了1 / 3。所以可能是return语句有问题,我就是不知道哪里出了问题。

您将 simp(12,36) 称为 returns 一个元组,但您没有将其分配给任何东西。

你需要做的就是在你调用simp的地方放置[a,b] = simp(12,36)

编辑: 不需要括号,直接a, b = simp(12,36)即可。谢谢@Barmar

您的代码存在的问题是,您希望对函数内部的参数 (n,d) 进行更改,从而以某种方式改变函数外部变量 (a,b) 的内容。情况并非如此,因此您必须将返回值重新分配给原始变量以更新它们:a,b = simp(a,b)

与其循环查找公约数,我建议使用 gcd 直接获取公约数。会让功能变得非常简单

# greatest common divisor (gcd using Euclidian division algorithm) 
def gcd(a,b): 
    return a if b == 0 else gcd(b,a%b) 

def simp(n, d):
    c = gcd(n,d)
    return (n//c,d//c)

print(*simp(12,36),sep="/")  # 1/3

您应该像这样将返回值重新分配给变量 a 和 b:

a, b = simp(a, b)
print(a, "/", b)

您的代码有两个问题,如下所示:

  1. 正如其他人所提到的,您没有捕获 return 值。你需要 a,b = simp(a,b)

  2. for 循环中还有另外两个错误,因为您应该测试余数并除以 dividend,并且由于范围不包括停止值,它应该是 1因此 2 被测试为股息。

  # For loop that repeatedly divides numerator and denominator by a common dividend
  for dividend in range(limit, 1, -1):
    if (n % dividend == 0) and (d % dividend == 0):
      n = n / dividend
      d = d / dividend

最后,这不是简化分数的最佳方法,尤其是在数字非常大的情况下。您应该计算最大公约数,例如使用 Euclid's algorithm,如果 >1.

,则计算分子和分母