Sintaxis para llamar a una función aleatoria de una lista

De este hilo: ¿Cómo realizo un evento aleatorio en Python seleccionando una variable aleatoria?

Aprendí que es posible poner algunas funciones en una lista, y usando random.choice() , llame a una de ellas para generar un evento aleatorio.

Estoy interesado en hacer esto porque estoy escribiendo un juego bastante pequeño basado en texto como parte de un tutorial para principiantes.

Pero cuando escribo lo que creo que me dará el resultado deseado (es decir, solo una de las funciones que se llama e imprime su cadena)

 import random def func_test_1(): print "This is func_test_1." def func_test_2(): print "This is func_test_2." def func_test_3(): print "This is func_test_3." my_list = [func_test_1(), func_test_2(), func_test_3()] random.choice(my_list) 

Obtengo este resultado:

 C:\Windows\system32\cmd.exe /c python random_func.py This is func_test_1. This is func_test_2. This is func_test_3. Hit any key to close this window... 

Que es las tres funciones que se llaman e imprimen.

¿Podría alguien ayudarme con la syntax correcta para hacer esto? Gracias.

Con los paréntesis llamas a la función. Lo que desea es asignarlos a la lista y llamar a la opción más adelante:

 my_list = [func_test_1, func_test_2, func_test_3] random.choice(my_list)() 

En primer lugar, cuando haces my_list = [func_test_1(), func_test_2(), func_test_3()] almacenas resultados de funciones, no funciones en la lista. Haga my_list = [func_test_1, func_test_2, func_test_3] lugar y luego llame a la función aleatoria. Me gusta esto:

 my_list = [func_test_1, func_test_2, func_test_3] random.choice(my_list)() 

Las funciones son objetos en Python.

Si se refiere a ellos solo por su nombre (sin los paréntesis, ¡lo que realmente llama a la función!), Se refiere a los objetos de función subyacentes. Puede volver a enlazarlos, inspeccionarlos … o almacenar una referencia a ellos en una lista.

mylist = [test_func_1,test_func_2,..]

En este punto, ninguna de las funciones ha sido ejecutada. Luego puede usar random.choice para elegir una función de la lista e invocarla usando () :

  • mylist[0]() llama a la primera función en la lista
  • random.choice(mylist)() llama a una función aleatoria