【问题标题】:python function always returns number 3 in version 2.7 but returns actual value in 3.5 [duplicate]python函数在2.7版中总是返回数字3,但在3.5版中返回实际值[重复]
【发布时间】:2018-08-04 14:30:53
【问题描述】:

这对我来说是一个很大的谜。

我有一个完全由粘贴代码组成的 python 脚本:

def onedutilfun(x):
    u = -( (x/2)**(1/2) + 2*((1-x)/3)**(1/2))
    return u

test = onedutilfun(0.01)
test2 = onedutilfun(99)

print(test)
print(test2)

我正在 Spyder 中运行此代码。我安装了一个运行 python 3.6 的 Spyder 和另一个运行 2.7 的 Spyder。如果我在 2.7 中运行它,无论我传递什么值,它都会返回 -3。我尝试了各种到浮点数的转换(u 和 x 已经是浮点数,Spyder 同意我的观点),但无济于事。

如果我在 python 3.6 中运行相同的代码,它可以正常工作,准确地返回它应该返回的内容。可能会发生什么?我意识到一种解决方案是使用更新的 python,但我需要提供在 2.7 中运行的代码。

值 99 返回一个复数,fyi。

我已将代码粘贴到 Google 的搜索栏中,图形函数(在实数系统中的函数域上)看起来也不错。

我之前在我的 Python 2.7 副本中成功使用了 **,并在它可以返回复数的情况下使用它,或者如果它返回复数可能会引发错误,除非我告诉它返回一个复数。

除了想要工作代码之外,我真的很喜欢解释我的代码发生了什么。谢谢。

【问题讨论】:

  • x 可能是一个浮点数,但在 Python 2.7 - 1/2 == 0... 所以与 ** 0 相关的任何内容都是 1 - ergo,你在 2.7 中的函数实际上是: return -(1 + 2*1) 这是你得到的-3
  • 可能一个简单的解决方法是使用** 0.5 而不是1/2...(或者,使用更明确的math.sqrt)(或者甚至在顶部放置一个from __future__ import division模块)
  • 谢谢。这个答案是有道理的;没有意识到 python 2.7 中的整数除法就是这种情况。

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


【解决方案1】:

在 python 2 中,整数除以 / 总是返回整数,向下取整,所以 1/2 == 0。任何 0 次方都是 1,所以你的函数返回 -(1+2)。

有很多方法可以纠正你的代码,但最简单的可能是

def onedutilfun(x):
    u = -( (x/2.)**(1/2.) + 2*((1-x)/3.)**(1/2.))
    return u

请注意,现在每个除法后面都有一个带有. 的数字,表示浮点数而不是整数。但是,这限制了函数的范围:它不再接受范围 [0, 1] 之外的数字,至少在 python 2 中是这样。如果您需要支持真实或复杂的结果,只需稍微修改一下即可:

def onedutilfun(x):
    x += 0j # ensure x is complex
    u = -( (x/2.)**(1/2.) + 2*((1-x)/3.)**(1/2.))
    if not u.imag:
        return u.real
    return u

这将在可能的情况下给出实数值(而不是例如 -1.316496580927726-0j),否则将给出复数值。

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2015-02-03
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2020-02-20
    • 2022-12-25
    相关资源
    最近更新 更多