3

我经常使用 python 解释器进行快速数值计算,并希望使用指数符号等自动打印所有数值结果。有没有办法为整个会话设置这个?

例如,我想要:

>>> 1.e12
1.0e+12

不是:

>>> 1.e12
1000000000000.0
4

6 回答 6

4

创建一个 Python 脚本,命名为任何你想要的(比如mystartup.py),然后将环境变量设置PYTHONSTARTUP为此脚本的路径。然后 Python 将在交互式会话启动时加载此脚本(但在运行脚本时不加载)。在这个脚本中,定义一个类似这样的函数:

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

然后,在交互式会话中:

C:\temp>设置 PYTHONSTARTUP=mystartup.py

C:\临时>蟒蛇
ActivePython 2.5.2.2 (ActiveState Software Inc.) 基于
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 位 (Intel)] 开启
win32
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> _(1e12)
1.000000e+012
>>> _(14)
14
>>> _(14.0)
1.400000e+001
>>>

当然,您可以定义要称为 whaetver 的函数,并按照您的需要准确地工作。

比这更好的是使用IPython。这很棒,您可以通过使用来设置您想要的数字格式result_display.when_type(some_type)(my_print_func)(请参阅 IPython 站点或搜索有关如何使用它的更多详细信息)。

于 2009-07-27T08:31:41.260 回答
2

很抱歉发布了 necroposting,但这个主题出现在相关的谷歌搜索中,我相信这里缺少一个令人满意的答案。

我相信正确的方法是使用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

这将使用 exp 语法显示足够大的值。随意修改您认为合适的阈值。

或者,您可以以两种格式打印大数的答案:

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

或者,您可以为自己定义除 default 之外的另一个答案变量_,例如__(我知道这样的创造力):

builtins.__ = None
__orig_hook = sys.displayhook

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

sys.displayhook = __displayhook

...然后通过键入来显示 exp 格式的答案__

于 2019-03-10T14:48:42.140 回答
1

如您所知,您可以使用运算符%格式化str.format字符串:

例如:

>>> "%e" % 1.e12
'1.000000e+12'

我想知道您是否可以修补内置float类以更改格式,但似乎 Python 不会让您:

>>> 1.e12.__class__.__repr__ = lambda x: "%e" % x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'float'

所以我唯一能想到的另一件事是编写自己的类似文件的对象,该对象捕获输出,重新格式化并将其发送到标准输出。然后将解释器的标准输出重定向到该对象:

sys.stdout = my_formatting_object
于 2009-07-27T08:09:46.407 回答
1

嗯...这不是 100% 的解决方案,但我想到了这个...

如何定义一个具有重写__str__方法的 float 子类(使用 exp 表示法打印)。然后你必须用这个类的对象构造来包装所有表达式)。它会比 Dave 的解决方案短一点,你可以定义一次类,然后编写如下内容:

>>> F(1.e12)
1.0e+12
>>> F(3.)
3.0e+0
>>> F(1.+2.+3.+4.)
1.0e+1
...
于 2009-07-27T08:17:41.710 回答
1

基于上面 Dave Webb 的提示。如果您愿意,您当然可以设置精度 ("%.3e"),如果需要,也可以覆盖写入行。

import os
import sys

class ExpFloatFileObject:
    def write(self, s):
        try:
            s = "%e"%float(s)
        except ValueError:
            pass
        sys.__stdout__.write(s)

    def __getattr__(self, name):
        return getattr(sys.__stdout__, name)

sys.stdout = ExpFloatFileObject()  

和用法:

>>> 14000    
1.400000e+04  
>>> "text"
'text'
于 2009-07-27T09:45:13.797 回答
0

使用 IPython/Jupyter-console 时,“magic”命令%precision %e将以指数表示法更改原始浮点数的显示。https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-precision

对于更多的格式化控制,可以注册一个格式化程序:

excited_floats = lambda val: "{:e}!!!".format(val)
console_formatter = get_ipython().display_formatter.formatters['text/plain']
console_formatter.for_type(float, lambda val, p, c: p.text(excited_floats(val)))

https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.formatters.html#IPython.core.formatters.PlainTextFormatter

于 2018-10-24T20:40:03.703 回答