我在 Python 中的分数简化函数中的 return 语句不起作用
My return statement in a fraction-simplifying function in Python doesn't work
我有这个函数可以化简分数。
输入:2 个数字 - 一个分子和一个分母。
输出:2 个数字 - 一个分子和一个分母(简化)。
当我调用函数简化a = 12
和b = 36
,然后打印它们时,为什么它们仍然是a = 12
和b = 36
而不是a = 1
和 b = 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)
您的代码有两个问题,如下所示:
正如其他人所提到的,您没有捕获 return 值。你需要 a,b = simp(a,b)
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.
,则计算分子和分母
我有这个函数可以化简分数。
输入:2 个数字 - 一个分子和一个分母。
输出:2 个数字 - 一个分子和一个分母(简化)。
当我调用函数简化a = 12
和b = 36
,然后打印它们时,为什么它们仍然是a = 12
和b = 36
而不是a = 1
和 b = 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)
您的代码有两个问题,如下所示:
正如其他人所提到的,您没有捕获 return 值。你需要
a,b = simp(a,b)
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.
,则计算分子和分母