trabajo computo

35
UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE INGENIERIA ECONOMICA Y CIENCIAS SOCIALES COMPUTACION EC-110K SEMESTRE ACADEMICO 2012 - 2 ESPECIALIDAD: E1 Presentamos: Lenguajes de programación Phyton y Ruby. Presentado por: Aybar Fernández, Omar 20121114A Mallma Huamancha, Summan Jus 20121436I Berrocal Duran, Pedro 20121311A LIMA - PERU 2012 1

Upload: ucsur

Post on 28-Jan-2023

1 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE INGENIERIA ECONOMICA

Y CIENCIAS SOCIALES

COMPUTACION EC-110K

SEMESTRE ACADEMICO 2012 - 2

ESPECIALIDAD: E1

Presentamos: Lenguajes de programación Phyton y Ruby.

Presentado por: Aybar Fernández, Omar 20121114A

Mallma Huamancha, Summan Jus 20121436I

Berrocal Duran, Pedro 20121311A

LIMA - PERU

2012

1

INDICE

RESUMEN……………………………………………………………….... 3

PYTHON

Información general………………………………………………………….. 4 Historia……………………………………………………………………….. 6 Características y paradigmas…………………………………………........... 9 Modo interactivo…………………………………………………………...... 9 Elementos del lenguaje………………………………………………………. 10 Comentarios…………………………………………………………………. 10 Variables………………………………………………………………........... 11 Tipos de datos……………………………………………………………….. 11 Listas y tuplas…………………………………………………………........... 12 Diccionarios…………………………………………………………………. 13 Conjuntos……………………………………………………………………. 14 Listas por comprensión………………………………………………........... 15 Funciones……………………………………………………………………. 15 Clases…………………………………………………………………............ 15 Condicionales………………………………………………………………… 17 Bucle for………………………………………………………………........... 18 Bucle White………………………………………………………………….. 18 Módulos………………………………………………………………............ 19 Sistemas de objetos……………………………………………………........... 19 Biblioteca estándar……………………………………………………........... 19

RUBY

Información general………………………………………………………… 20 Historia………………………………………………………………………. 21 Objetivo……………………………………………………………………… 22 Semántica…………………………………………………………………….. 23 Características………………………………………………………….......... 24 Interacción………………………………………………………………….... 25 Sintaxis……………………………………………………………………….. 25 Licencia………………………………………………………………………. 26 BIBLIOGRAFIA……………………………………………………………….. 27

2

RESUMEN

En este informe trataremos de lo que se tratan dos importanteslenguajes de programación: Python y Ruby. Antes de todo responderemos a la pregunta: ¿Qué es un lenguaje de programación? Bueno, la respuesta es simple, aunque el procesoes algo complicado, y es que un lenguaje de programación es unidioma artificial que nos ayuda a expresar procesos, crear programas, expresar logaritmos y realizar muchas otras funciones lógicas utilizando ciertas reglas y uno que otro elemento.

Ahora bien. Procederemos a presentar una breve presentación delo que vienen a ser estos dos lenguajes de programación.

Phyton: Python es un lenguaje de programación de alto nivel cuya filosofía hace hincapié en una sintaxis muy limpia y que favorezca un código legible. Se trata de un lenguaje de programación multiparadigma ya que soporta orientación a objetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, usa tipado dinámico, es fuertemente tipado y es multiplataforma.

●Python es un lenguaje muy expresivo: Los programas Python sonmuy compactos; un programa Python suele ser bastante más cortoque su equivalente en lenguajes como C.

●Python es muy legible: La sintaxis de Python es muy elegante y permite la escritura de programas cuya lectura resulta muy fácil.

●Python ofrece un entorno interactivo que facilita la realización de pruebas.

●El entorno de ejecución de Python detecta muchos de los errores de programación que escapan al control de los

3

compiladores y proporciona información muy rica para detectarlos y corregirlos.

●Python puede usarse como lenguaje imperativo procedimental o como lenguaje orientado a objetos.

●Posee un rico juego de estructuras de datos que se pueden manipular de modo sencillo.

Ruby: Ruby, el lenguaje de programación reflexivo orientado a objetos, se fundamenta en una combinación de sintaxis inspirada en Python, Pero con características de programación orientada a objetos similares a Smalltalk. Además, comparte funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. Ruby nos permite ahorrar tiempo y ser más productivos que con otros lenguajes de programación, porque pasamos más tiempo haciendo que el ordenador haga lo que queremos y menos luchando con el lenguaje.

Python

Información general

Desarrollador(es) : Python Software Foundation

http:/ / www. python. org/ ''

Extensiones comunes :.py, .pyc, .pyd, .pyo, .pyw

4

Paradigma : multiparadigma: orientado a objetos,

imperativo, funcional, reflexivo

Apareció en : 1991

Diseñado por : Guido van Rossum

Última versión estable : 3.3.0 / 2.7.3 (29 de septiembre de 2012 / 11

De abril de 2012)

Última versión en pruebas : 3.3.0rc3 (24 de septiembre de 2012)

Tipo de dato : fuertemente tipado, dinámico

Implementaciones : CPython, IronPython, Jython, Python for S60,

5

PyPy, Unladen Swallow

Dialectos : Stackless Python, RPython

Influido por : ABC, ALGOL 68, C, Haskell, Icon, Lisp, Modula-

3, Perl, Smalltalk, Java

Ha influido a : Boo, Cobra, D, Falcon, Genie, Groovy, Ruby,

JavaScript, Cython

Sistema operativo : Multiplataforma

Se trata de un lenguaje de programación multiparadigma ya quesoporta orientación a objetos, programación imperativa y, enmenor medida, programación funcional. Es un lenguajeinterpretado, usa tipado dinámico, es fuertemente tipado ymultiplataforma

