【问题标题】:Why does this function not work in python 2.7 but work fine in python 3.6?为什么此功能在 python 2.7 中不起作用,但在 python 3.6 中却可以正常工作?
【发布时间】:2018-04-09 05:41:42
【问题描述】:

我不确定为什么在使用 python 2.7 运行时该函数对所有 n 值都返回 4,它在 3.6 中运行良好。 例如:aproxpi(1) 应该是 2.6666,aproxpi(2) 应该是 3.466666。

x = 1
y = 0
pi = 0
def aproxpi(n):
    global x, y, pi
    if n <= 0:
        if y % 2 == 0:
            pi += (float(1 / x))
        else:
            pi -= (float(1 / x))
        x = 1
        y = 0
        pi2 = pi
        pi = 0
        return 4 * pi2
    n -= 1
    if y % 2 == 0:
        y += 1
        pi += (float(1 / x))
        x += 2
    else:
        y += 1
        pi -= (float(1 / x))
        x += 2
    return aproxpi(n)

【问题讨论】:

  • 在 3.6.4 中工作正常,无法重现。旁注,不需要globals,只需在范围内定义即可。
  • 对不起,“在范围内定义”是什么意思,这是 python 的新手,我不明白这是什么意思。谢谢
  • 这意味着你不要像全局变量一样定义它们,因为这些变量只在函数中使用。如果你愿意,可以这样声明它们:x, y, pi = 1, 0, 0
  • 除此之外。 return aproxpi(n) 不是一个好主意,除非你想要一个递归函数。

标签: python python-3.x python-2.7


【解决方案1】:

你在 Python 2 中运行这个程序,默认情况下除法是整数除法。

将此行添加到程序的开头:

from __future__ import division

这将使除法更接近您的预期。

【讨论】:

  • 非常感谢您的回答。我设法通过更换来修复它。 pi -= (float(1 / x)) 与 pi -= 1.0/x
  • @Mustafa 我强烈建议迁移到 Python 3; Python 2 在演进过程中发现了许多设计缺陷,其中大部分已在 Python 3 中得到修复,因此您需要始终牢记的此类事情要少得多。
  • 是的,我主要使用python 3,但是我的老师坚持使用python 2,所以我必须确保代码在提交之前可以在python 2中运行。
  • @Mustafa 您可能会发现six 模块很有用。如果由于它不在标准库中而无法使用它,请在开头添加 from __future__ import unicode_literals, print_function, absolute_import, division, generators, nested_scopes, with_statement 以增加与 Python 3 的兼容性。(raw_inputxrange 仍然存在问题,但如果您使用别名这些也是...)
  • 伙计,我欠你一杯啤酒。我想知道为什么它在 Python 3 而不是 2 中工作。谢谢!
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 2016-08-26
  • 2019-03-17
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多