2015-08-27 17 views
7

Scala ha la funzione apply().Programmazione Python e funzionale: esiste una funzione apply()?

Sono nuovo di Python e mi sto chiedendo come avrei dovuto scrivere il seguente one-liner:

(part_a, part_b) = (lambda x: re.search(r"(\w+)_(\d+)", x).groups())(input_string) 

mi sentirei meglio con qualcosa di simile:

(part_a, part_b) = input_string.apply(lambda x: re.search(r"(\w+)_(\d+)", x).groups()) 

mi sbaglio da un Punto di vista FF? Esiste una tale costruzione in Python?

Modifica: conosco il frammento scarsamente selezionato.

+0

No, là isn ma sarebbe abbastanza facile scrivere il proprio in modo tale che 'part_a, part_b = apply (lambda ...: ..., input_string)' funzionasse. – jonrsharpe

+1

Ciò richiederebbe che tutti gli oggetti abbiano un metodo apply, che non hanno. Quindi temo che tu debba convivere con quello. Nota che ciò con cui ti sentiresti meglio è un modo più lungo per scrivere la stessa cosa. – skyking

+3

Anche Python ha avuto una funzione 'apply' sin dall'inizio, ma poiché' apply (fn, args, kwargs) == fn (* args, ** kwargs) 'non ce la fa più. – thebjorn

risposta

11

Quando scrive Haskell scrive Haskell. Durante la scrittura di Python basta scrivere Python:

part_a, part_b = re.search(r"(\w+)_(\d+)", input_string).groups() 
+0

Consiglio molto saggio. –

1

Python non ha un tale costrutto; quale sarebbe il punto? lambda x: ... è una funzione e pertanto dovrebbe essere utilizzata come una normale funzione, ovvero come (lambda x: ...)(input_string) come nel primo frammento.

Tuttavia, nel tuo caso, non vedo alcun motivo per cui dovresti preoccuparti di un lambda; basta fare:

(part_a, part_b) = re.search(r"(\w+)_(\d+)", input_string).groups() 
1

Se sei preoccupato per il riutilizzo, si potrebbe compilare il regex:

rx = re.compile(r"(\w+)_(\d+)") 
a, b = rx.search(input_string).groups() 
+0

probabilmente non necessario: http://stackoverflow.com/a/452143/473285 – scytale

+2

Tendo a farlo per la documentazione più delle prestazioni (supponendo che possa dare a 'rx' un nome informativo). – thebjorn

1

Python utilizzato per avere una funzione (docs) si applicano, ma è stato rimosso in Python 3, poiché non era necessario e contro il principio di Python che ci dovrebbe essere un solo modo per fare una cosa particolare.

Supponiamo, abbiamo una funzione chiamata "func", possiamo facilmente chiamare func (* args) invece di apply (func, args).

+0

Grazie, ho modificato la mia risposta – hspandher

3

Se stai usando un pitone senza apply, si può sempre scrivere voi stessi ...

def apply(fn, args=(), kwargs=None): 
    if kwargs is None: 
     kwargs = {} 
    return fn(*args, **kwargs) 

solo perché si poteva, non significa che si dovrebbe ..

Problemi correlati