python_640x400

Introducción a Python

Python es un lenguaje de programación interpretado, cuya filosofía hace hincapié en una sintaxis muy limpia y un código inteligible. Aquí les presento una lista de razones para aprender Python.

Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis muy limpia y un código inteligible. Acá les presento una lista sobre las razones de aprender python.

Es una buena opción alternativa para decantarse por este lenguaje en el mundo de la programación, pues es un lenguaje muy sencillo y simple.

Su sintaxis es fácil de entender pues es próxima al lenguaje natural, y los programas hechos en Python semejan pseudocódigos, lo que brinda una enorme ayuda en su mantenimiento.

Su código es más organizado evitando el uso del signo de punto y coma al final de cada sentencia y asimismo evita el empleo de llaves para detallar que dicho bloque de código pertenece a una sentencia. Para esto Python utiliza la indentación, la que esta representada por un bloque de 4 espacios, teniendo de esta manera un código legible.

Acá les dejo este curso interactivo para aprender python

scala

Ejemplo Scala (2)

El programa funcional atrapa la esencia del algoritmo Quicksort de una forma concisa:

Si el arreglo está vacío o bien consiste de un solo elemento, entonces ya está ordenado, con lo que se retorna de manera inmediata.
Si el arreglo no está vacío ni es único, se escoge un factor a la mitad del arreglo tal y como si fuera un pivotee.
Se parte el arreglo en 2 subarreglos conteniendo elementos que, respectivamente, sean menores y mayores que el factor pivotee, y un tercer arreglo que contiene los elementos igual al pivotee (con el procedimiento filter).
Se ordenan los primeros 2 subarreglos por invocación recursiva de la función de ordenación. [1]
El resultado se consigue al acomodar los 3 subarreglos juntos.
[1] Esto no es precisamente lo que hace el algoritmo imperativo; el llamado siguiente de la función, parte el arreglo en 2 subarreglos conteniendo elementos menores o bien mayores o bien iguales al pivotee.
Tanto la implementación imperativa como la funcional tienen exactamente la misma dificultad asintótica – O(N;log(N)) en el caso promedio y O(N^2) en el peor de los casos. Mas donde la implementación imperativa opera sobre el arreglo que le llega como razonamiento modificándolo, la implementación funcional retorna un nuevo arreglo acomodado y deja el arreglo que le llega como razonamiento sin cambio. La implementación funcional requiere más memoria transitiva que la imperativa.

La implementación funcional hace parecer a Scala tal y como si fuera un lenguaje que se especializa en operaciones funcionales sobre arreglos. En verdad, no es así; todas y cada una de las operaciones usadas en el ejemplo son bien simples métodos de la clase sequence Seq[T], los que son una parte de la biblioteca estándar de Scala, misma incorporada en Scala. Dado a que los arreglos son instancias de Seq todos y cada uno de los métodos de sequence están libres para ellos.

Particularmente, hay un procedimiento filter que toma como razonamiento una función de predicado. Esta función de predicado mapea los elementos del arreglo a valores booleanos. El resultado de filter es un arreglo consistente con todos y cada uno de los elementos del arreglo original para los que la función de predicado es auténtica (true, en ingles). El procedimiento filter de un objeto de tipo Array[T] tiene esta estructura:

Acá, T => Boolean es del género de funciones que toma un factor de tipo T y retorna un Boolean. Las funciones como filter que toman otra función como razonamiento para retornar uno como resultado se llaman funciones de orden superior (higher-order functions, en inglés).
Scala no distingue entre identificadores y nombres de operador. Un identificador puede ser tanto una secuencia de letras y dígitos que empiecen con una letra, o bien pueden ser una secuencia de caracteres singulares, como “+”, “*”, o bien “:”. Cualquier identificador puede emplearse como un operador infijo en Scala. La operación binaria E\ op\ E’ se interpreta siempre y en toda circunstancia como una llamada del procedimiento Y también.op(E’) . Esto asimismo aplica para operadores infijos binarios los que empiecen con una letra. Por tanto, la expresión xs filter (pivote >) es equivalente a la llamada del procedimiento xs.filter(pivote >).

En el programa Quicksort, a filter se aplica 3 veces una función anónima como razonamiento. El primer razonamiento, pivote > , representa una función que toma a x como razonamiento y retorna el valor pivote > x . Este es un caso de una función parcialmente aplicada (Partially applied function, en inglés). Otra forma equivalente de redactar esta función la que muestra explícitamente al razonamiento restante es x => pivote > x. La función es anónima, o sea, no se define con un nombre. El género de factor x se omite por el hecho de que el compilador de Scala puede inferirlo de forma automática del contexto donde la función se emplea. Para resumir, xs.filter(pivote >) retorna una lista consistente con todos y cada uno de los elementos de la lista xs que sean más pequeños que pivote.

Al mirar nuevamente en detalle a la primera implementación imperativa de Quicksort, hallamos que muchos de los constructos de lenguaje empleados en la segunda solución están asimismo presentes, sin embargo, en una forma disfrazada.

Por servirnos de un ejemplo, los operadores binarios “estándar” como +, -, o bien < no se tratan de ningún modo singular. Como append, son métodos de sus operando izquierdo. Consecuentemente, la expresión i + 1 se mira como la invocación i.+(1) del procedimiento + del valor entero x.

Como es natural, un compilador es libre (y si es moderadamente inteligente, aun se espera que lo haga) de reconocer el caso singular en al llamar al procedimiento + sobre razonamientos enteros y producir código eficaz para esto en una línea.

Para un diagnóstico de fallos más eficaz y mejor, el ciclo while es un constructo primitivo en Scala. Mas de entrada, bien podría haber sido una función predefinida. Acá hay una posible implementación de él:

