03/05/2013 - Clase 5 - Introducción a Python y Manejo de Memoria Dinámica "Automático"

Fecha de publicación: 08-may-2013 15:34:06

Ya pasaron varios días de la clase, así que perdí un poco el nivel de detalle. Pero voy a intentar recordar.

Finalmente arrancamos a meternos en el mundo Python, tratando de huir un poco de C y el bajo nivel. En particular, mostramos C hasta ahora, porque el manejo de memoria dinámica manual es una característica que pocos lenguajes tienen, hoy día. Y C es uno de los que tiene esta característica.

De paso, como tampoco tiene TDA's Listas, también lo utilizamos para entender cómo se implementaría una Lista, en sus dos formas: nodos enlazada y basada en array.

Entonces, arrancamos la clase como contando qué es Python, y yendo de una a los papeles. A ver código.

Python

Dimos unas definiciones iniciales del lenguaje: interpretado, débilmente tipado (más exáctamente decimos que las variables no tienen tipo, es decir que el tipado de las variables es implícito, a diferencia de C donde tenemos que especificar los tipos de las variables).

En realidad pueden encontrar el material de la clase en ésta página:

Introducción a Pyhon

Introducción, variables y funciones

Arrancamos viendo el famoso Hola Mundo. El archivo está acá

Luego, vimos cómo definir una función simple que saludaba, y la invocábamos varias veces desde el script/programa. Ese código está acá

Pasaje de parámetros

A continuación hablamos de pasaje de parámetros:

    • con una función que modificaba la variable de su parámetro (esperaba un número). Y veíamos que esto no modificaba a la variable del "main", porque simplemente cambiaba la referencia (hacia donde apuntaba) la variable de la función, sin alterar a la original. Eso está acá.
    • con otra función que recibía una lista, y no la reasignaba, pero sin embargo llamaba a una función que agregaba un elemento. Como la lista es un objeto inmutable, los cambios se veían reflejados en el "main". Eso está acá

Dijimos entonces que todo pasaje se hace por referencia. Y ya no importa tanto el ver si la variable es de tipo básico o puntero (porque de hecho no existe esa distinción en Python), si no que, dependerá del objeto que estoy pasando, si lo pueden modificar o no.

Mutabilidad / Inmutabilidad de los objetos

Dijomos que hay objetos que son:

    • Mutables: por ejemplo una lista, o una estructura definida por ustedes, como los datos de la Persona en el TP.
    • Inmutables: un objeto para el cual no tengo funciones que lo puedan alterar. Por ejemplo, un número. El número 3, es el tres y no puedo "cambiarlo". Sí puedo sumarlo a otro número, pero me dá un tercer número, que va a ser la suma de ambos. Lo mismo pasa con los strings en Python.

La decisión de si un objeto tiene que ser mutable o inmutable no es algo "divino", si no que es decisión del programador que está codificando/modelando/diseñando ese objeto o abstracción. Por ejemplo en Java las fechas también son Inmutables. Y como a mucha gente le parecía engorroso eso, se hizo otro tipo de dato similar, que sirve para fechas, y que es mutable.

La inmutabilidad es una decisión de diseño. Después cuando vean el paradigma funcional, van a entender mejor las ventajas de tener objetos inmutables, que son varias.

Valor de Retorno

Así como vimos pasaje de parámetros vimos otro ejemplo para mostrar qué sucede con el valor de retorno. Nuestro ejemplo, tenía una función repetir(elemento, n) que generaba una lista, con el "elemento", repetido N veces.

El ejemplo está acá

La intención acá era mostrar una función que construía un objeto (la lista), y la devolvía luego. Para hacer esto, en C, teníamos que usar malloc y crear la lista explícitamente en el heap, porque de otra forma, hubiera quedado guardada en la pila. Y era un ERROR devolver como parte del valor de retorno de una función, una referencia a una variable local.

En Python en cambio esto se hace automáticamente. Solo siempre todos los objetos se asignan en el heap. Y como utiliza reference counting y garbage collector, solo libera la memoria.

Manejo de Memoria, Garbage Collector, y Reference Counting

Tenemos una página en la sección Temario donde hablamos de esto.

Gestión Automática de Memoria

Otros ejemplos de código (for, while, if, etc)

También vimos un ejemplo para mostrar variables locales, donde calculábamos el promedio de numeros de una lista. Usando la variable local "suma".

Ahi también vimos el uso del for.

El código está acá

Aplicación Adivina Números

Por último vimos una aplicacioncita que usaba la consola. Generaba un número random entre 0 y 100, y luego el usuario tenía que adivinarlo.

Teníamos dos versiones:

    • Simple: donde el usuario tenía una única oportunidad. Está acá
    • Más Completa: donde el usuario tenía todos los intentos que quería hasta adivinar. Además el programa daba pistas de si el número a adivinar era mayor o menor al último ingresao. Eso está acá

Ahí vimos el while, el if, else, elif, etc.

Parámetros de funciones

Vimos otras cositas que tiene el lenguaje como:

    • parámetros nombrados: código acá
    • parámetros opcionales (con valores por defecto): acá
    • parámetros variables: una función que puede recibir 0 a muchos elementos. Código acá

Resumen de links al código

Acá entonces están todos los links juntos a los archivos:

Igualmente todo el código está adjunto acá abajo a la bitácora como un Export del proyecto Python de eclipse. Porque algunos de estos links no están bien!!!

Instalando y configurando el entorno para programar en Python

En la página de Software ya tenemos las instrucciones para que se armen el entorno para programar.

Clase que viene

La clase que viene vamos a ver manejo de listas, y funciones relacionadas con las ellas. Ahí vamos a empezar a ver el poder del lenguaje :)