python整型数除法与重载的问题这学期在学信息论,有个计算信息熵的公式,带log2没法手算,于是写了一小段pyth
python整型数除法与重载的问题
这学期在学信息论,有个计算信息熵的公式,带log2没法手算,于是写了一小段python脚本,代码如下:(我用的版本是2.7)
def H(*p):
summ = 0
for px in p:
summ += -math.log(px,2) * px
if sum(p) <= 1:
pEnd = 1 - sum(p)
summ += -math.log(pEnd,2) * pEnd
return summ
这个函数存在一个名为infoTh的文件中,使用时import它就可以快速计算信息熵。
但问题是,当传入类似1/2这样的参数时,由于python将其认为是整型数,结果实际给H函数传入的参数变成了0,没法计算了。
比较差劲的解决方法是,1/2.0,或者在session中先from __future__ import division,但总觉得不方便。
试过在脚本中直接加入from __future__ import division,或者重载__div__(a,b),都不好使。
有高手能来看看怎样在session中只import一次自己的模块就能执行类似H(1/2)这样的操作的办法吗?
[最优解释]在你的script开始加上:
from __future__ import division
Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0
>>> from __future__ import division
>>> 1/2
0.5
>>>
[其他解释]觉得麻烦嘛,那换py3k版本...
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 1/2
0.5
>>>
[其他解释]H(1/2)=H(0),你函数再怎么改也没用。
老老实实H(1/2.0)不好吗?
[其他解释]最简单就是不管传参是什么,进去之后都 *1.0
[其他解释]关键是参数在进入函数之前表达式就被计算过了吧,所以其实进到函数里的还是取整的结果.
[其他解释]那就*1.0或者float转成浮点数
[其他解释]我想发贴的时候没写清楚,我不要*1.0,不要float(),只想最纯粹的H(1/2)就能得到结果,我不是为结果而编程,而是希望能从中学到更多东西。请原谅楼主有些完美主义。
[其他解释]可以试试Mathematica,输入1/2只会当做分数来处理,而且支持任意大小、任意精度的数,比如N[Pi,10^6],瞬间生成圆周率的100万位,
[其他解释]没看到楼主已经知道__future__了,不好意思。
可以用环境变量PYTHONSTARTUP指定一个初始脚本,在该脚本中加上“from __future__ import division”。
/tmp/ export PYTHONSTARTUP=/tmp/init.py
/tmp/ cat /tmp/init.py
from __future__ import division
/tmp/ python
Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0.5
>>>
[其他解释]
编程的完美主义并不体现在这里。
[其他解释]你好!我试了您的方法,修改环境变量后,在terminal中输入python命令,进入python的session,测试成功;不过,当我使用IDLE与python进行会话时,输入同样的表达式后结果还是被当作int截断了,请问该怎么办呢?
[其他解释]idle要用-s参数,才会加载初始文件。我尝试的结果是用-s参数后,初始文件确实加载了,但1/2还是返回0。
大概是idle加载初始文件后,又有什么代码改变了环境,把加载division的效果去掉了。要解决这个问题,就要去看idle的源码。但我觉得不值得花时间在这上面:就像其他回帖指出的,你可以用python3,也可以用原装的python,而不用idle。
[其他解释]明白了,非常感谢,可以结帖了