Es administrado por la Python software foundation. Posee unalicencia de código abierto, denominada Python softwarefoundation lisence que es compatible con la Licencia publicageneral de GNU a partir de la versión 2.1.1, e incompatible enciertas versiones anteriores.

Python funciona en Windows, Linux / Unix, Mac OS X, y ha sido portado a Java y lamáquina virtual. NET.

6

Historia

Python fue creado a finales de los ochenta por Guido vanRossum en el Centro para las Matemáticas y la Informática(CWI, Centrum Wiskunde & Informática), en los Países bajos,como un sucesor del lenguaje de programación ABC, capaz demanejar excepciones e interactuar con el sistema operativoAmoeba.

El nombre del lenguaje proviene de la afición de su creadororiginal, Guido van Rossum, por los humoristas británicosMonte python.

Van Rossum es el principal autor de Python, y su continuo rolcentral en decidir la dirección de Python es reconocido,refiriéndose a él como Benevolente dictador vitalicio (eninglés: Benevolent Dictator for Life, BDFL).

En 1991, van Rossum publicó el código de la versión 0.9.0 enalt.sources. En esta etapa del desarrollo ya estaban presentesclases con herencia, manejo de excepciones, funciones y lostipos modulares, como: str, list, dict, entre otros. Además eneste lanzamiento inicial aparecía un sistema de módulosadoptado de Modula-3; van Rossum describe el módulo como “unade las mayores unidades de programación de Python”. El modelode excepciones en Python es parecido al de Modula-3, con laadición de una cláusula else. En el año 1994 se formoComp.lang.python, el foro de discusión principal de Python,marcando un hito en el crecimiento del grupo de usuarios deeste lenguaje.

Python alcanzó la versión 1.0 en enero de 1994. Unacaracterística de este lanzamiento fueron las herramientas dela programación funcional: lambda, reduce, filter y map. VanRossum explicó que “hace 12 años, Python adquirió lambda,reduce (), filter () y map (), cortesía de un hacker de Lispque las extrañaba y que envió parches”. El donante fue AmritPrem; no se hace ninguna mención específica de cualquierherencia de Lisp en las notas de lanzamiento.

7

La última versión liberada proveniente de CWI fue Python 1.2.En 1995, van Rossum continuó su trabajo en Python en laCorporation for national research initiatives (CNRI) enReston, Virginia, donde lanzó varias versiones del software.

Durante su estancia en CNRI, van Rossum lanzó la iniciativaComputer Programming for Everybody (CP4E), con el fin de hacer laprogramación más accesible a más gente, con un nivel de'alfabetización' básico en lenguajes de programación, similara la alfabetización básica en inglés y habilidades matemáticasnecesarias por muchos trabajadores. Python tuvo un papelcrucial en este proceso: debido a su orientación hacia unasintaxis limpia, ya era idóneo, y las metas de CP4Epresentaban similitudes con su predecesor, ABC. El proyectofue patrocinado por Darpa. En el año 2007, el proyecto CP4Eestá inactivo, y mientras Python intenta ser fácil de aprendery no muy arcano en su sintaxis y semántica, alcanzando a losno-programadores, no es una preocupación activa.

En el año 2000, el equipo principal de desarrolladores dePython se cambió a BeOpen.com para formar el equipo BeOpenPhyponlabs. CNRI pidió que la versión 1.6 fuera pública,continuando su desarrollo hasta que el equipo de desarrolloabandonó CNRI; su programa de lanzamiento y el de la versión2.0 tenían una significativa cantidad de traslapo. Python 2.0

8

fue el primer y único lanzamiento de BeOpen.com. Después quePython 2.0 fuera publicado por BeOpen.com, Guido van Rossum ylos otros desarrolladores de PythonLabs se unieron en Digitalcreations.

Python 2.0 tomó una característica mayor del lenguaje deProgramación funcional Haskel: listas por comprensión. Lasintaxis de Python para esta construcción es muy similar a lade Haskell, salvo por la preferencia de los caracteres depuntuación en Haskell, y la preferencia de Python por palabrasclaves alfabéticas. Python 2.0 introdujo además un sistema derecolección de basura capaz de recolectar referenciascíclicas.

Posterior a este doble lanzamiento, y después que van Rossumdejó CNRI para trabajar con desarrolladores de softwarecomercial, quedó claro que la opción de usar Python consoftware disponible bajo GNU GLP era muy deseable. La licenciausada entonces, la Phyton license, incluía una cláusulaestipulando que la licencia estaba gobernada por el estado deVirginia, por lo que, bajo la óptica de los abogados de freesoftware foundation (FSF), se hacía incompatible con GPL. CNRIy FSF se relacionaron para cambiar la licencia de softwarelibre de Python para hacerla compatible con GPL. En el año2001, van Rossum fue premiado con FSF Award for theadvancement of free software.

Python 1.6.1 es esencialmente el mismo que Python 1.6, conunos pocos arreglos de bugs, y con una nueva licenciacompatible con GPL.

9

Código Python con coloreado de sintaxis.Python 2.1 fue un trabajo derivado de Python 1.6.1, así comotambién de Python 2.0. Su licencia fue renombrada a: Phytonsoftware foundation license. Todo el código, documentación yespecificaciones añadidas, desde la fecha del lanzamiento dela versión alfa de Python 2.1, tiene como dueño a Phytonsoftware foundation (PSF), una organización sin ánimo delucro fundada en el año 2001, tomando como modelo la Apachesoftware foundation .1 Incluido en este lanzamiento fue unaimplementación del scoping más parecida a las reglas destatic scoping (del cual scheme es el originador).

