2017-04-13 5 views
1

the power triangleの計算を実行するPythonプログラムを作成しています。私の方程式を選ぶ方法が最も効率的かどうかを判断する助けが必要です。どの入力が与えられたかに基づいてtrig計算を実行する

使い慣れていない場合は、単にコサインの法則を適用するだけです。 5つの可能な入力のうち、私は2つしか必要ではなく、他のものを計算することができます。私は出力を視覚化するmatplotlibも実装していますが、今は数学を実行したいだけです。

私は入力を取得するのにtkinterを使用し、入力を格納するには辞書を使用しています。

fields = 'kW', 'kVA', 'kVAR', 'PF', 'Theta' 
calcInputs = {} 

def fetch(entries): 
    for entry in entries: 
     field = entry[0] 
     text = entry[1].get() # User input for each textbox 
     print('%s: %s' % (field, text)) # Print to stdout with name 
     if len(text) == 0: 
      pass # Don't update dictionary with nulls 
     else: 
      calcInputs.update({field:text}) # name : value updated to dictionary 

後で、各辞書エントリを変数として保存します。後でfloatにキャストします。

kW = calcInputs.get('kW') 
kVA = calcInputs.get('kVA') 
kVAR = calcInputs.get('kVAR') 
pF = calcInputs.get('PF') 
theta = calcInputs.get('Theta') 

これは私が空であるものを知ることができますプレースホルダです:

for i in calcInputs: 
    if i is not None: 
     print({i}) 
    else: 
     pass 

私はNonesの組み合わせごとに機能を作り、そして私が持っているもののデータに基づいて適切なものを呼び出すのですか?それは最も真っ直ぐなもののようですが、よりよい方法が必要であるように感じます。

答えて

3

コードをもう少し「Pythonic」にしてみましょう。あなたが書いた:

calcInputs = {} 

def fetch(entries): 
    for entry in entries: 
     field = entry[0] 
     text = entry[1].get() # User input for each textbox 
     print('%s: %s' % (field, text)) # Print to stdout with name 
     if len(text) == 0: 
      pass # Don't update dictionary with nulls 
     else: 
      calcInputs.update({field:text}) # name : value updated to dictionary 

をこれはcalcInputsは、永続的になるだろうという問題がある - つまり、それは次のサイクル(複数のサイクルがあると仮定した場合)まで、周りのままになりますので、に1時間から周りのデータを保持するかもしれません次の関数内でその空の辞書を初期化してみましょう。常に清潔なスレートで始めます。 (注意:入力ボックスは、サイクルごとにその値を保ち場合、それは私と一緒に大丈夫だ - ユーザーはそれを見て、彼女が望んでいる場合は、それをきれいにすることができます。)

def fetch(entries): 
    inputs = {} 

この次のビットは大丈夫そうです、私はものの、 PythonのTkinterの下に精通していない:

for entry in entries: 
     field = entry[0] 
     text = entry[1].get() 

これは明らかにデバッグコードです - あなたは満足しているまでそれを続けます。

 print('%s: %s' % (field, text)) # Print to stdout with name 

次の部分は「間違っています。あなたがJavaから来ているように見えますが、これは素晴らしい言葉です。しかし、私たちは"truthiness"と構文的な砂糖のために、少し洗っています。 Pythonでは、彼らが空でない場合、文字列は「真」であり、辞書はdict[key]表記を使用してインデックスを作成することができます。

 if text: 
      inputs[field] = text 

をそして、それはこれだけです。しかし、我々はグローバル変数を使用していないことから、のは、先に行くと、結果を返してみましょう:

return inputs 

は今、あなたはフェッチ呼び出し、その結果を使用することができます。または、あなたが好きな場合は、結果をグローバルに再割り当てすることができます:

入力が完了したら、それを処理してください。入力した入力が実際に分からないという点で問題があります。

KW = 'kW' 
PF = 'PF' 
THETA = 'Theta' 
: 

