2016-06-01 19 views
0

Ich habe AnalogX PCalc seit Jahren als meine gehen zu Rechner für die Rückseite der Hüllkurve interaktive Berechnungen, wo Integer-Mathematik ist wichtig und flexible Basis-Eingabe und Ausgabe ist wichtig. Wenn Sie zum Beispiel mit Festkommazahlen arbeiten, ist oft weder eine Dezimalzahl noch eine Hexadezimalansicht der Zahlen hilfreich, um sich mit Problemen zu befassen. Es hat auch nette C Math-Funktionen eingebaut, sowie String-Funktionen, die ganze Zahlen zurückgeben. Nachteile sind offensichtlich darin, dass es in Funktionssatz und auch nur Windows begrenzt ist.Verwenden von Python Interactive als Programmierungsrechner

Ich dachte, dass Python interaktiv wäre ein viel besserer Rechner, und es ist in der Regel bereits, wenn Sie nur für eine Basis interessieren, und kümmern sich nicht über ganzzahlige Mathe-Spielereien. Aber zumindest für diese beiden Zwänge ist es nicht so toll. Also wäre es zumindest möglich, Python interaktiv zum Ausdrucken von Ganzzahlen in mehreren Basen oder einer anderen Basis als Basis 10 zu bekommen, ohne jedes Mal "hex()" voranzustellen?

+0

Können Sie nicht einfach ein kleines Modul mit einer Funktion erstellen, die eine Zahl in allen gewünschten Formaten ausgibt? –

+1

Überprüfen Sie das Dezimal-Modul, eine Unterklasse vom Dezimal-Typ könnte leicht dazu gebracht werden, in einem bevorzugten Format auszugeben, und Sie stoßen nicht auf Gleitkomma-Genauigkeitsprobleme bei der Division. – Perkins

Antwort

1

Python-Standardbibliothek bietet code und codeop Module, so dass die Funktionalität von REPL auch in anderen Programmen verwendet werden kann. Beispiel: Hier ist eine Beispiel-Python-Datei, die die Standardbibliotheksklassen erweitert und eine neue interaktive Konsole bereitstellt, die ganzzahlige Ergebnisse in andere Basen umwandelt (derzeit werden Base 2 und 16 unterstützt, aber das Hinzufügen anderer Basen sollte einfach sein).

$ python <this_script> 16 

Und wenn die Ergebnisse: Unterstützung sowohl Python 2 und 3.

#!/usr/bin/env python 
from __future__ import print_function 

import sys 
import code 

try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 


class NumericConsole(code.InteractiveConsole): 
    def __init__(self, *args, **kwargs): 
     code.InteractiveConsole.__init__(self, *args, **kwargs) 
     self.base = 10 

    def runcode(self, code_to_run): 
     return_val, output = self._call_and_capture_output(code.InteractiveConsole.runcode, self, code_to_run) 
     try: 
      output = self._to_target_base(output) + '\n' 
     except ValueError: 
      pass 
     print(output, end='') 
     return return_val 

    def _to_target_base(self, value): 
     # this can be extended to support more bases other than 2 or 16 
     as_int = int(value.strip()) 
     number_to_base_funcs = {16: hex, 2: bin} 
     return number_to_base_funcs.get(self.base, str)(as_int) 

    def _call_and_capture_output(self, func, *args, **kwargs): 
     output_buffer = StringIO() 
     stdout = sys.stdout 
     try: 
      sys.stdout = output_buffer 
      func_return = func(*args, **kwargs) 
     finally: 
      sys.stdout = stdout 
     return (func_return, output_buffer.getvalue()) 


def interact(base=10): 
    console = NumericConsole() 
    console.base = base 
    console.interact() 


if __name__ == '__main__': 
    base = len(sys.argv) > 1 and int(sys.argv[1]) or 10 
    interact(base) 

Jetzt können Sie dieses Skript ausführen und geben Sie die gewünschte Basis als erstes Argument CLI sind ein paar zusätzliche Zeilen verwendet jeder Ausdruck ist eine ganze Zahl, wird es im Hex-Format gedruckt.

Natürlich können weitere Basen hinzugefügt werden (vorausgesetzt, Sie haben eine Funktion, um den Dezimalwert in diese Basis zu konvertieren), und es gibt schönere Möglichkeiten, CLI-Argumente zu übergeben.

+0

Das ist ein guter Start. Dies kann auf jeden Fall erweitert werden, um in der Funktionalität zu dem Multi-Base-Ausgang zu sein, während es in der Funktionalität überlegen ist. Der einzige Nachteil ist, dass ein Skript auf dem laufenden Rechner installiert werden muss, da der Hook nicht besonders einfach zu installieren ist. –