Una innovación mayor en Python 2.2 fue la unificación de lostipos en Python (tipos escritos en C), y clases (tiposescritos en Python) dentro de una jerarquía. Esa unificaciónlogró un modelo de objetos de Python puro y consistente.También fueron agregados los generadores que fueron inspiradospor el lenguaje Icon.

Las adiciones a la biblioteca estándar de Python y lasdecisiones sintácticas fueron influenciadas fuertemente porjava en algunos casos: el package logging, introducido en laversión 2.3, está basado en log4j; el parser sax, introducidoen 2.0; el package threading, cuya clase Thread expone unsubconjunto de la interfaz de la clase homónima en Java.

10

Características y paradigmas

Python es un lenguaje de programación multiparadigma. Estosignifica que más que forzar a los programadores a adoptar unestilo particular de programación, permite varios estilos:programación orientada a objetos, programación imperativa yprogramación funcional. Otros paradigmas están soportadosmediante el uso de extensiones.

Python usa tipado dinámico y conteo de referencias para laadministración de memoria.

Una característica importante de Python es la resolucióndinámica de nombres; es decir, lo que enlaza un método y unnombre de variable durante la ejecución del programa (tambiénllamado ligadura dinámica de métodos).

Otro objetivo del diseño del lenguaje es la facilidad deextensión. Se pueden escribir nuevos módulos fácilmente en C oC++. Python puede incluirse en aplicaciones que necesitan unainterfaz programable.

Aunque la programación en Python podría considerarse enalgunas situaciones hostiles a la programación funcionaltradicional del Lisp, existen bastantes analogías entre Pythony los lenguajes minimalistas de la familia Lisp como puede serscheme.

Modo interactivo

El intérprete de Python estándar incluye un modo interactivoen el cual se escriben las instrucciones en una especie deintérprete de comandos: las expresiones pueden ser introducidasuna a una, pudiendo verse el resultado de su evaluacióninmediatamente, lo que da la posibilidad de probar porcionesde código en el modo interactivo antes de integrarlo como

11

parte de un programa. Esto resulta útil tanto para laspersonas que se están familiarizando con el lenguaje como paralos programadores más avanzados.

Existen otros programas, tales como Idle, b python o I pythonque añaden funcionalidades extra al modo interactivo, como elautocompletado de código y el coloreado de la sintaxis del lenguaje.

Ejemplo del modo interactivo:

>>> 1 + 12>>> a = range(10)>>> print a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Elementos del lenguaje

Python fue diseñado para ser leído con facilidad. Una de suscaracterísticas es el uso de palabras donde otros lenguajesutilizarían símbolos. Por ejemplo, los operadores lógicos !, || y && en Python se escriben not, or y and,respectivamente. El contenido de los bloques de código(bucles, funciones, clases, etc.) es delimitado medianteespacios o tabuladores, conocidos como indentasion, antes decada línea de órdenes pertenecientes al bloque. Python sediferencia así de otros lenguajes de programación quemantienen como costumbre declarar los bloques mediante unconjunto de caracteres, normalmente entre llaves {}. Se puedenutilizar tanto espacios como tabuladores para identar elcódigo, pero se recomienda no mezclarlos.Función factorial en C(indentación opcional)

Función factorial en Python(indentación obligatoria)

int factorial(int x) { if (x == 0)

def factorial(x): if x == 0:

12

return 1; else return x * factorial(x- 1);}

return 1 else: return x * factorial(x- 1)

Debido al significado sintáctico de la indentación, unainstrucción debe estar contenida en línea. No obstante, si porlegibilidad se quiere dividir la instrucción en varias líneas,añadiendo una barra invertida \ al final de una línea, seindica que la instrucción continúa en la siguiente .Estasinstrucciones son equivalentes:

lista=['valor 1','valor2','valor 3'] cadena='Esto es una cadenabastante larga'

lista=['valor 1','valor 2' \ ,'valor 3'] cadena='Esto es una cadena' \ 'bastante larga'

Comentarios

Los comentarios se inician con el símbolo #, y se extiendenhasta el final de la línea. El intérprete no tiene en cuentalos comentarios, lo cual es útil si deseamos poner informaciónadicional en nuestro código como, por ejemplo, una explicaciónsobre el comportamiento de una sección del programa.

# Comentario en una línea en Pythonprint "Hola mundo" # También es posible añadir un comentarioal final de una línea de código

Variables

Las variables se definen de forma dinámica, lo que significa queno se tiene que especificar cuál es su tipo de antemano ypuede tomar distintos valores en otro momento. Se usa elsímbolo = para asignar valores.

x = 1x = "texto" # Esto es posible porque los tipos son asignadosdinámicamente

13

Tipos de datos

Los tipos de datos se pueden resumir en esta tabla:

Tipo Clase Notas Ejemplo

str Cadena Inmutable 'Cadena'

unicode Cadena Versión Unicode de str u'Cadena'

list Secuencia Mutable, puede contenerobjetos de diversos tipos

[4.0, 'Cadena',True]

tuple Secuencia Inmutable, puede contenerobjetos de diversos tipos

(4.0, 'Cadena',True)

set Conjunto Mutable, sin orden, nocontiene duplicados

set([4.0, 'Cadena',True])

frozenset Conjunto Inmutable, sin orden, no

contiene duplicadosfrozenset([4.0,'Cadena', True])

dict Mapping Grupo de paresclave:valor

{'key1': 1.0,'key2': False}

int Númeroentero

Precisión fija,convertido en long en casode overflow.

42

long Númeroentero Precisión arbitraria 42L ó

456966786151987643L

float Númerodecimal

Coma flotante de dobleprecisión 3.1415927

bool Booleano Valor booleano verdaderoo falso True o False

