2012-06-09 13 views
6

Nel mio libro di apprendimento Python, quando ho letto a List Comprehension, autore ha una piccola nota nel libro:Python: Lista Comprensione e programmazione funzionale

di Python di lista è un examIple del language'ssupport per funzionale concetti di programmazione ....

Sono andato su Wiki a leggere sulla programmazione funzionale. Ma sono difficile da immaginare perché non vedo qualcosa di simile tra List Comprehension e questo concetto nella pagina wiki.

Per favore mi dia una spiegazione chiara (e se può, mi dia qualche altro esempio sulla programmazione funzionale in Java o C# troppo: D)

Thanks :)

+0

java e C# non sono lingue funzionali – Denis

+1

@Denis no, ti sbagli. molti esempi da provare per te. LINQ è basato sulla programmazione delle funzioni. E ha un libro: 'Programmazione funzionale in .NET'. In Java, non lo so. – hqt

+5

Lol se C# è un linguaggio funzionale per il quale microsoft ha creato F #? Confondi paradigma con lo zucchero della sintassi. – Denis

risposta

6

Se la tua domanda è "dammi alcuni esempi che mostrano come funziona FP in python", quindi:

Qual è pura programmazione funzionale (in Python)?

È un paradigma di programmazione che evita lo stato e i dati mutabili e fa affidamento sui valori di ritorno delle funzioni. Questo significa che un programma puramente funzionale scritto in python non avrà le cose come le variabili, stati ecc

Non così puro FP

È possibile combinare la FP e paradigma imperativo, e con buoni risultati (vedi here) . L'elenco collegato è un programma di quiz matematico che ho realizzato per una classe Python che ho preso alcuni mesi fa. Sentiti libero di fare quello che vuoi con il codice.

FP in Java/C#

io personalmente non hanno alcuna esperienza con C# in modo che qualcun altro avrebbe bisogno di inviare un esempio in C#, ma si può avere FP in Java, ma non pura FP.Esempio:

int fib (int x) { 
    if (x < 2) return x; 
    return fib (x-1) + fib(x-2); 
} 

Il metodo di cui sopra è completamente FP, ma non può essere utilizzato in un contesto puro FP utilizzando Java. Questo deve essere inserito all'interno di una classe C in Java e può essere chiamato solo dopo il in cui è stato istanziato un oggetto di quel tipo. Quest'ultima parte squalifica la classe Java C da FP, ma il metodo sarà ancora.

Modifica: in realtà, è possibile avere metodi statici in Java che possono essere utilizzati senza alcuna istanziazione. Pertanto, se si modifica la firma in static int fib (int x), il metodo e le sue chiamate di metodo potrebbero essere FP se richiamate in modalità FP.


Re: il tuo commento

ricorsione può essere FP, ma non deve essere (vedi sotto):

def f(first, rest): 
    print first 
    first = rest[0]; rest = rest[1:] 
    f(first, rest) 

Si può anche avere FP senza ricorsione:

def sum (a,b): 
    return a+b 

def square(c): 
    return c*c 

def square_of_sum (x,y): 
    return square(sum(x,y)) 
+1

oh. il tuo codice è ricorsione, e noi chiamiamo FP? se è vero, questo esempio non mi persuade molto, perché è troppo lento per far slittare altri metodi. – hqt

1

Sono sicuro che gli altri saranno in grado di spiegarlo meglio di quanto non sarà, ma la programmazione funzionale ha a che fare principalmente con il modo in cui pensi al flusso del programma e se puoi o meno aggirare le funzioni come oggetti su cui calcolare. Ad esempio in javascript quando si fornisce una funzione da eseguire quando un incendio pari passa a una funzione e in questo senso è quasi come una programmazione funzionale.

Questo è il senso in cui la comprensione delle liste è come la programmazione funzionale perché si stanno dando istruzioni su come calcolare ciascun elemento piuttosto che l'approccio più procedurale che sarebbe quello di scorrere e fare da soli il calcolo piuttosto che distribuirlo come una funzione. Python non è realmente quello che considererei un vero linguaggio di programmazione funzionale come LISP o ML o Haskell, (non si può ricordare erlang?) Ma può fare qualcosa di simile (guarda le espressioni lambda in python).

