Losowanie funkcji z listy

0

Jak można prawidłowo zrobić losowanie z listy w której są też funkcje? Powinny się losować i normalne zmienne i funkcje. Czyli jak np. mam listę [2, "something", f1(), 4, f2()] to czasami powinna się wylosować liczba 2, czasami słowo "something" a czasami jakaś funkcja.

import random
    
def f1():
    print 'a'
    print 'b'

def f2():
    print 'c'
    print 'd'
    

my_list = [2, "something", f1(), 4, f2()]
print random.choice(my_list)

Wygląda na to, że funkcje w liście są zamieniane na None, bo jak wylosuje mi funkcję to nic mi się nie wypisuje.

2

Masz na liście wywołania funkcji, a nie funkcje.

0

No trudno żebym miał całe funkcje w liście, wiadomo że mam wywołania.

0

Skoro masz wywołania to na twoją listę trafiają wartości tych funkcji, a skoro nic nie zwracają to jest to None. Zmień na

[2, "something", f1, 4, f2]

Przykładowy wynik:

<function f2 at 0x0000000001F77128>
0

Chodzi mi raczej o to, żeby np. po podaniu indeksu listy gdzie znajduje się jakaś funkcja, np. a[4], wywołała mi się ta funkcja a więc wypisało mi się 'c' i 'd' a nie o to żeby trzymać w liście adresy tych funkcji.

0

Oczywiście chodziło mi o my_list[4]. Gdyby to był prosty przykład to mógłbym jeszcze napisać:

def f2():
    return ('c', 'd')

ale moje rzeczywiste funkcje są dużo bardziej skomplikowane, poza tym nic nie zwracają.

2

No to musisz mieć wskaźnik i zrobić coś takiego:

a[4]()

Ewentualnie możesz dynamicznie sprawdzać czy wylosowana wartość jest funkcją za pomocą isfunction z modułu inspect

import random
import inspect
 
def f1():
    print 'a'
    print 'b'
 
def f2():
    print 'c'
    print 'd'
 
 
my_list = [2, "something", f1, 4, f2]
something = random.choice(my_list)
if inspect.isfunction(something):
	something()
else:
	print something

1 użytkowników online, w tym zalogowanych: 0, gości: 1