2012-06-09 10 views
6

En mi libro de aprendizaje de Python, cuando leí a List Comprehension, autor tiene una pequeña nota en el libro:Python: lista por comprensión y programación funcional

lista por comprensión de Python es un examIple del language'ssupport para funcional conceptos de programación ....

Tengo en Wiki para leer acerca de la Programación Funcional. Pero me cuesta imaginarlo porque no veo algo igual entre List Comprehension y este concepto en la página wiki.

Por favor, dame una explicación clara (y si se puede, me dan algunos ejemplos más sobre la programación funcional en Java o C# también: D)

Gracias :)

+0

java y C# no son idiomas funcionales – Denis

+1

@Denis no, estás equivocado. muchos ejemplos para demostrar para usted. LINQ es la base de la programación de funciones. Y tiene un libro: 'Programación funcional en .NET'. En Java, no sé. – hqt

+5

Lol si C# son idiomas funcionales para los cuales Microsoft hizo F #? Confundes paradigma con sintaxis azúcar. – Denis

Respuesta

6

Si su pregunta es "dame algunos ejemplos que muestran cómo funciona FP en Python", entonces:

¿Cuál es la programación funcional pura (en Python)?

Es un paradigma de programación que evita los datos de estado y mutables y en su lugar se basa en valores de retorno de función. Esto significa un programa puramente funcional escrito en Python no tendrá cosas como las variables, estados, etc.

No es tan puro FP

Puede combinar la FP y paradigma imperativo, y con buenos resultados (véase here) . La esencia vinculada es un programa de preguntas y respuestas matemáticas que realicé para una clase de Python que tomé hace algunos meses. Siéntete libre de hacer lo que quieras con el código.

FP en Java/C#

yo personalmente no tienen experiencia con C# para que otra persona tendría que poner un ejemplo de C#, pero se puede tener FP en Java, pero no pura FP.Ejemplo:

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

El método anterior es completamente FP, pero no se puede utilizar en un contexto de FP puro cuando se utiliza Java. Esto debe colocarse dentro de una clase C en Java, y solo puede llamarse después de ha creado una instancia de un objeto de ese tipo. Esta última parte descalifica a la clase Java C de ser FP, pero el método seguirá siendo.

Editar: en realidad, puede tener métodos estáticos en Java que se pueden usar sin ninguna instanciación. Por lo tanto, si cambia la firma al static int fib (int x), entonces el método y sus llamadas al método podrían seguir siendo FP si se llama de manera FP.


Re: su comentario

recursividad puede ser FP, pero no tiene que ser (véase más adelante):

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

Usted también puede tener FP sin recursividad:

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. su código es recurrencia, y llamamos que es FP? si es cierto, este ejemplo no me convence demasiado, porque es demasiado lento para que otros métodos lo hagan. – hqt

1

Estoy seguro de que otros serán capaz de explicarlo mejor que yo, pero la programación funcional tiene que ver principalmente con la forma en que piensas del flujo del programa y si puedes pasar las funciones como objetos para calcular. Por ejemplo, en javascript cuando se proporciona una función para que se ejecute cuando un disparo uniforme se trata de una función, en este sentido es casi como una programación funcional. Este es el sentido en que la comprensión de lista es como la programación funcional porque usted está dando instrucciones sobre cómo calcular cada elemento en lugar del enfoque más procedural que sería recorrerlo y hacer el cálculo usted mismo en lugar de entregarlo como Una función. Python no es realmente lo que yo consideraría un verdadero lenguaje de programación funcional como LISP o ML o Haskell, (¿es erlang? No lo recuerdo) pero puede hacer cosas como esta (mire las expresiones lambda en python).

Java y C/C++ tampoco son realmente funcionales, pero podría simularlo con punteros a funciones como argumentos. No tan familiar con C# ...

Los lenguajes dirigidos por eventos tienden a hacer uso de esta idea de función que pasa más solo porque necesitan alguna forma de pasar código desconocido para ser ejecutado en una fecha posterior.

4

Python's map(), reduce() and filter() tome una secuencia, aplique otra función de su elección y luego regrese una secuencia diferente, dejando la secuencia original intacta.

Se podría decir que es funcional, ya que no toca la secuencia original, no toca su estado internamente y no produce efectos secundarios. (aunque la función que usted le proporcione podría hacer algo de lo anterior, como producir un efecto secundario)

Functional Programming es una manera diferente de programar y estructurar su aplicación para reducir los errores causados ​​por los efectos secundarios (cambiando algún valor en otra ubicación o proceso estático directamente) y para reducir o eliminar la necesidad de sincronizar el acceso a los datos compartidos. Algunos lenguajes te obligan a esto, como erlang y otros dejan más que elegir la ruta que mejor se adapte al momento (de procedimiento o funcional), con preferencia al lado funcional del espectro de programación, como scala

+0

efecto secundario. Realmente no entiendo mucho este término. puedes darme un ejemplo, por favor? (significa que no sé cuál será el efecto secundario en OOP y no en la Programación funcional) – hqt

+3

un efecto secundario es básicamente cualquier cosa que afecte al 'mundo exterior' (significado externo fuera del alcance de su función), incluso una simple impresión de texto es un efecto secundario. –

+0

No veo mucho diferente sobre el 'efecto secundario' Lo siento si entiendo mal, pero sobre' afectar al mundo lateral', creo que se relaciona con la programación técnica. Por ejemplo, en C: 'public void A (int a);' no afectará nada. pero 'public void A (int * a);' afectará var a. – hqt

0

Simple, creo que Los términos Map y Reduce provienen de Lisp y la programación funcional.

y Python tiene

filtro, mapa y reducir

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

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

creo Las comprensiones de la lista de pitones se toman directamente de Haskell (un lenguaje funcional muy "puro").

Haskell:

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

Python:

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

como han mencionado, Python sí permite conceptos funcionales, tales como map(), reduce() y lambda

mientras que estos son todos funcionales ideas, rara vez se pueden usar de una manera puramente funcional ya que Python no es amigable para la recursividad.

si desea conocer las lenguas "Funcionales", mire en 'Haskell', 'Scala', 'Clojure', 'Erlang', 'F #' ... que son más o menos funcionales (aunque algunos podrían sugieren que no es el caso)

Y si realmente quiere saber de qué se trata la programación funcional, eche un vistazo aquí. learn you a haskell for great good que es fácil de leer, tiene buenas fotos y te abrirá los ojos.

EDITAR -

Ejemplos de Haskell funciones factoriales (todos a hacer lo mismo):

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, ​​echar un vistazo a este question, así como que es relevante.

+1

hmmm No diría que la comprensión de la lista de Python proviene de Haskell, pero muy probablemente de [teoría de conjuntos] (http: //en.wikipedia. org/wiki/Set-builder_notation) ... Haskell y Python son solo algunos de la [larga lista de idiomas] (http://en.wikipedia.org/wiki/List_comprehension) que implementan dicho azúcar sintáctico. – cedbeu