Mutable: si su contenido (o dicho valor) puede cambiarseen tiempo de ejecución.

Inmutable: si su contenido (o dicho valor) no puedecambiarse en tiempo de ejecución.

14

Listas y Tuplas

Para declarar una lista se usan los corchetes [], encambio, para declarar una tupla se usan los paréntesis ().En ambas los elementos se separan por comas, y en el casode las tuplas es necesario que tengan como mínimo una coma.

Tanto las listas como las tuplas pueden contener elementos dediferentes tipos. No obstante las listas suelen usarse paraelementos del mismo tipo en cantidad variable mientrasque las tuplas se reservan para elementos distintos encantidad fija.

Para acceder a los elementos de una lista o tupla se utilizaun índice entero (empezando por "0", no por "1"). Sepueden utilizar índices negativos para acceder elementosa partir del final.

Las listas se caracterizan por ser mutables, es decir, se puedecambiar su contenido en tiempo de ejecución, mientras que lastuplas son inmutables ya que no es posible modificar elcontenido una vez creada.

Listas>>> lista = ["abc", 42, 3.1415]>>> lista[0] # Acceder a un elemento por su índice'abc'>>> lista[-1] # Acceder a un elemento usando un índicenegativo3.1415>>> lista.append(True) # Añadir un elemento al final de lalista>>> lista['abc', 42, 3.1415, True]>>> del lista[3] # Borra un elemento de la lista usando uníndice (en este caso: True)>>> lista[0] = "xyz" # Re-asignar el valor del primer elementode la lista>>> lista[0:2] # Mostrar los elementos de la lista del índice"0" al "2" (sin incluir este último)['xyz', 42]>>> lista_anidada = [lista, [True, 42L]] # Es posible anidarlistas

15

>>> lista_anidada[['xyz', 42, 3.1415], [True, 42L]]>>> lista_anidada[1][0] # Acceder a un elemento de una listadentro de otra lista (del segundo elemento, mostrar el primerelemento)TrueTuplas

>>> tupla = ("abc", 42, 3.1415)>>> tupla[0] # Acceder a un elemento por su índice'abc'>>> del tupla[0] # No es posible borrar (ni añadir) unelemento en una tupla, lo que provocará una excepción( Excepción )>>> tupla[0] = "xyz" # Tampoco es posible re-asignar el valorde un elemento en una tupla, lo que también provocará unaexcepción

( Excepción )>>> tupla[0:2] # Mostrar los elementos de la tupla del índice"0" al "2" (sin incluir este último)('abc', 42)>>> tupla_anidada = (tupla, (True, 3.1415)) # También esposible anidar tuplas>>> 1, 2, 3, "abc" # Esto también es una tupla, aunque esrecomendable ponerla entre paréntesis (recuerda que requiere,al menos, una coma)(1, 2, 3, 'abc')>>> (1) # Aunque entre paréntesis, esto no es una tupla, yaque no posee al menos una coma, por lo que únicamenteaparecerá el valor1>>> (1,) # En cambio, en este otro caso, sí es una tupla(1,)>>> (1, 2) # Con más de un elemento no es necesaria la comafinal(1, 2)>>> (1, 2,) # Aunque agregarla no modifica el resultado(1, 2)

16

Diccionarios

Para declarar un diccionario se usan las llaves {}.Contienen elementos separados por comas, donde cadaelemento está formado por un par clave:valor (elsímbolo : separa la clave de su valor correspondiente).

Los diccionarios son mutables, es decir, se puede cambiar elcontenido de un valor en tiempo de ejecución.

En cambio, las claves de un diccionario deben serinmutables. Esto quiere decir, por ejemplo, que nopodremos usar ni listas ni diccionarios como claves.

El valor asociado a una clave puede ser de cualquier tipode dato, incluso un diccionario.

>>> diccionario = {"cadena": "abc", "numero": 42, "lista":[True, 42L]} # Diccionario que tiene diferentes valores porcada clave, incluso una lista>>> diccionario["cadena"] # Usando una clave, se accede a suvalor'abc'>>> diccionario["lista"][0] # Acceder a un elemento de unalista dentro de un valor (del valor de la clave "lista",mostrar el primer elemento)True>>> diccionario["cadena"] = "xyz" # Re-asignar el valor de unaclave>>> diccionario["cadena"]'xyz'>>> diccionario["decimal"] = 3.1415927 # Insertar un nuevoelemento clave:valor>>> diccionario["decimal"]3.1415927>>> diccionario_mixto = {"tupla": (True, 3.1415),"diccionario": diccionario} # También es posible que un valorsea un diccionario>>> diccionario_mixto["diccionario"]["lista"][1] # Acceder aun elemento dentro de una lista, que se encuentra dentro de undiccionario42L>>> diccionario = {("abc",): 42} # Sí es posible que una clavesea una tupla, pues es inmutable

17

>>> diccionario = {["abc"]: 42} # No es posible que una clavesea una lista, pues es mutable, lo que provocará una excepción( Excepción )

Conjuntos

Los conjuntos se construyen mediante set(items) donde itemses cualquier objeto iterable, como listas o tuplas. Los conjuntosno mantienen el orden ni contienen elementos duplicados.

Se suelen utilizar para eliminar duplicados de unasecuencia, o para operaciones matemáticas comointersección, unión, diferencia y diferencia simétrica.

