2017-05-16 5 views
-1

Ich habe Schwierigkeiten, eine bestimmte Funktion aus einem Wörterbuch vordefinierter Funktionen zurückzugeben. Hier ist mein Code:Wörterbuch der Funktionen gibt jede Funktion zurück

import random 

def bos1(): 
    print ("function 1") 

def bos2(): 
    print ("function 2") 

def bos3(): 
    print("function 3") 

def bos4(): 
    print("function 4") 
count = 0 

while True : 
    if count <4: 

     bos = "bos" 
     poz = random.randint(3, 4) 
     bos = bos+str(poz) 


     bosdict = {'bos1': bos1(),'bos2':bos2(),'bos3':bos3(),'bos4':bos4()} 
     count += 1 
     print("please only printe one",bosdict[bos]) 
     print("count:\n", count) 

     input("") 

    else: 

     bos = "bos" 
     poz = random.randint(1, 2) 
     bos = bos+str(poz) 


     bosdict = {'bos1': bos1(),'bos2':bos2(),'bos3':bos3(),'bos4':bos4()} 
     count += 1 
     print("please only printe one",bosdict['bos']) 
     print("count:\n", count) 

     input("") 

Ich habe eine erfolgreiche Version dieses Programms erstellt, das arithmetische Funktionen verwendet. Es wird die entsprechende Funktion relativ zu der Zeichenfolge zurückgegeben, die bei jeder Iteration verkettet wurde. Bei Funktionen, die eine Zeichenfolge zurückgeben sollen, werden jedoch bei jeder Iteration alle vier Funktionen im Wörterbuch zurückgegeben. Warum passiert das und wie kann ich es so verhalten wie das arithmetische Wörterbuch?

+0

Ändern Sie Ihre 'print' Aufrufe zu' return' Anweisungen ist die 'bos' Funktionen –

+0

@Chris_Rands ja, aber das würde die Funktionen nicht dynamisch aufrufen. Sie dynamisch aufzurufen, ist wahrscheinlich besser, aber nur wenn Parameter für die Funktionen vorhanden sind. –

Antwort

2

Sie erstellen kein Wörterbuch der Funktion, sondern ein Wörterbuch der Funktionsaufrufe (die None sind, da Ihre Funktionen nichts zurückgeben): alle Funktionen werden beim Erstellen des Wörterbuchs ausgeführt.

Entfernen Sie die () in Ihrem dict, werden Sie es verwenden, nachdem der Wert in der dict Abrufen der Funktion aufzurufen:

bosdict = {'bos1': bos1,'bos2':bos2,'bos3':bos3,'bos4':bos4} 

Anruf eine Zufallsfunktion wie folgt aus:

bosdict[random.choice(list(bosdict.keys()))]() 

oder vielleicht brauchen Sie die Tasten in diesem Fall nicht, nur die Werte:

random.choice(list(bosdict.values()))() 

oder mit dem erzeugten Namen von Zufallsindex:

bosdict["bos{}".format(count)]() 

Notiz, die dynamisch Aufruf hat die Funktionen nur ein gewisses Interesse, wenn die Funktionen langsam zu berechnen oder eine Nebenwirkung oder Parameter haben, sonst ist es besser, eine statische zu erstellen Wörterbuch (unter Verwendung return anstelle von print, wie Chris bemerkte).

+0

das war sehr hilfreich. Danke. Wie definiere ich die bestimmten Werte in der Zufallsauswahl? Wenn die Anzahl kleiner als vier ist, möchte ich, dass die ersten beiden Funktionen verwendet werden. Wenn die Zählung größer ist, möchte ich die letzten beiden Funktionen verwenden. Wie stelle ich das im Code dar? – toxxi

Verwandte Themen