2013-03-04 25 views
8

Così oggi in informatica ho chiesto di utilizzare una funzione come variabile. Ad esempio, posso creare una funzione, come returnMe (i) e creare una matrice che verrà utilizzata per chiamarla. Come h = [help, returnMe] e quindi posso dire h1 e chiamerebbe returnMe ("Bob"). Mi dispiace, ero un po 'emozionato per questo. La mia domanda è c'è un modo di chiamare come h.append (funzione def) e definire una funzione che esiste solo nella matrice?Funzioni Python all'interno degli elenchi

EDIT:

Ecco alcuni codice che ho scritto con questo! Così ho appena finito un fantastico FizzBuzz con questa soluzione grazie ancora! Ecco che il codice di esempio:
funct = [] s = ""

def newFunct(str, num): 
    return (lambda x: str if(x%num==0) else "") 

funct.append(newFunct("Fizz",3)) 
funct.append(newFunct("Buzz",5)) 

for x in range(1,101): 
    for oper in funct: 
     s += oper(x) 
    s += ":"+str(x)+"\n" 

print s 

risposta

12

È possibile creare funzioni anonime utilizzando la parola chiave lambda.

def func(x,keyword='bar'): 
    return (x,keyword) 

è più o meno equivalente a:

func = lambda x,keyword='bar':(x,keyword) 

Quindi, se si vuole creare una lista con le funzioni in esso:

my_list = [lambda x:x**2,lambda x:x**3] 
print my_list[0](2) #4 
print my_list[1](2) #8 
+0

Quindi è fantastico! Grazie mille! Parlavamo anche di fizzBuzz e pensavo che sarebbe stato fantastico risolverlo! – Hovestar

3

Non proprio in Python. Come mostra mgilson, puoi farlo con funzioni banali, ma possono contenere solo espressioni, non istruzioni, quindi sono molto limitate (ad esempio, non puoi assegnare ad una variabile).

Questo è ovviamente supportato in altre lingue: in Javascript, ad esempio, la creazione di sostanziali funzioni anonime e il loro passaggio è una cosa molto idiomatica da fare.

+0

Completando appena: questo rappresenta una delle caratteristiche distintive di Python e Javascript (tra le altre lingue che consentono un approccio funzionale). È una scelta di design - che offre una certa flessibilità per la leggibilità. – jsbueno

+1

Una nota a margine. I termini Lambda non sono necessariamente "banali". Il fatto che non possano contenere dichiarazioni non li limita molto, se li limita affatto (molte delle affermazioni sono superflue usando un approccio puramente funzionale). Il fatto che non si possa assegnare a variabili all'interno di un termine lambda, non lo limita affatto. Se questi aspetti fossero veramente dei limiti, i linguaggi funzionali puri sarebbero molto limitati (che non sono).Non sono nemmeno sicuro se esiste un programma python tale che non possa essere scritto come un termine lambda (se non fosse per il fatto che python non lo fa). – Hyperboreus

+0

Sono d'accordo anche con @Hyperboreus Ho giocato molto con lambdas in python e ho anche scritto un algoritmo genetico che era solo a due righe, uno per l'importazione casuale e l'altro per circa 2000 caratteri lungo ... – Hovestar

2

È possibile creare le funzioni nell'ambito originale, assegnarle all'array e quindi eliminarle dal loro ambito originale. Pertanto, puoi effettivamente chiamarli dall'array ma non come una variabile locale. Non sono sicuro che questo soddisfi le tue esigenze.

#! /usr/bin/python3.2 

def a (x): print (x * 2) 
def b (x): print (x ** 2) 

l = [a, b] 

del a 
del b 

l [0] (3) #works 
l [1] (3) #works 
a (3) #fails epicly 
2

È possibile creare una lista di lambda funzioni per incrementare per ogni numero da 0 a 9 in questo modo:

increment = [(lambda arg: (lambda x: arg + x))(i) for i in range(10)] 
increment[0](1) #returns 1 
increment[9](10) #returns 19 

Nota a margine:

penso che sia anche importante notare che questo (i puntatori di funzione non lambda) assomiglia in qualche modo a come Python trattiene i metodi nella maggior parte delle classi, tranne che in sostituzione di una lista, è un dizionario con nomi di funzioni che puntano alle funzioni. In molti, ma non tutti i casi, instance.func(args) equivale a instance.__dict__['func'](args) o type(class).__dict__['func'](args)

Problemi correlati