2016-08-20 9 views
0

私はPythonとプログラミングに全く新しいですが、もっと実践的なアプローチを使ってそれを学びたいと思っています。関数の名前を含むリストを作成するには?

私がしようとしているのは、さまざまなユニットを変換するための演習です。ポンド - >キロ、足 - >メートルなど

私は別のユニットのペアのためのすべての機能を定義している:

def kg_to_g(value):  
    return round(value*1000.0,2) 
def g_to_kg(value):  
    return round(value/1000.0,2) 
def inch_to_cm(value): 
    return round(value*2.54,2) 
def cm_to_inch(value): 
    return round(value/2.54,2) 
def ft_to_cm(value):  
    return round(value*30.48,2) 

などをし、これらの関数の名前のリストを作成しました:

プログラムはランダムにユニットペア(kg->ポンド)と値(たとえば134.23)を選択する必要があり、ユーザーはそれらの値を変換するように求められます。

random_unit = random.choice(unit_list) 
lower = 0.1001 
upper = 2000.1001 
range_width = upper - lower 
ranval = round(random.random() * range_width + lower, 2) 

ユーザーが答えを入力すると、プログラムが関数で定義された計算で答えを比較する必要があり、それが正解か不正解の場合は、ユーザーに伝える:残念ながら

def input_handler(answer): 
    if answer == random_unit(ranval): 
     label2.set_text("Correct!") 
    else: 
     label2.set_text("Wrong!") 

、そのようにプログラムが」doesnのトン作業、およびcodesculptor(codesculptor.org)は

TypeError: 'str' object is not callable 

誰かがコードと間違っているものを私に説明して目を解決するために何かを提案してもらえエラーで返しますeの問題。

+1

'random_unit = random.choice(unit_list)'の後に 'random_unit = globals()[random_unit]を追加してください。 –

+0

'random_unit = random.choice(unit_list)': 'random_unit'に' unit_list'( 'str'のリスト)のランダムな項目を割り当てます。 'random_unit(ranval)'を呼び出すと、関数のように 'str'を使います(呼び出し可能は関数の別の名前です)。 – kjaquier

答えて

0

関数名を引用符で囲んでいるため、関数名は文字列になっています。

にあなたのリストを変更し

unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, 
     ft_to_cm, cm_to_ft, yard_to_m, m_to_yard, 
     mile_to_km, km_to_mile, oz_to_g, g_to_oz, 
     pound_to_kg, kg_to_pound, stone_to_kg, kg_to_stone, 
     pint_to_l, l_to_pint, quart_to_l, l_to_quart, 
     gal_to_l, l_to_gal, bar_to_l, l_to_bar] 

そして今、それは次のように呼び出すことができる機能のリストです:unit_list[0](34)、例えば。

だから今はrandom_unit(ranval)は例外をスローするべきではありません。

浮動小数点(if answer == random_unit(ranval))を比較すると、問題が発生する可能性が高いことにも注意してください。これがなぜであるかの詳細な説明については、Is floating point math broken?を参照してください。

四捨五入しているので、あなたはそれを取り除くことができますが、これを認識して、コード内で処理する必要があることを理解しておくとよいでしょう。

+0

ここで 'getattr'は必要ありませんか? – Ejaz

+0

@ PEJKいいえ、関数がリストにハードコードされていない場合は、このようにします。変数に関数の名前があり、それを呼びたい場合は、 'getattr()'はあなたの友人ですが、ここでは必要ありません。リストが定義されている場合、要素は関数自体への参照です。 – SiHa

+0

このソリューションは私のために働いた!ありがとうございました!私の欠点は、ユニットペアのリストを作成した後にユニットペア関数を定義したことで、その関数が定義されていないというエラーが発生しました。 –

-1

私はこれがあなたが求めていると思います。あなたは、リスト内の各項目を呼び出し、それをパラメータを与えることができ、この

unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, ft_to_cm] 

のように、リスト内の関数を保存することができるはずですし、それはこのように、たとえば関数を実行する必要があります

unit_list[0](value) 
関連する問題