La función While toma como su primer factor una función de prueba, lo que no toma factores y genera un valor boolean. Como segundo factor toma una función de comando la que tampoco toma factores y genera un resultado del tipo Unit. While invoca la función de comando mientras que la función de prueba genera true.
El tipado Unit de Scala corresponde grosso modo al void en Java; se utiliza siempre y cuando una función no regrese un resultado interesante. En verdad, como Scala es un lenguaje orientado a expresiones, una función siempre y en todo momento retorna algún resultado. Si no se da una expresión de regreso de forma explícita, se acepta el valor (), que se pronuncia “unit”. Este valor es del tipo Unit. Las funciones que retornan Unit asimismo se llaman procedimientos. Acá está una formulación más “orientada a expresiones” de la función swap en la primera implementación del Quicksort, que hace esto explicito:

 

El valor que regresa esta función es sencillamente su última expresión – la palabra clave return no es precisa. Nótese que las funciones que retornan un valor explícito precisan un “=” ya antes de acotar su cuerpo o bien de delimitar sus expresiones.

scala

Ejemplo Scala (1)

Como primer ejemplo, acá está una implementación de un Quicksort en Scala.

La implementación luce muy afín a como se escribiría en Java o bien C. Empleamos exactamente los mismos operadores, y estructuras de control afines. Hay asimismo ciertas diferencias sintácticas menores, en particular:

Las definiciones empiezan con una palabra reservada. Con def empiezan las definiciones de las funciones, con var empiezan las definiciones de variables y con val empiezan las definiciones de valores (esto es, variables de solo lectura o bien inalterables).
El género de dato de un símbolo, se declara tras el símbolo y 2 puntos (:). La declaración del género de dato de manera frecuente puede suprimirse, puesto que el compilador puede inferirlo del contexto.
Las clases de arreglo se escriben Array[T] en vez de T[], y las elijas del arreglo se escriben a(i) en vez de a[i].
Las funciones pueden anidarse en otras funciones. Las funciones anidadas pueden tener acceso a factores y variables locales de las funciones donde están incluidas. Por servirnos de un ejemplo, el nombre del arreglo xs es perceptible tanto en la función swap, como en la función sort1, y por ende no se requiere pasárselos como razonamiento.
Hasta el momento, Scala luce como un lenguaje común y corriente, con ciertas características particulares sintácticas. En verdad es posible redactar programas de una forma imperativa usual o bien en estilo orientado a objetos sin inconveniente. Esto es esencial pues es una de las cosas que hace simple conjuntar componentes de Scala con componentes escritos en otros lenguajes dominantes como Java, C# o bien Visual Basic.

No obstante, asimismo es posible redactar programas en un estilo que luzca totalmente diferente. Hete aquí un Quicksort nuevamente, mas esta vez escrito en estilo funcional.

 

scala

¿Qué es Scala?

El nombre de Scala brota de la unión de 2 palabras: scalable y language. Con esto ya sabemos qué objetivo tiene este lenguaje de programación multiparadigma que combina propiedades de lenguajes funcionales con orientados a objetos.

Un lenguaje de programación multiparadigma es aquel que deja al programador escoger diferentes “estilos” de desarrollo en dependencia del género de problema: programación lógica, funcional, orientada a objetos…

Integración con Java

Scala se ejecuta sobre una máquina virtual Java, lo que deja la integración de peculiaridades o bien librerías entre los dos lenguajes. Es posible, entre otras muchas cosas, llamar a métodos de Java, heredar clases o bien incorporar interfaces. Esta integración es recíproca, esto es, podemos emplear Java en Scala y Scala en Java.

Poder programar en los dos lenguajes al tiempo es ventajoso para el desarrollador, en tanto que por servirnos de un ejemplo se podría usar Java como lenguaje primordial en un proyecto y en ciertos casos redactar código en Scala.

Diferencias con Java

Pese a tener similaridades como la orientación a objetos o bien ejecutarse sobre una JVM (Java Virtual Machine), asimismo hay algunas diferencias entre los dos lenguajes.

La primera que hallamos es que con Scala dismuyen drásticamente el número de líneas de código que se van a escribir en un proyecto. Vamos a ver de qué forma queda probado a lo largo del curso. Además de esto, Scala favorece la concurrencia y paralelización en la ejecución del código.

Por otro lado, el código Java es más inteligible que el de Scala, si bien todo es habituarse. En Scala podemos delimitar funciones en funciones, en objetos que están en una clase cualquiera. Puede ser algo complicado, mas asimismo depende del programador y de la experiencia adquirida al desarrollar. Otra esencial diferencia es que Scala aguanta la sobrecarga de operadores, característica que no hallamos en Java.

Java, por su lado, trata todo como un objeto. Scala, no obstante, trata todo como una variable. Es precisamente por esto que vamos a ver de qué manera se puede pasar una función como factor a otra función.

Herramientas para el curso

Primero se van a explicar los conceptos básicos usando la shell de Scala. Es bastante útil para iniciar, mas llega un instante en el que hay que dar el salto a un ambiente de desarrollo que nos ofrezca funcionalidades auxiliares. Debido a esto, emplearé IntelliJ Idea. En nuestros días en su versión catorce, es posible descargarlo desde su Web para probarlo a lo largo de treinta días y, para estudiantes hay una licencia gratis a lo largo de un año.

Cada pupilo puede emplear el IDE que desee. Vamos a aprender a configurar múltiples. Probablemente Eclipse, NetBeans y también IntelliJ Idea.
Desarrollo del curso

El curso se dividirá en múltiples partes. No deseo hacer artículos largos y bastante difíciles de leer. Como siempre y en todo momento, procuraré que haya equilibrio entre teoría y práctica, decantando la balanza cara el lado práctico, como es natural.