>>> conjunto_inmutable = frozenset(["a", "b", "a"]) # Seutiliza una lista como objeto iterable>>> conjunto_inmutablefrozenset(['a', 'b'])>>> conjunto1 = set(["a", "b", "a"]) # Primer conjunto mutable>>> conjunto1set(['a', 'b'])>>> conjunto2 = set(["a", "b", "c", "d"]) # Segundo conjuntomutable>>> conjunto2set(['a', 'c', 'b', 'd']) # Recuerda, no mantienen el orden,como los diccionarios>>> conjunto1 & conjunto2 # Intersecciónset(['a', 'b'])>>> conjunto1 | conjunto2 # Uniónset(['a', 'c', 'b', 'd'])>>> conjunto1 - conjunto2 # Diferencia (1)set([])>>> conjunto2 - conjunto1 # Diferencia (2)set(['c', 'd'])>>> conjunto1 ^ conjunto2 # Diferencia simétricaset(['c', 'd'])

18

Listas por comprensión

Una lista por comprensión (en inglés: list comprehension) es unaexpresión compacta para definir listas. Al igual que lambda,aparece en lenguajes funcionales. Ejemplos:

>>> range(5) # La función "range" devuelve una lista,empezando en 0 y terminando con el número indicado menos uno[0, 1, 2, 3, 4]>>> [i*i for i in range(5)] # Por cada elemento del rango, lomultiplica por sí mismo y lo agrega al resultado[0, 1, 4, 9, 16]>>> lista = [(i, i + 2) for i in range(5)]>>> lista[(0, 2), (1, 3), (2, 4), (3, 5), (4, 6)]

Funciones

Las funciones se definen con la palabra clave def, seguidadel nombre de la función y sus parámetros. Otra forma deescribir funciones, aunque menos utilizada, es con lapalabra clave lambda (que aparece en lenguajesfuncionales como Lisp).

El valor devuelto en las funciones con def será el dado conla instrucción return.

def:

>>> def suma(x, y = 2):... return x + y # Retornar la suma del valor de lavariable "x" y el valor de "y"...>>> suma(4) # La variable "y" no se modifica, siendo su valor:26>>> suma(4, 10) # La variable "y" sí se modifica, siendo sunuevo valor: 10 14

lambda:

>>> suma = lambda x, y = 2: x + y19

>>> suma(4) # La variable "y" no se modifica, siendo su valor:26>>> suma(4, 10) # La variable "y" sí se modifica, siendo sunuevo valor: 10 14

Clases

Las clases se definen con la palabra clave class, seguidadel nombre de la clase y, si hereda de otra clase, elnombre de esta.

En Python 2.x es recomendable que una clase herede de"object", en Python 3.x esto ya no hará falta.

En una clase un "método" equivale a una "función", y una"propiedad" equivale a una "variable".22

"__init__" es un método especial que se ejecuta alinstanciar la clase, se usa generalmente para inicializarpropiedades y ejecutar métodos necesarios. Al igual quetodos los métodos en Python, debe tener al menos unparámetro, generalmente se utiliza self. El resto deparámetros serán los que se indiquen al instanciar laclase.

Las propiedades que se desee que sean accesibles desdefuera de la clase se deben declarar usando self. delantedel nombre.

De forma parecida a otros lenguajes donde existenrestricciones de acceso a una propiedad o método, publicy private, en Python, para que una propiedad o método seaprivado se utiliza una23 barra baja _ antes del nombre dela variable, y después de self..

>>> class Persona(object):... def __init__(self, nombre, edad):... self.nombre = nombre # Esta variable seráaccesible desde fuera del objeto y desde los métodos delpropio objeto... self.__edad = edad # Esta variable es privada, porlo que únicamente será accesible por los métodos del propioobjeto

20

... def mostrar_edad(self): # Es necesario que, al menos,tenga un parámetro, generalmente: "self"... print self.__edad # Como vemos, la variableprivada sí es accesible desde el propio objeto... def modificar_edad(self, edad): # Ya que "self.__edad"no es accesible desde fuera del objeto, hagamos que se puedamodificar de forma controlada... if edad < 0 or edad > 150: # Se comprueba que laedad no sea menor de 0 (algo imposible), ni mayor de 150 (algorealmente difícil)... return False... else: # Si está en el rango 0-150, entonces semodifica la variable, pero sigue sin ser accesible desde fueradel objeto... self.__edad = edad # Como vemos, la variableprivada sí es accesible desde el propio objeto, al igual queen el método "mostrar_edad"...>>> p = Persona("Alicia", 20) # Instanciamos la clase, como sepuede ver, no se especifica el valor de "self">>> p.nombre # La variable "nombre" del objeto sí es accesibledesde fuera'Alicia'>>> p.nombre = "Andrea" # Y por tanto, se puede cambiar sucontenido>>> p.nombre'Andrea'>>> print p.__edad # Pero la variable "__edad" no, al serprivada, lo que provocará una excepción( Excepción )>>> p.mostrar_edad() # Podemos llamar a un método de la clase20>>> p.modificar_edad(21) # Y podemos cambiar la edad usando elmétodo específico que hemos hecho para hacerlo de formacontrolada>>> p.mostrar_edad()21

21

Condicionales

Una sentencia condicional (if) ejecuta su bloque de códigointerno sólo si se cumple cierta condición. Se define usandola palabra clave if seguida de la condición, y el bloque decódigo. Condiciones adicionales, si las hay, se introducenusando elif seguida de la condición y su bloque de código.Todas las condiciones se evalúan secuencialmente hastaencontrar la primera que sea verdadera, y su bloque de códigoasociado es el único que se ejecuta. Opcionalmente, puedehaber un bloque final (la palabra clave else seguida de unbloque de código) que se ejecuta sólo cuando todas lascondiciones fueron falsas.

