如何在Python解释器中控制数字格式?
我经常使用Python解释器来进行快速的数字计算,希望所有的数字结果都能自动以科学计数法的形式显示出来。请问有没有办法在整个会话中设置这个?
比如,我想要的是:
>>> 1.e12
1.0e+12
而不是:
>>> 1.e12
1000000000000.0
6 个回答
嗯……这不是一个百分之百的解决方案,但我想到了一些方法……
你可以定义一个浮点数的子类,并重写它的 __str__
方法(这样可以用科学计数法来打印)。然后你需要把所有的表达式都用这个类的对象来包裹一下。
这样做会比Dave的方案稍微简短一些,你只需要定义一次这个类,然后就可以写类似下面的代码:
>>> F(1.e12)
1.0e+12
>>> F(3.)
3.0e+0
>>> F(1.+2.+3.+4.)
1.0e+1
...
抱歉打扰了,但这个话题在相关的谷歌搜索中出现,我觉得这里缺少一个满意的答案。
我认为正确的方法是使用 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
... 然后只需输入 __
就可以显示用科学计数法格式化的答案。
创建一个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网站查找更多使用细节)。