首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python整型数除法与重载的有关问题

2012-12-28 
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

关键是参数在进入函数之前表达式就被计算过了吧,所以其实进到函数里的还是取整的结果.
[其他解释]
那就*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
>>> 






[其他解释]


编程的完美主义并不体现在这里。

引用:
我想发贴的时候没写清楚,我不要*1.0,不要float(),只想最纯粹的H(1/2)就能得到结果,我不是为结果而编程,而是希望能从中学到更多东西。请原谅楼主有些完美主义。

[其他解释]
引用:
没看到楼主已经知道__future__了,不好意思。

可以用环境变量PYTHONSTARTUP指定一个初始脚本,在该脚本中加上“from __future__ import division”。

Python code12345678910111213/tmp/ export PYTHONSTARTUP=/tmp/init.py /tmp/ cat /tmp/……

你好!我试了您的方法,修改环境变量后,在terminal中输入python命令,进入python的session,测试成功;不过,当我使用IDLE与python进行会话时,输入同样的表达式后结果还是被当作int截断了,请问该怎么办呢?
[其他解释]
引用:
不过,当我使用IDLE与python进行会话时,输入同样的表达式后结果还是被当作int截断了,请问该怎么办呢?


idle要用-s参数,才会加载初始文件。我尝试的结果是用-s参数后,初始文件确实加载了,但1/2还是返回0。

大概是idle加载初始文件后,又有什么代码改变了环境,把加载division的效果去掉了。要解决这个问题,就要去看idle的源码。但我觉得不值得花时间在这上面:就像其他回帖指出的,你可以用python3,也可以用原装的python,而不用idle。
[其他解释]
引用:
引用:不过,当我使用IDLE与python进行会话时,输入同样的表达式后结果还是被当作int截断了,请问该怎么办呢?

idle要用-s参数,才会加载初始文件。我尝试的结果是用-s参数后,初始文件确实加载了,但1/2还是返回0。

大概是idle加载初始文件后,又有什么代码改变了环境,把加载division的效果去掉了。要解决这个问……

明白了,非常感谢,可以结帖了

热点排行