calcInputs = fetch(entries) # Or however you choose to init calcInputs 

if KW in calcInputs and PF in calcInputs: 
    triangle_from_KWPF(calcInputs) 
elif KW in calcInputs and THETA in calcInputs: 
    triangle_from_KWTHETA(calcInputs) 
elif ... 
    : 
else: 
    report_error("You didn't provide enough inputs! I need at least 2!") 

Pythonのinオペレータ:簡単な方法は、我々はいくつかの定数を定義することによって、より簡単に作ることができる2つの値を、(引用符のすべての時間を入力する必要がないように)関与のif/then文だけのシリーズです辞書やセットのキーやメンバシップのテスト、文字列の部分文字列検索、リニアスキャンのリストとして機能します。

このアプローチは、@Aldenが記述するバイナリスタイルのシーケンスであり、すべてがスペルアウトされています。

もう一つの方法は、あなたの指定したパラメータを符号化ハッシュ可能オブジェクトを作成し、それらをディスパッチするために辞書を使用することです:

given_keys = [] 

for key in sorted(fields): 
    if key in calcInputs: 
     given_keys.append(key) 
     if len(given_keys) == 2: 
      break 
else: # Fell through 
    report_error("You didn't provide enough inputs! I need at least 2!") 

# given_keys has 2 field-names in it. Concatenate them. 
calc_key = '_'.join(given_keys) 

# calc_key looks like "KW_Theta" 

dispatch = { # dictionary: string -> function 
    'KW_Theta' : triangle_from_KW_Theta, 
    'KW_PF' : triangle_from_KW_PF, 
    # etc.... 
} 

calc_function = dispatch[calc_key] 

calc_function(calcInputs) 

注:for...elseが有効なPythonの形です。 forループがiterableを使い果たすと、else句が実行されます。だから、途中でbreakステートメントを持つブロックのために作られているのです。

+0

calcInputがクリアされないように修正しました。ありがとうございます。 私は実際にはJava(Javaの大学でのみ使用されている)よりもPythonに精通していますが、明らかにそれほど優れていません。 "if text:"部分は基本的に好きですがtrue:と思いますか?本質的な財産に頼っている? ハッシュ/連結方法は私にとっては最もコンパクトで読みやすいと思われるので、私はそれを実装しようと考えています。ありがとうございました! –

+0

ボーナスポイントの場合、関数名を正しく選ぶと、 'globals()'によって返された辞書をディスパッチ辞書にすることができます。実際の関数名を計算し、現在のモジュールで調べて呼び出します。 –

1

単純なバイナリマッピングを使用して、入力内容を確認し、適切な機能を適用できます。ここに例があります:

kW = input('kW') 
kVA = input('kVA') 
kVAR = input('kVAR') 
pF = input('PF') 
theta = input('Theta') 

inputs = (kW, kVA, kVAR, pF, theta) 

def cmp(t): 
    z = zip(inputs, t) 
    z = [a and b for a, b in z] 
    return sum(z) == sum(t) # 2 

if cmp((1,1,0,0,0)): 
    pass # kW and kVA given 
elif cmp((1,0,1,0,0)): 
    pass # kW and kVAR given 
elif cmp((1,0,0,1,0)): 
    pass 
elif cmp((1,0,0,0,1)): 
    pass 
elif cmp((0,1,1,0,0)): 
    pass 
elif cmp((0,1,0,1,0)): 
    pass 
elif cmp((0,1,0,0,1)): 
    pass 
elif cmp((0,0,1,1,0)): 
    pass 
elif cmp((0,0,1,0,1)): 
    pass 
elif cmp((0,0,0,1,1)): 
    pass 
+0

それは非常にコンパクトに見えますが、将来私はそれを更新するのに苦労します。私は特定のタスクがあるときにのみコーディングを行い、しばしばツールを数か月間更新しません。 何かを達成する別の方法でレッスンに感謝します。 –

関連する問題