如何在Python解释器中控制数字格式?

3 投票
6 回答
2428 浏览
提问于 2025-04-15 13:11

我经常使用Python解释器来进行快速的数字计算,希望所有的数字结果都能自动以科学计数法的形式显示出来。请问有没有办法在整个会话中设置这个?

比如,我想要的是:

>>> 1.e12
1.0e+12

而不是:

>>> 1.e12
1000000000000.0

6 个回答

1

嗯……这不是一个百分之百的解决方案,但我想到了一些方法……

你可以定义一个浮点数的子类,并重写它的 __str__ 方法(这样可以用科学计数法来打印)。然后你需要把所有的表达式都用这个类的对象来包裹一下。

这样做会比Dave的方案稍微简短一些,你只需要定义一次这个类,然后就可以写类似下面的代码:

>>> F(1.e12)
1.0e+12
>>> F(3.)
3.0e+0
>>> F(1.+2.+3.+4.)
1.0e+1
...
2

抱歉打扰了,但这个话题在相关的谷歌搜索中出现,我觉得这里缺少一个满意的答案。

我认为正确的方法是使用 sys.displayhook。比如,你可以在你的 PYTHONSTARTUP 文件中添加这样的代码:

import builtins
import sys
import numbers


__orig_hook = sys.displayhook

def __displayhook(value):
    if isinstance(value, numbers.Number) and value >= 1e5:
        builtins._ = value
        print("{:e}".format(value))
    else:
        __orig_hook(value)

sys.displayhook = __displayhook

这样就可以用科学计数法显示比较大的数值。你可以根据自己的需要调整这个阈值。

另外,你也可以让答案同时以两种格式打印出来,适用于大数字:

def __displayhook(value):
    __orig_hook(value)
    if isinstance(value, numbers.Number) and value >= 1e5:
        print("{:e}".format(value))

或者你可以自己定义一个新的答案变量,除了默认的 _,比如 __(我知道这很有创意):

builtins.__ = None
__orig_hook = sys.displayhook

def __displayhook(value):
    if isinstance(value, numbers.Number):
        builtins.__ = "{:e}".format(value)
    __orig_hook(value)

sys.displayhook = __displayhook

... 然后只需输入 __ 就可以显示用科学计数法格式化的答案。

4

创建一个Python脚本,名字随你喜欢(比如叫 mystartup.py),然后设置一个环境变量 PYTHONSTARTUP,把这个脚本的路径放进去。这样,Python在你启动交互式会话时会自动加载这个脚本(但在运行其他脚本时不会加载)。在这个脚本里,你可以定义一个类似下面的函数:

def _(v):
    if type(v) == type(0.0):
        print "%e" % v
    else:
        print v

然后,在交互式会话中,你就可以使用这个函数了:

C:\temp>set PYTHONSTARTUP=mystartup.py

C:\temp>python
ActivePython 2.5.2.2 (ActiveState Software Inc.) based on
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> _(1e12)
1.000000e+012
>>> _(14)
14
>>> _(14.0)
1.400000e+001
>>>

当然,你可以把函数命名成你想要的名字,并且让它按照你想要的方式工作。

更好的选择是使用 IPython。这个工具非常棒,你可以通过 result_display.when_type(some_type)(my_print_func) 来设置你想要的数字格式(可以去IPython网站查找更多使用细节)。

撰写回答