为何aproxpi函数在Python2.7返回异常,却在Python3.6运行正常?
问题根源:Python 2.7 和 Python 3.x 的整数除法差异
你遇到的问题完全是因为Python 2 和 Python 3 对整数除法的处理逻辑不一样,咱们一步步拆解:
为什么 Python 2.7 里始终返回4?
在 Python 2.7 中,当两个整数做除法运算(比如1/x,这里x是整数)时,会执行整数除法——也就是直接舍去小数部分,只保留整数结果。比如:
1/1→ 1(这个没问题)1/3→ 0(重点在这!)1/5→ 0
看你的代码,虽然你写了float(1/x),但在 Python 2.7 里,1/x会先以整数除法得到0,再转成float还是0。这就导致:
- 第一次累加时,
pi += float(1/1)→ pi变成1 - 后续所有的加减操作,都是加/减0,pi的值始终保持1
- 最后返回
4*pi2→ 4*1=4,不管n输入多少,结果都是4
而 Python 3.6 中,1/x会直接执行浮点数除法,1/3得到0.3333...,所以累加逻辑能正常工作,返回预期的结果。
解决办法
方法1:修改除法表达式,强制浮点数运算
把代码里的1/x改成1.0/x,这样因为其中一个操作数是浮点数,Python 2.7 会触发浮点数除法:
x = 1 y = 0 pi = 0 def aproxpi(n): global x, y, pi if n <= 0: if y % 2 == 0: pi += (float(1.0 / x)) # 改成1.0/x else: pi -= (float(1.0 / x)) x = 1 y = 0 pi2 = pi pi = 0 return 4 * pi2 n -= 1 if y % 2 == 0: y += 1 pi += (float(1.0 / x)) # 改成1.0/x x += 2 else: y += 1 pi -= (float(1.0 / x)) # 改成1.0/x x += 2 return aproxpi(n)
方法2:导入Python 3的除法规则
在Python 2.7代码的最顶部加上一行:
from __future__ import division
这样整个文件里的除法都会遵循Python 3的规则,1/x直接变成浮点数除法,不需要修改其他代码。
额外建议:避免使用全局变量
你的函数依赖全局变量x、y、pi,这很容易导致意外的状态污染(比如多次调用函数时可能出现奇怪的问题)。推荐改成用局部变量的版本,比如:
def aproxpi(n): pi = 0.0 sign = 1 denominator = 1 # 先执行n次迭代,对应原来的递归逻辑 for _ in range(n+1): pi += sign * (1.0 / denominator) sign *= -1 denominator += 2 return 4 * pi
这个版本更简洁,也不会有全局变量的问题,在Python 2和3里都能正常运行。
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