>>> verdadero = True>>> if verdadero: # No es necesario poner "verdadero == True"... print "Verdadero"... else:... print "Falso"...Verdadero>>> lenguaje = "Python">>> if lenguaje == "C": # lenguaje no es "C", por lo que estebloque se obviará y evaluará la siguiente condición... print "Lenguaje de programación: C"... elif lenguaje == "Python": # Se pueden añadir tantosbloques "elif" como se quiera... print "Lenguaje de programación: Python"... else: # En caso de que ninguna de las anteriorescondiciones fuera cierta, se ejecutaría este bloque... print "Lenguaje de programación: indefinido"...Lenguaje de programación: Python>>> if verdadero and lenguaje == "Python": # Uso de "and" paracomprobar que ambas condiciones son verdaderas... print "Verdadero y Lenguaje de programación: Python"...Verdadero y Lenguaje de programación: Python

22

Bucle for

El bucle for es similar a foreach en otros lenguajes. Recorreun objeto iterable, como una lista, una tupla o un generador, ypor cada elemento del iterable ejecuta el bloque de códigointerno. Se define con la palabra clave for seguida de unnombre de variable, seguido de in, seguido del iterable, yfinalmente el bloque de código interno. En cada iteración, elelemento siguiente del iterable se asigna al nombre devariable especificado:

>>> lista = ["a", "b", "c"]>>> for i in lista: # Iteramos sobre una lista, que esiterable... print...abc>>> cadena = "abcdef">>> for i in cadena: # Iteramos sobre una cadena, que tambiénes iterable... print i, # Añadiendo una coma al final hacemos que nointroduzca un salto de línea, sino un espacio...a b c d e f

Bucle while

El bucle while evalúa una condición y, si es verdadera,ejecuta el bloque de código interno. Continúa evaluando yejecutando mientras la condición sea verdadera. Se define conla palabra clave while seguida de la condición, y acontinuación el bloque de código interno:

>>> numero = 0

>>> while numero < 10:

... numero += 1

... print numero,

23

...1 2 3 4 5 6 7 8 9 10r

Módulos

Existen muchas propiedades que se pueden agregar al lenguajeimportando módulos, que son "minicódigos" (la mayoría escritostambién en Python) que proveen de ciertas funciones y clasespara realizar determinadas tareas. Un ejemplo es el móduloTkinter, que permite crear interfaces gráficas basadas en labiblioteca Tk. Otro ejemplo es el módulo os, que provee accesoa muchas funciones del sistema operativo. Los módulos seagregan a los códigos escribiendo import seguida del nombredel módulo que queramos usar.

>>> import os # Módulo que provee funciones del sistemaoperativo>>> os.name # Devuelve el nombre del sistema operativo'posix'>>> os.mkdir("/tmp/ejemplo") # Crea un directorio en la rutaespecificada>>> import time # Módulo para trabajar con fechas y horas>>> time.strftime("%Y-%m-%d %H:%M:%S") # Dándole un ciertoformato, devuelve la fecha y/o hora actual'2010-08-10 18:01:17'

Sistema de objetos

24

En Python todo es un objeto (incluso las clases). Las clases,al ser objetos, son instancias de una metaclase. Python ademássoporta herencia múltiple y polimorfismo.>>> cadena = "abc" # Una cadena es un objeto de "str">>> cadena.upper() # Al ser un objeto, posee sus propiosmétodos'ABC'>>> lista = [True, 3.1415] # Una lista es un objeto de "list">>> lista.append(42L) # Una lista también (al igual que todo)es un objeto, y también posee sus propios métodos>>> lista[True, 3.1415, 42L]

Biblioteca estándarPython tiene una gran biblioteca estándar, usada para unadiversidad de tareas. Esto viene de la filosofía "pilasincluidas" ("batteries included") en referencia a los módulosde Python. Los módulos de la biblioteca estándar puedenmejorarse por módulos personalizados escritos tanto en C comoen Python. Debido a la gran variedad de herramientas incluidasen la biblioteca estándar, combinada con la habilidad de usarlenguajes de bajo nivel como C y C++, los cuales son capacesde interactuar con otras bibliotecas, Python es un lenguajeque combina su clara sintaxis con el inmenso poder delenguajes menos elegantes

Ruby

25

Información general

Desarrollador(es) : Comunidad de desarrolladores deRuby http://www.ruby-lang.org/

Extensiones comunes : .rb, .rbw

Paradigma : Multiparadigma: orientado a objetos,reflexivo

Apareció : En 1995

Diseñado : Por Yukihiro Matsumoto

Última versión estable : 1.9.3 [1] (31 de octubre de2011)

Tipo de dato : Fuertemente tipado, dinámico

Implementaciones : Ruby MRI [2], YARV [3], JRuby,Rubinius, IronRuby [4],

MacRuby[5], HotRuby [6]

Influido por : Perl, Smalltalk, Python, Lisp,Eiffel, Scheme, Ada,

Dylan, CLU

Ha influido a : Groovy, Falcon

Sistema operativo : Multiplataforma

26

Historia

El lenguaje fue creado por Yukihiro "Matz" Matsumoto, quienempezó a trabajar en Ruby el 24 de febrero de 1993, y lopresentó al público en el año 1995. En el círculo de amigos deMatsumoto se le puso el nombre de "Ruby" (en español rubí) comobroma aludiendo al lenguaje de programación "Perl" (perla).Yukihiro “matz” Matsumoto, mezcló partes de sus lenguajesfavoritos (Perl, Smalltalk, Eiffel, Ada, y Lisp) para formarun nuevo lenguaje que incorporara tanto la programaciónfuncional como la programación imperativa. A menudo hamanifestado que está “tratando de hacer que Ruby sea natural,no simple”, de una forma que se asemeje a la vida real.Continuando sobre esto, agrega: Ruby es simple en apariencia,pero complejo por dentro, como el cuerpo humano.

