3

私は頻繁にPythonインタープリターを使用して迅速な数値計算を行い、すべての数値結果を、たとえば指数表記を使用して自動的に出力したいと考えています。セッション全体でこれを設定する方法はありますか?

たとえば、次のようにします。

>>> 1.e12
1.0e+12

いいえ:

>>> 1.e12
1000000000000.0
4

6 に答える 6

1

ご存知のように、%演算子orを使用して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%の解決策ではないけど、これが頭に浮かんだ…

オーバーライドされたメソッドを持つfloatのサブクラスを定義するのはどうですか__str__(exp表記で出力するため)。そして、このクラスのオブジェクト構築ですべての式をラップする必要があります)。デイブのソリューションよりも少し短くなります。クラスを一度定義してから、次のように記述します。

>>> 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")、必要に応じて writelines を上書きすることもできます。

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 に答える