2016-06-01 15 views
0

ように私は、整数演算は、重要かつ柔軟なベース入力と出力が重要ですエンベロープインタラクティブな計算の背中のために計算するために私の行くように年間のAnalogX PCalcを使用しています。たとえば、固定小数点数を使って作業する場合、問題の周りを頭で囲むために、数字の小数点または六角のビューは一度も役に立ちません。また、素晴らしいCの数学関数が組み込まれているだけでなく、整数を返す文字列関数も組み込まれています。欠点は、機能セットとWindowsだけに制限があるという点で明らかです。プログラミング電卓

私はPythonの対話がはるかに良い電卓だろうと考えていた、とあなたはたったの約1ベースを気にし、整数数学のペテンを気にしないならば、それは一般的に既に、あります。しかし、少なくとも2つの制約については、それほど大きくない。ですから、少なくとも、16進数の "hex()"を前に置かずに、複数の桁、または基数10を超える別の桁に整数を出力するPythonインタラクティブを得ることは可能でしょうか?

+0

は、あなただけのすべての希望の形式で番号を出力機能を備えた小型のモジュールを作成することができませんか? –

+1

Decimalモジュールをチェックアウトすると、Decimal型のサブクラスを簡単に優先形式で出力することができ、除算を実行するときに浮動小数点精度の問題に遭遇することはありません。 – Perkins

答えて

1

Python標準ライブラリはcodecodeopモジュールを提供しているので、REPLの機能は他のプログラムでも使用できます。

たとえば、標準のライブラリクラスを拡張して、整数結果を他のベースに変換する新しい対話型コンソールを提供するサンプルPythonファイルです(現在ベース2と16がサポートされていますが、余分な行のカップルはPython 2と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) 

をサポートするために使用されている今、あなたは、このスクリプトを実行し、最初のCLI引数として所望の塩基を渡すことができます。

$ python <this_script> 16 

と結果の場合任意の式の値が整数の場合、16進形式で出力されます。もちろん、以上の塩基の

は(あなたがそのベースに10進値を変換するために、そこに機能を持っていますと仮定)を追加することができ、およびCLIの引数に渡すためにきれいな方法があります。

+0

これは素晴らしいスタートです。これは、機能面で優れているが、マルチベース出力に近い機能になるように拡張することができます。フックはインストールが非常に簡単ではないので、実行中のマシンにスクリプトを置くだけの欠点があります。 –