La última versión estable de la rama 1.8 es la 1.8.7_p248, dela rama 1.9 es la 1.9.2_p180. La versión en 1.9 que incorporamejoras sustanciales en el rendimiento del lenguaje, que seespera queden reflejadas en la próxima versión estable deproducción del lenguaje, Ruby 1.9.0.1 Diferencias enrendimiento entre la actual implementación de Ruby (1.8.6) yotros lenguajes de programación más arraigados han llevado aldesarrollo de varias máquinas virtuales para Ruby. Entre ésasse encuentra JRuby, un intento de llevar Ruby a la plataformaJava, y Rubinius, un intérprete modelado basado en lasmáquinas virtuales de Smalltalk. Los principalesdesarrolladores han apoyado la máquina virtual proporcionadapor el proyecto YARV, que se fusionó en el árbol de códigofuente de Ruby el 31 de diciembre de 2006, y se dió a conocercomo Ruby 1.9

27

Objetivo

El creador del lenguaje, Yukihiro "Matz" Matsumoto, ha dichoque Ruby está diseñado para la productividad y la diversióndel desarrollador, siguiendo los principios de una buenainterfaz de usuario. Sostiene que el diseño de sistemasnecesita enfatizar las necesidades humanas más que las de lamáquina:

A menudo la gente, especialmente los ingenieros en computación, se centran en lasmáquinas. Ellos piensan, "Haciendo esto, la máquina funcionará más rápido.Haciendo esto, la máquina funcionará de manera más eficiente. Haciendo esto..."Están centrados en las máquinas, pero en realidad necesitamos centrarnos en laspersonas, en cómo hacen programas o cómo manejan las aplicaciones en losordenadores. Nosotros somos los jefes. Ellos son los esclavos.

Ruby sigue el "principio de la menor sorpresa", lo quesignifica que el lenguaje debe comportarse de tal manera queminimice la confusión de los usuarios experimentados. Matz hadicho que su principal objetivo era hacer un lenguaje que ledivirtiera a él mismo, minimizando el trabajo de programacióny la posible confusión. Él ha dicho que no ha aplicado elprincipio de menor sorpresa al diseño de Ruby, pero sinembargo la frase se ha asociado al lenguaje de programaciónRuby. La frase en sí misma ha sido fuente de controversia, yaque los no iniciados pueden tomarla como que las

28

características de Ruby intentan ser similares a lascaracterísticas de otros lenguajes conocidos. En mayo de 2005en una discusión en el grupo de noticias comp.lang.ruby, Matztrató de distanciar Ruby de la mencionada filosofía,explicando que cualquier elección de diseño será sorprendentepara alguien, y que él usa un estándar personal de evaluaciónde la sorpresa. Si ese estándar personal se mantieneconsistente habrá pocas sorpresas para aquellos familiarizadoscon el estándar. Matz lo definió de esta manera en unaentrevista: Todo el mundo tiene un pasado personal. Alguienpuede venir de Python, otro de Perl, y pueden versesorprendidos por distintos aspectos del lenguaje. Entoncespodrían decir 'Estoy sorprendido por esta característica dellenguaje, así que Ruby viola el principio de la menorsorpresa.' Espera, espera. El principio de la menor sorpresano es sólo para ti. El principio de la menor sorpresasignifica el principio de 'mi' menor sorpresa. Y significa elprincipio de la menor sorpresa después de que aprendes bienRuby. Por ejemplo, fui programador de C++ antes de empezar adiseñar Ruby. Programé exclusivamente en C++ durante dos otres años. Y después de dos años de programar en C++, todavíame sorprendía.

Semántica

29

Ruby es orientado a objetos: todos los tipos de datos son unobjeto, incluidas las clases y tipos que otros lenguajesdefinen como primitivas, (como enteros, booleanos, y "nil").Toda función es un método. Las variables siempre sonreferencias a objetos, no los objetos mismos. Ruby soportaherencia con enlace dinámico, mixins y métodos singleton(pertenecientes y definidos por una sola instancia más quedefinidos por la clase). A pesar de que Ruby no soportaherencia múltiple, las clases pueden importar módulos comomixins. La sintaxis procedural está soportada, pero todos losmétodos definidos fuera del ámbito de un objeto son realmentemétodos de la clase Object. Como esta clase es padre de todaslas demás, los cambios son visibles para todas las clases yobjetos. Ruby ha sido descrito como un lenguaje deprogramación multiparadigma: permite programación procedural(definiendo funciones y variables fuera de las claseshaciéndolas parte del objeto raíz Object), con orientación aobjetos, (todo es un objeto) o funcionalmente (tiene funcionesanónimas, clausuras o closures, y continuations; todaslassentencias tiene valores, y las funciones devuelven la últimaevaluación). Soporta introspección, reflexión ymetaprogramación, además de soporte para hilos de ejecucióngestionados por el intérprete. Ruby tiene tipado dinámico, ysoporta polimorfismo de tipos (permite tratar a subclasesutilizando la interfaz de la clase padre). Ruby no requiere depolimorfismo de funciones al no ser fuertemente tipado (losparámetros pasados a un método pueden ser de distinta clase encada llamada a dicho método). De acuerdo con las preguntasfrecuentes de Ruby, "Si te gusta Perl, te gustará Ruby y susintaxis. Si te gusta Smalltalk, te gustará Ruby y susemántica. Si te gusta Python, la enorme diferencia de diseñoentre Python y Ruby/Perl puede que te convenza o puede queno."

30

Características

• Orientado a objetos

• Cuatro niveles de ámbito de variable: global, clase,instancia y local.

• Iteradores y clausuras o closures (pasando bloques decódigo)

• Expresiones regulares nativas similares a las de Perla nivel del lenguaje

