2016-08-20 3 views
0

Ich bin völlig neu in Python und Programmierung, aber ich versuche es zu lernen, mit mehr praktischen Ansatz.Wie erstelle ich eine Liste mit Namen von Funktionen?

Was ich versuche, ist eine Übung zum Konvertieren verschiedener Einheiten, z. Pfund -> Kilogramm, Fuß -> Meter usw.

Ich habe für verschiedene Einheitenpaare alle Funktionen definiert:

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) 

usw.

und eine Liste mit den Namen dieser Funktionen erstellt:

Das Programm sollte nach dem Zufallsprinzip ein Einheitspaar (z. B. kg-> Pfund) und Wert (z. B. 134,23) auswählen, und der Benutzer wird aufgefordert, diese Werte zu konvertieren.

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

Wenn Benutzer Antwort kommt, sollte das Programm Antwort mit den durch die Funktion definiert Berechnungen vergleichen und Benutzer sagen, ob es eine richtige Antwort oder falsche Antwort ist:

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

Leider auf diese Weise Programm doesn‘ t Arbeit und codesculptor (codesculptor.org) kehrt mit einem Fehler

TypeError: 'str' object is not callable 

Könnte jemand mir bitte erklären, was mit dem Code falsch ist, und legt nahe, etwas th zu lösen Das Problem.

+1

Fügen Sie 'random_unit = globals() [random_unit]' nach 'random_unit = random.choice (unit_list)' hinzu. –

+0

'random_unit = random.choice (unit_list)': Diese Zeile weist 'random_unit' ein zufälliges Element' unit_list' zu (das ist eine Liste von 'str'). Sie rufen dann 'random_unit (ranval)' auf, also verwenden Sie eine 'str' wie eine Funktion (eine aufrufbare Funktion ist ein anderer Name für die Funktion). – kjaquier

Antwort

0

Da Sie die Funktionsnamen (in der Liste) in Anführungszeichen eingeschlossen haben, sind sie zu Strings geworden.

Ihre Liste ändern:

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] 

Und jetzt ist es eine Liste von Funktionen, die wie folgt genannt werden können: unit_list[0](34), zum Beispiel.

So sollte jetzt random_unit(ranval) keine Ausnahme auslösen.

Beachten Sie auch, dass der Vergleich von Floats (if answer == random_unit(ranval)) höchstwahrscheinlich Probleme verursacht. Eine detaillierte Erklärung, warum dies so ist, finden Sie unter Is floating point math broken?.

Während Sie herumrunden, können Sie damit durchkommen, aber es ist gut, sich dessen bewusst zu sein und zu verstehen, dass Sie in Ihrem Code damit umgehen müssen.

+0

'getattr 'wird hier nicht benötigt? – Ejaz

+0

@PEJK Nein, nicht wenn die Funktionen in der Liste fest codiert sind. Wenn Sie den Namen einer Funktion in einer Variablen haben und sie aufrufen wollen, dann ist ja "getattr()" Ihr Freund, aber hier ist es nicht notwendig. Wenn die Liste definiert ist, sind die Elemente Verweise auf die Funktionen selbst. – SiHa

+0

Diese Lösung hat für mich funktioniert! Vielen Dank! Mein Fehler war, dass ich meine Einheitenpaarfunktionen definiert hatte, NACHDEM ich eine Liste von Einheitenpaaren erstellt hatte - dies führte zu einem Fehler, der besagte, dass die Funktion nicht definiert war. –

-1

Ich denke, das ist, was Sie fragen. Sie sollten die Funktionen in einer Liste wie diese

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

Sie dann jedes Element rufen in der Liste kann gespeichert werden können, und geben ihm einen Parameter, und es sollte die Funktion zum Beispiel wie folgt aus:

unit_list[0](value) 
Verwandte Themen