Java e C/C++ non sono realmente funzionali, ma è possibile simularlo con i puntatori di funzione come argomenti. Non è familiare con C# ...

I linguaggi basati sugli eventi tendono a utilizzare questa idea di funzione che passa di più solo perché hanno bisogno di un modo per passare codice sconosciuto da eseguire in un secondo momento.

4

Python's map(), reduce() and filter() esegue una sequenza, applica un'altra funzione a sua scelta e quindi restituisce una sequenza diversa, lasciando intatta la sequenza originale.

Si potrebbe dire che è funzionale poiché non tocca la sequenza originale, non tocca il suo stato internamente e non produce effetti collaterali. (Anche se la funzione ti fornite a si potrebbe fare un po 'di quanto sopra, come produrre un effetto collaterale)

Functional Programming è un modo diverso di programmazione e di strutturare la vostra applicazione per ridurre gli errori causati da effetti collaterali (cambiando qualche valore in un'altra posizione o processo statico direttamente) e per ridurre o eliminare la necessità di sincronizzare l'accesso ai dati condivisi. Alcune lingue ti costringono a questo, come erlang e altri ti lasciano più a te scegliere quale percorso preferisci al momento (procedurale o funzionale), con preferenza al lato funzionale dello spettro di programmazione, come scala

+0

effetto collaterale. Io davvero non capisco molto questo termine. puoi darmi un esempio, per favore. (significa che non so quale problema sarà l'effetto collaterale in OOP e non in Programmazione funzionale) – hqt

+3

un effetto collaterale è fondamentalmente qualcosa che riguarda il "mondo esterno" (significato esterno al di fuori della portata della tua funzione), anche una semplice stampa di testo è un effetto collaterale. –

+0

Non vedo molto in merito a 'side-effect' Scusate se capisco male, ma riguardo' affect out side world ', penso che si riferisca alla programmazione tecnica. Ad esempio in C: 'public public A (int a);' non influenzerà nulla. ma 'public public A (int * a);' interesserà var a. – hqt

0

Semplice penso I termini Map e Reduce derivano dalla programmazione Lisp e funzionale.

e Python ha

filtro, mappa e ridurre

ref: http: //www.joelonsoftware.com/items/2006/08/01.html

http://docs.python.org/tutorial/datastructures.html 
4

credo Pitoni Le comprensioni delle liste sono prese direttamente da Haskell (un linguaggio funzionale molto 'puro').

Haskell:

[ x | x <- [1..10] ] 

Python:

[ x for x in range(1,11) ] 

come hanno già detto, Python fa permettere concetti funzionali, come ad esempio map(), reduce(), e lambda

mentre questi sono tutti funzionali idee, raramente possono essere utilizzate in un modo puramente funzionale in quanto Python non è ricorsivo.

se vuoi scoprire i linguaggi "Funzionali" guarda "Haskell", "Scala", "Clojure", "Erlang", "F #" ... che sono tutti più o meno funzionali (anche se alcuni potrebbero suggerire che non è il caso)

E se si vuole veramente capire di cosa tratta la programmazione funzionale date un'occhiata qui. learn you a haskell for great good che è una lettura facile, ha delle belle foto e ti aprirà gli occhi.

EDIT -

Esempi di Haskell funzioni fattoriali (tutti fanno la stessa cosa):

fact1 0 = 1 
fact1 n = n * fact1 (n - 1) 


fact2 n | n == 0 = 1 
     | otherwise = n * fact2 (n - 1) 


fact3 n = case n of 
      0 -> 1 
      _ -> n * fact3 (n - 1) 

ps, ​​uno sguardo a questo question così come è rilevante.

+1

hmmm io non direi che di Python di lista viene da Haskell, ma molto probabilmente da [teoria degli insiemi] (http: //en.wikipedia. org/wiki/Set-builder_notation) ... Haskell e Python sono solo alcune delle [lunghe liste di lingue] (http://en.wikipedia.org/wiki/List_comprehension) che implementano un tale zucchero sintattico. – cedbeu

Problemi correlati