• Posibilidad de redefinir los operadores (sobrecarga deoperadores)

• Recolección de basura automática.

• Carga dinámica de DLL/bibliotecas compartidas en lamayoría de las plataformas

• Introspección, reflexión y metaprogramación

• Amplia librería estándar

• Soporta inyección de dependencias

• Soporta alteración de objetos en tiempo de ejecución

• Continuaciones y generadores

Manejo de excepciones, como Java y Python, para facilitarel manejo de errores.

Escribir extensiones en C para Ruby es más fácil quehacer lo mismo para Perl o Python, con una API muyelegante para utilizar Ruby desde C. Esto incluyellamadas para embeber Ruby en otros programas, y así

31

usarlo como lenguaje de scripting. También estádisponible una interfaz SWIG.

Tiene manejo de hilos (threading) independiente delsistema operativo. De esta forma, tienes soporte multi-hilo en todas las plataformas en las que corre Ruby, sinimportar si el sistema operativo lo soporta o no,¡incluso en MS-DOS!

Ruby es fácilmente portable: se desarrollamayoritariamente en GNU/Linux, pero corre en varios tiposde UNIX, Mac OS X, Windows 95/98/Me/NT/2000/XP, DOS,BeOS, OS/2, etc.

Ruby actualmente no tiene soporte completo de Unicode, a pesarde tener soporte parcial para UTF-8.

Interacción

La distribución oficial de Ruby incluye "irb" (InteractiveRuby Shell), un intérprete interactivo de línea de comandosque puede ser usado para probar código de manera rápida. Elsiguiente fragmento de código representa una muestra de unasesión usando irb:

Sintaxis

32

La sintaxis de Ruby es similar a la de Perl o Python. Ladefinición de clases y métodos está definida por palabrasclave. Sin embargo, en Perl, las variables no llevan prefijos.Cuando se usa, un prefijo indica el ámbito de las variables.La mayor diferencia con C y Perl es que las palabras clave sonusadas para definir bloques de código sin llaves. Los saltosde línea son significativos y son interpretados como el finalde una sentencia; el punto y coma tiene el mismo uso. De formadiferente que Python, la indentación no es significativa. Unade las diferencias entre Ruby y Python y Perl es que Rubymantiene todas sus variables de instancia privadas dentro delas clases y solo la expone a través de métodos de acceso(attr_writer, attr_reader, etc.). A diferencia de los métodos"getter" y "setter" de otros lenguajes como C++ o Java, losmétodos de acceso en Ruby pueden ser escritos con una solalínea de código. Como la invocación de estos métodos norequiere el uso de paréntesis, es trivial cambiar una variablede instancia en una función sin tocar una sola línea de códigoo refactorizar dicho código. Los descriptores de propiedadesde Python son similares pero tienen una desventaja en elproceso de desarrollo. Si uno comienza en Python usando unainstancia de variable expuesta públicamente y después cambiala implementación para usar una instancia de variable privadaexpuesta a través de un descriptor de propiedades, el códigointerno de la clase necesitará ser ajustado para usar lavariable privada en vez de la propiedad pública. Ruby eliminaestá decisión de diseño obligando a todas las variables deinstancia a ser privadas, pero también proporciona una manerasencilla de declarar métodos set y get. Esto mantiene elprincipio de que en Ruby no se puede acceder a los miembrosinternos de una clase desde fuera de esta; en lugar de esto sepasa un mensaje (se invoca un método) a la clase y recibe unarespuesta.

33

Licencia

El intérprete y las bibliotecas están licenciados de formadual (inseparable) bajo las licencias libres y de códigoabierto GPL y Licencia pública Ruby.

A partir de la versión 1.9.3 se opta por una licencia dualbajo las licencias BSD de dos cláusulas y Licencia públicaRuby.

Acerca del crecimiento de Ruby

Desde su liberación pública en 1995, Ruby ha atraído devotosdesarrolladores de todo el mundo. En el 2006, Ruby alcanzóreconocimiento masivo, formándose grupos de usuarios activosen las ciudades más importantes del mundo y llenando lascapacidades de las conferencias relacionadas a Ruby.

Ruby-Talk, la lista de correo más importante sobre el lenguajeRuby ha crecido hasta lograr un promedio de 200 mensajes pordía.

El índice TIOBE, que mide el crecimiento de los lenguajes deprogramación, ubica a Ruby en la posición número 13 delranking mundial. Refiriéndose a su crecimiento, predicen,“Todo indica que Ruby llegará a estar entre los 10 primeros enmenos de 6 meses”. Gran parte de su crecimiento se atribuye ala popularidad alcanzada por aplicaciones desarrolladas conRuby, en particular el framework de desarrollo web Ruby onRails.

Ruby es totalmente libre. No sólo gratis, sino también librepara usarlo, copiarlo, modificarlo y distribuirlo.

34

BIBLIOGRAFIA

Knowlton, Jim (2009). Python. tr: Fernández Vélez, MaríaJesús (1 edición). Anaya Multimedia-Anaya Interactiva.

Martelli, Alex (2007). Python. Guía de referencia. tr:Gorjón Salvador, Bruno (1 edición). Anaya Multimedia-Anaya Interactiva.

 El lenguaje de programación Ruby por Yukihiro Matsumoto (informit.com)

 La filosofía de Ruby, una conversación con Yukihiro Matsumoto, Parte I por Bill Venners 29-09-2003 (Artima Developer)

 Ruby FAQ  ¿Cómo se compara Ruby con Python? (FAQ)  Feature #2034 Consider the ICU Library for Improving and

Expanding Unicode Support  Novedades de Ruby 1.9.3 http://es.wikipedia.org/wiki/Python http://es.wikipedia.org/wiki/Ruby

35