2013-01-04 4 views
3

Bonjour les utilisateurs de débordement de pile. Je me demandais s'il y avait un moyen de choisir une fonction au hasard?Choix aléatoire d'une fonction

exemple:

from random import choice 
random_function_selector = [foo(), foobar(), fudge()] 

print choice(random_function_selector) 

def foo() : 
    # some code follows. 

J'ai pensé pendant environ 20 minutes comment cela pourrait être fait, j'ai même vérifié dans la documentation python. En fait, depuis que j'écris cela, j'ai l'impression d'avoir eu une révélation ... Au lieu d'utiliser une liste mutable, je devrais peut-être utiliser un type immuable tel qu'un tuple.

Note: Désolé si cela peut être une question noob, mais je n'ai pas programmé depuis si longtemps.

Répondre

12
from random import choice 
random_function_selector = [foo, foobar, fudge] 

print choice(random_function_selector)() 

fonctions Python sont de première objets de classe: vous pouvez vous y référer par nom sans les appeler, puis les invoquer plus tard.

Dans votre code d'origine, vous invoquiez les trois, puis vous choisissiez aléatoirement parmi les résultats. Ici, nous choisissons une fonction de manière aléatoire, puis l'invoquons.

+1

Ah oui! Je ne pensais pas à les appeler, je pensais que Python ne saurait pas ce que je veux dire quand j'essayais d'accéder à foo plutôt qu'à foo(). Merci d'avoir rendu les choses plus claires :) – S3pHiRoTh

0
  1. Générer un nombre aléatoire jusqu'à nombre d'éléments que vous avez
  2. appeler une fonction en fonction de ce nombre

aléatoires importation

choice = random.randomint(0,3) 
if choice == 0: 
    foo() 
elif choice == 1: 
    foobar() 
else: 
    fudge() 
6
from random import choice 

#Step 1: define some functions 
def foo(): 
    pass 

def bar(): 
    pass 

def baz(): 
    pass 

#Step 2: pack your functions into a list. 
# **DO NOT CALL THEM HERE**, if you call them here, 
#(as you have in your example) you'll be randomly 
#selecting from the *return values* of the functions 
funcs = [foo,bar,baz] 

#Step 3: choose one at random (and call it) 
random_func = choice(funcs) 
random_func() #<-- call your random function 

#Step 4: ... The hypothetical function name should be clear enough ;-) 
smile(reason=your_task_is_completed) 

Juste pour le plaisir:

Notez que si vous voulez vraiment définir la liste des choix de fonction avant vous définissez réellement les fonctions, vous pouvez le faire avec une couche d'indirection supplémentaire (bien que je ne pas recommander - il n'y a aucun avantage à le faire de cette façon aussi loin que je peux voir ...):

def my_picker(): 
    return choice([foo,bar,baz]) 

def foo(): 
    pass 

def bar(): 
    pass 

def baz(): 
    pass 

random_function = my_picker() 
result_of_random_function = random_function() 
2

Presque - essayez ceci:

from random import choice 
random_function_selector = [foo, foobar, fudge] 

print(choice(random_function_selector)()) 

Cela affecte les fonctions elles-mêmes dans la liste random_function_selector, plutôt que les résultats de l'appel de ces fonctions. Vous obtenez alors une fonction aléatoire avec choice, et appelez-le.

0

Une façon simple:

# generate a random int between 0 and your number of functions - 1 
x = random.choice(range(num_functions)) 
if (x < 1): 
    function1() 
elif (x < 2): 
    function2() 
# etc 
elif (x < number of functions): 
    function_num_of_functions() 
+1

Bien que je n'ai pas downvote, il n'est pas difficile de voir pourquoi - votre code est assez verbeux et non-Pythonic, par rapport, disons, à la réponse de Ned. – Peter

+0

haha ​​ouais les gens python (que je ne suis pas) sont très défensifs sur "Pythonic", ce qui est totalement juste et correct. Figuré, il ne pouvait pas faire de mal de donner une stratégie facile à comprendre pour quelqu'un venant d'un paradigme non-python. Ned's est bien sûr la réponse idéale. – mfrankli

+1

'random.randint (...)' est probablement plus facile à comprendre que 'random.choice (range (...))' au moins ... – mgilson

Questions connexes