2009-07-27 7 views
2

Ich benutze oft den Python-Interpreter für schnelle numerische Berechnungen und möchte, dass alle numerischen Ergebnisse automatisch mit z. B. Exponentialnotation gedruckt werden. Gibt es eine Möglichkeit, dies für die gesamte Sitzung festzulegen?Wie steuere ich die Zahlenformatierung im Python-Interpreter?

Zum Beispiel, ich will:

>>> 1.e12 
1.0e+12 

nicht:

>>> 1.e12 
1000000000000.0 

Antwort

4

ein Python-Skript erstellen genannt, was auch immer Sie (sagen wir mystartup.py) möchten, und stellen Sie dann eine Umgebungsvariable PYTHONSTARTUP zu Der Pfad dieses Skripts. Python lädt dieses Skript dann beim Start einer interaktiven Sitzung (aber nicht beim Ausführen von Skripten).

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

Dann in einer interaktiven Sitzung: In diesem Skript eine ähnliche Funktion wie folgt definieren

 
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 
>>> 

Natürlich können Sie die Funktion definieren, die aufgerufen wird whaetver Sie wollen und genau arbeiten, wie auch immer du willst.

Noch besser als dies wäre IPython zu verwenden. Es ist großartig, und Sie können die Zahlenformatierung wie gewünscht einstellen, indem Sie result_display.when_type(some_type)(my_print_func) verwenden (siehe die IPython-Site oder suchen Sie nach weiteren Details zur Verwendung dieser).

1

Wie Sie wissen, dass Sie the % operator oder str.format zu Format-Strings verwenden können:

Zum Beispiel:

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

ich mich gefragt, ob Sie die eingebaute in float Klasse monkey patch konnte die Formatierung ändern, aber es scheint, dass Python Sie nicht im Stich:

>>> 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' 

So ist die einzige andere, was ich denken kann, ist Ihre eigene schreiben Dateiähnliches Objekt, das die Ausgabe erfasst, neu formatiert und an die Standardausgabe sendet. Sie würden dann auf dieses Objekt Standardausgabe des Interpreters umleiten:

sys.stdout = my_formatting_object 
+0

Ja, aber ich will das nicht haben, mit jeder Eingabe eingeben.Da ich die gleiche Formatierung für die gesamte Sitzung möchte, möchte ich es einmal einstellen und nicht mehr damit beschäftigen. –

+0

Whoops. Entschuldigung, habe deine Frage nicht richtig gelesen. Habe die Antwort erweitert, um deine Frage richtig zu behandeln, so weit ich kann. –

1

Hm ... Es ist nicht eine 100% ige Lösung, aber meiner Meinung nach sind gekommen ...

Wie wäre es ein bestimmendes Unterklasse von float, die eine überschriebene __str__ Methode hätte (um mit der Exp-Notation zu drucken). Und dann müssten Sie alle Ausdrücke mit Objektkonstruktionen dieser Klasse umhüllen. Es wäre ein bisschen kürzer als Daves Lösung sein, die Klasse einmal und dann schreiben Sie etwas definieren würden:

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

Aufbauend auf Dave Webbs Hinweis oben. Sie können natürlich die Genauigkeit einstellen, wenn Sie möchten ("% .3e") und ggf. Schreibmaschinen überschreiben.

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() 

und Nutzung:

>>> 14000  
1.400000e+04 
>>> "text" 
'text' 
Verwandte Themen