Programador Jr. para Python Primera Parte

Post on 03-Nov-2014

12 views 4 download

Tags:

description

El código del curso puede ser descargado desde https://drive.google.com/file/d/0B-tF2kZLbAXPb1BVRHZwMG4tTHc/edit?usp=sharing

Transcript of Programador Jr. para Python Primera Parte

Programador Jr. para Python.Primera parte.

Diciembre 2013.José Luis Chiquete Valdivieso

Acceso al código

El código de este curso puede ser descargado en un archivo comprimido desde:

https://drive.google.com/file/d/0B-tF2kZLbAXPb1BVRHZwMG4tTHc/edit?usp=sharing

Temario (i)

● Introducción al lenguaje Python.● Palabras reservadas y espacio de nombres.● Expresiones y declaraciones.● Tipos de datos básicos y operadores.● Entrada y salida estándar.● Flujo de Ejecución.● Gestión de excepciones.● Orientación a objetos.

Temario (ii)● Más tipos de datos.● Funciones.● Módulos y paquetes.● Caso de estudio.● Escritura y lectura de archivos.

INTRODUCCIÓN

¿Qué es Python?

●Lenguaje de programación de alto nivel multi-propósito, interactivo e interpretado.●Creado por Guido Van Rossum.●Es de código abierto.●El nombre es en honor a “Monty Python Flying Circus”.●Enfocado en la legibilidad del código.●Altamente popular.●Altamente portable.●"Pilas incluidas".

¿Por qué Python?

● Python es un lenguaje muy popular.● Es muy simple.● Es multi-plataforma.● Se adecua a diversos paradigmas de programación

(programación funcional, programación orientada a objetos, programación procesal, etc.)

● Es altamente extensible.● Muchas aplicaciones de primer nivel utilizan Python

(Blender, Google App Engine, Django, etc.).

Índice TIOBE de popularidad de los lenguajes de programación (Octubre 2013).

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Implementaciones de Python

●Cpython. Es la implementación original escrita en C.●Jython. Es la implantación de Python en la máquina virtual de Java.●IronPython. Es la implementación de Python sobre .NET●Pypy. Es una implementación de Python optimizada mediante un compilador "Just in Time".●SL4A permite ejecutar Python y otros lenguajes de script en Android.

Python 2 y Python 3

● Python 3 es una revisión completa del lenguaje de programación a partir de sugerencias y mejores prácticas.

● La sintaxis de Python 3 no es compatible con versiones previas de Python.

● Python 2 y Python 3 las ramas actuales (current).

● Durante el curso se utilizará Python 2.7 por defecto, pero se indicarán las diferencias entre Python 2 y Python 3 cuando sea el caso.

Instalación

● Prácticamente todas las distribuciones de GNU/Linux y *BSD tienen una versión de Python 2 pre-instalada.

● MacOS X tiene Python instalado de origen.● El instalador para Windows debe ser

descargado de http://www.python.org

Interfaz interactiva de Python

● Linux y Mac OS X: Es necesario abrir una terminal de texto y ejecutar el comando python

● En Windows se selecciona Python (Command Line).

Interfaz interactiva de Python

Interfaz interactiva de Python

● Para salir de la interfaz interactiva se invoca a exit()

Lenguaje

●Es un conjunto de cadenas de símbolos con los que se pueden crear mensaje.

●Consta de:●Gramática. Trata sobre la construcción del lenguaje.●Semántica. Trata sobre el significado del lenguaje.

Morfología y sintaxis

●La Gramática consta de:●Morfología: cómo se construyen las notaciones (género, tiempos, declinaciones).●Sintaxis: cómo se deben escribir las notaciones (orden, estructura).

●Los lenguajes artificiales tienen una morfología rígida y simplificada.

Lenguajes de programación

Lenguajes artificiales utilizados para ingresar valores y dar instrucciones a

un sistema.

Lenguajes de bajo y alto nivel

● Lenguajes de bajo nivel: Conjunto de instrucciones que son interpretados directamente por el CPU de los sistemas de cómputo (ensamblador, lenguaje máquina).

● Lenguajes de alto nivel: Conjunto de instrucciones legibles para el ser humano que son traducidas a instrucciones de bajo nivel (C, COBOL, Java, Perl, Python, etc.).

Lenguajes interpretados y compilados

● En el caso de los lenguajes compilados, el código fuente debe ser traducido a código de máquina para ser ejecutados (C, Objective-C).

● Los lenguajes interpretados ejecutan el código indirectamente “al vuelo” (BASIC, Perl, Python, etc.).

● En el caso de lenguajes como Java, el código fuente es convertido en bytecode para ser ejecutado por una máquina virtual.

Python es...

● Un lenguaje de alto nivel.● Un lenguaje interpretado.● Que soporta múltiples paradigmas

de programación.

Características (i)

●Sintaxis muy clara y legible.●Fuerte capacidad de introspección.●Orientación a objetos intuitiva.●Expresión del código procedimental.●Altamente modular, soporta paquetes jerárquicos.●Enfocado en el uso de excepciones para el manejo de errores.

Características (ii)

●Tipos de datos dinámicos de muy alto nivel.●Extensa biblioteca estándar (STL) y módulos de terceros para prácticamente todas las tareas.●Extensiones y módulos fácilmente escritos en C, C + + (o Java para Jython, o. NET para IronPython).●Integrable dentro de las aplicaciones como una interfaz de scripting.

El Zen de Python

El Zen de Python (i)● Bello es mejor que feo.● Explícito es mejor que implícito.● Simple es mejor que complejo.● Complejo es mejor que complicado.● Plano es mejor que anidado.● Escaso es mejor que denso.● La legibilidad cuenta.● Los casos especiales no son tan especiales

como para romper las reglas.

El Zen de Python (ii)● Aunque lo práctico le gana a la pureza.● Los errores no deben pasar en silencio.● A menos que sean silenciados explícitamente.● En caso de ambigüedad, resiste la tentación a

adivinar.● Debería haber una --y preferiblemente sólo

una-- manera obvia de hacer las cosas.● Aunque esa manera no parezca ser tan obvia a

menos que seas Holandés.

El Zen de Python (iii)● Ahora es mejor que nunca.● Aunque nunca es normalmente mejor que

ahora "mismo".● Si la implementación es difícil de explicar, es

una mala idea.● Si la implementación es fácil de explicar, podría

ser una buena idea.● Los Espacios de Nombres son una magnífica

idea -- ¡Hagamos más de esos!

Las PEPs de Python

● Acrónimo de "Python Enhancement Proposal".● Iniciativas y propuestas de la comunidad para

mejorar el funcionamiento y uso de Python.● http://www.python.org/dev/peps/● La PEP-8 es particularmente interesante, ya

que se refiere al estilo a utilizar al codear en Python.

Entornos Integrados de Desarrollo (IDE)

● Es un conjunto de herramientas e interfaces que facilitan la programación.

● Componentes:● Editor.● Depurador.● Compilador (no es necesario para Python).● Interfaz de ejecución.● Gestor de componentes.● Control de versiones.● Ejemplos: Eclipse, Visual Studio, NetBeans

IDE para Python● IDLE.● devpy para Eclipse.● SPE.● Boa Constructor.● Vim.● Emacs.● Gedit.● Wing IDE.● Komodo.● Ninja IDE.

Recursos a utilizar

● Para el presente curso utilizaremos:● Ninja IDE (http://ninja-ide.org/).● Un editor de textos (vim, gedit, notepad).● La interfaz interactiva de Python.● La línea de comando (símbolo del sistema o

una terminal).

Ninja-IDE

Características de Ninja-IDE

● Es de código abierto.● Ligero y fácil de usar.● Corre en Linux, Windows y MacOS X (hay que instalar

previamente XQuartz http://xquartz.macosforge.org/landing/ ).

● Capaz de generar proyectos distribuidos en diversos archivos.

● Cuenta con corrector sintáctico y de estilo (PEP-8) y sugerencias de optimización del código para Python 3.

Configuración de Ninja-IDE

● En Windows es necesario indicarle a Ninja-IDE la localización del archivo ejecutable de Python.

Funciones y comandos de Ninja-IDE

● Ctr+N: Crea un nuevo archivo.● Ctrl+O: Abrir un archivo.● Ctrl+S: Guardar el archivo actual.● Ctrl+F6: Ejecuta el archivo actual.● Shift+Ctrl+F6: Detiene la ejecución del

intérprete.

Ventanas del shell interactivo

Ventana del código

Ventana de ejecución

Hola Mundo

● En la interfaz interactiva.● Como script.● Ejecutable.

print "Hola Mundo"

Hola Mundo en la Interfaz Interactiva

Un script de Python

● Un script es un archivo de texto con código de Python, el cual normalmente tiene la extensión .py

● Algunos editores de texto cuentan con reconocimiento de la sintaxis de Python y utilizan colores para identificar sus componentes.

El script holamundo.py

Ejecutando un script

● Windows:● Una vez instalado Python, Windows relacionará los archivos

con extensión .py al intérprete de Python y los ejecutara al hacer doble click sobre ellos en el gestor de archivos.

● *NIX, ● Es necesario añadir la ruta al intérprete de Python insertando

la línea #! /usr/bin/python y asignarle los permisos de ejecución. Windows pasa por alto esta línea.

● Si no se cuenta con los permisos de ejecución, el script se puede ejecutar invocando al intérprete de Python: python <nombre del archivo>

Permisos de ejecución en *NIX

Ejecutando holamundo.py desde terminal

Ejecutando holamundo.py desde Ninja-IDE

● Al oprimir Ctrl+F6 en Ninja-IDE el script se ejecuta de esta manera:

Ejecutando holamundo.py desde un entorno gráfico

● Una vez que se le dan los permisos de ejecución en *NIX, también es posible ejecutar el script dando doble click en el gestor de archivos.

● El script se ejecutará en una terminal de texto, pero una vez terminado el script, la terminal se cerrará inmediatamente.

● Para que la terminal no se cierre, habrá que indicar al script que espere hasta que la tecla de retorno de carro sea presionada.

Script holamundo.py con raw_input()

Codificación en Python 2

● Python 2 utiliza por defecto una codificación ASCII, por lo que desplegar caracteres especiales como la "ñ" y los acentos generan un mensaje de error.

● Python 3 utiliza la codificación UTF-8 por defecto.

● Para definir la codificación se debe incluir la línea: # -*- coding: <codificación> -*-

● En el caso de textos en castellano se recomienda la codificación utf-8.

El script holaninos.py

PALABRAS RESERVADAS Y ESPACIO DE NOMBRES

Palabras reservadas de Python

● Las palabras reservadas (keywords) corresponden a los nombres de las declaraciones que el intérprete de Python incluye por defecto.

● El listado de palabras reservadas puede ser consultado ingresando help('keywords') desde la interfaz interactiva.

● No se deben utilizar dichas palabras para asignar nombres a otros objetos.

Palabras reservadas de Python 2.7

Palabras reservadas de Python 3.3

El espacio de nombres● Python es un lenguaje de muy alto nivel en el que

todos sus elementos son objetos, incluyendo los tipos de datos básicos.

● El espacio de nombres (name space) del intérprete de Python contiene las referencias entre los objetos existentes en la memoria (valores, funciones, clases, etc.) y los nombres a los que se encuentran ligados.

● Si un objeto no está ligado al menos a un nombre, dicho objeto es destruido automáticamente.

● El intérprete de Python tiene un espacio de nombres principal, pero cada función, módulo y objeto tiene su propio espacio de nombres.

El operador de asignación =● Para crear un objeto de cualquier tipo sólo es

necesario ligar a éste con un identificador mediante el operador de asignación "=".

● Desde un enfoque de programación procedimental, este tipo de asignación se comporta de forma muy similar a la creación variables.

● Un identificador siempre debe ser definido antes de ser utilizado.

El operador de asignación =

La función dir()● Cuando se ejecuta dir() sin ningún

parámetro, éste despliega los nombres contenidos en el espacio de nombres principal.

Sintaxis para nombres

● Los nombres deben empezar con un guión bajo "_" o una letra del alfabeto.

● Después del primer carácter, se pueden utilizar letras, números y/o guiones bajos.

● No se permiten caracteres especiales como "ñ", "#", "-", etc.

● Se pueden utilizar mayúsculas, pero Python es sensible a mayúsculas.

Sintaxis para nombres

La función id()

● Cada objeto cuenta con un identificador interno que corresponde a la posición en la que se encuentra almacenado en la memoria.

● La función id() permite conocer este identificador interno por medio del nombre.

● La correcta identificación de los objetos es importante, ya que un mismo objeto puede tener más de un nombre.

La función id()

La declaración del

El comando del funciona de la siguiente manera:● Desliga al identificador de un objeto en el espacio de

nombres.● Una vez que el nombre del identificador es desligado,

ya no es posible invocarlo por ese nombre.● En caso de que el objeto no esté ligado a otros

identificadores en el espacio de nombres, el intérprete de Python podría destruir al objeto por medio del "recolector de basura".

● El modo en el que un objeto se comporta al ser descartado varía dependiendo del tipo de objeto. Este tema se discutirá más adelante.

La declaración del

EXPRESIONES Y DECLARACIONES

Expresiones

Una expresión es una combinación de valores, operadores y variables.● 1 + 1● "azul" + " rojo"● print "Hola"

Declaraciones (Statements)

● Es una unidad de código que el intérprete de Python puede ejecutar.

Múltiples expresiones en una línea

● El intérprete de Python permite ejecutar múltiples expresiones en una sola línea separándolas por punto y comas ";"

● No se recomienda usar este recurso, ya que se corre el riesgo de ofuscar el código innecesariamente.

Expresiones en entorno interactivo

● La interfaz interactiva evalúa las expresiones tan pronto como son ingresadas y en su caso, despliega el resultado.

Expresiones con el intérprete

● Si esas mismas expresiones las guardamos en un archivo llamado expresiones.py y lo ejecutamos éste leerá el archivo y realizará una evaluación línea por línea en orden descendente, pero no desplegará el resultado de cada expresión.

El script expresiones.py

TIPOS DE DATOS BÁSICOS Y OPERADORES

Tipos de datos básicos● Números

● Enteros (int, long)– Decimales (24, 60)– Hexadecimales (0x18, 0x3c)– Octales (030, 074)– Binarios(0b11001, 0b111100)

● De punto flotante (float)● Complejos (complex)

– 3 + 45j, 1j

● Cadenas de texto (str)● Encerradas entre comillas "" o apóstrofes ''

– 'Hola Mundo'– "Vamos al McDonald's"

● Valores booleanos(bool)● True/False

Tipos en Python

● Tipos dinámicos: No es necesario definir previamente el tipo de una variable.

● Fuertemente tipado: No se pueden realizar operaciones con tipos distintos.

Funciones relativas a tipos de datos

● type() regresa el tipo de dato de una variable.

● str() transforma en una cadena de caracteres el contenido de una variable.

● int() transforma en un tipo entero el contenido de una variable.

● float() transforma en un número de punto flotante el contenido de una variable.

● complex() transforma en un número complejo el contenido de una variable.

● bool() transforma en un valor booleano el contenido de una variable. Cualquier valor distinto de 0 es True

Ejemplo del uso de tipos

Ejemplo del uso de tipos

Operadores aritméticos

En Python 2 las divisiones entre enteros dan por resultado valores enteros, mientras que en Python 3 las divisiones entre enteros dan como resultado valores de punto flotante.

Operador Descripción Ejemplo

+ Suma x = 1 + 2 # x es 3

- Resta x = 2 - 1 # x es 1

- Negativo x = -2 # x es -2

* Multiplicación x = 1 * 2 # x es 2

** Exponente x = 2 ** 3 # x es 8

/ División x = 1.0 / 2 # x es 0.5 *

// División entera x = 1.0 // 2 #x es 0.0

% Módulo x = 1.0 % 2 #x es 1

Operadores de asignación

Operador Descripción Ejemplo

= Asignación simple x = y

+= Suma x += y equivale a x = x + y

-= Resta x -= y equivale a x = x - y

*= Multiplicación x *= y equivale a x = x * y

**= Exponente x **= y equivale a x = x ** y

/= División x /= y equivale a x = x / y

//= División entera x //= y equivale a x = x // y

%= Módulo x %= y equivale a x = x % y

Reglas de precedencia

● Los operadores se apegan a la siguiente regla de precedencia siguiendo una secuencia de izquierda a derecha:● Paréntesis● Exponente● Multiplicación● División● Suma● Sustracción

Operadores de bit

Operador Descripción Ejemploa = 23 = 0b10111b = 14 = 0b1110

& AND a & b es 0b00110 = 6

| OR a | b es 0b11111 = 31

^ XOR a ^ b es 0b11001 = 25

>> Mover x bits a la derecha a << 1 es 0b101110 = 46

<< Mover x bits a la izquierda a >> 1 es 0b1011 = 11

Operadores de cadena

Operador Descripción Ejemplo

+ Concatenación a = ”Hola” b = ”Mundo”c = a + b # c es “HolaMundo”

* Repetición a = ”Hola”b = c * 3 # c es “HolaHolaHola”

Operadores de relación

Operador Evalúa== a == b # ¿a igual a b?!= a != b # ¿a distinta de b?> a > b #¿a mayor que b?< a < b #¿a menor que b?

>= a >= b #¿a mayor o igual que b?<= a <= b #¿a menor o igual que b?

Operadores Booleanos

Operador Evalúaor a or b # ¿Se cumplen a o b?

and a and b # ¿Se cumple a y b?not not a # ¿no es A?

Operador de identidad

Operador Evalúa

is a is b #equivale a id(a) == id(b)

is not a is not b #equivale a id(a) != id(b)

● El operador is evalúa si un identificador se refiere exactamente al mismo objeto.

ENTRADA Y SALIDA ESTÁNDAR

print

● print despliega en una terminal de texto la información que se le indica.

● En Python 2 se ejecuta como una palabra reservada " print ", mientras que en Python 3 se utiliza como una función " print () "

● Cuando print incluye una expresión, ésta es evaluada antes de ser desplegada.

● print puede desplegar varios valores separados por comas.

● En Python 2, si se deja una coma al final, el siguiente despliegue de print se hará en la misma línea.

print en Python 2

print() en Python 3

● Python 2.7 es una versión de transición, por lo que acepta ambas sintaxis.

print y print() en Python 2.7

● Para los alcances de este curso se usará la sintaxis de Python 2.

● Python 2.7 es una versión "de transición", por lo que acepta ambas sintaxis.

Despliegue con formato● Para desplegar datos en un formato específico

se utiliza el carácter sobre-escritura % seguido de uno de los siguientes caracteres.

● Después de la cadena se añade otro % y los valores a desplegar entre paréntesis separados por comas. Si sólo es un valor, no es necesario el paréntesis.

s cadena de texto

d entero

o octal

x hexadecima

f punto flotante

e Punto flotante en formato exponencial

Despliegue con formato

● Cuando se utiliza %s, equivale a aplicar la función str() al valor a desplegar.

● Para desplegar el signo de porcentaje "%" se utiliza %%.

Despliegue con formato

● Para desplegar el signo de porcentaje "%" se utiliza %%.

Despliegue de cifras significativas

● Para desplegar un número específico de cifras significativas de un valor de punto flotante, se añade un punto "." y el número de cifras a desplegarse después del signo % y antes del carácter f o e.

Caracteres de escapeSecuencia Acción

\n retorno

\t tabulador

\xXX carácter ASCII hexadecimal

\' apóstrofe

\" comillas

\\ diagonal invertida

La función eval()

● eval() es una función de Python que realiza la evaluación de una cadena de texto como si fuera una expresión.

● Cuando una cadena de texto no contenga una expresión válida, eval() generará un mensaje de error.

eval (<cadena de texto>)

La función eval()

La función raw_input()● La función por defecto para leer la entrada estándar es

raw_input()● raw_input() lee la entrada estándar hasta que se introduce

un retorno de carro <ENTER>.● El contenido capturado es devuelto al intérprete como una

cadena de caracteres.● La cadena de caracteres resultante puede ser almacenada

en memoria mediante la asignación de un nombre.

La función raw_input()● La función raw_input() permite desplegar una

cadena de texto antes de pedir el ingreso de caracteres de la siguiente forma:

raw_input(<cadena>)

La función input()

● input() funciona de forma similar a raw_input(), pero a diferencia de ésta, input() evalúa el contenido de lo que se ingresa de forma similar a ejecutar: eval(raw_input()).

● De ese modo, input() puede regresar valores de diversos tipos, en vez de sólo cadenas de texto.

● La desventaja de input() es que los contenidos que se ingresen deben de ser sintácticamente correctos o se generaran errores.

raw_input() vs input()

La función input() en Python 3

● Debido a los problemas que el uso de input() al estilo de Python 2 podría ocasionar, la función input() en Python 3 se comporta como raw_input() al estilo de Python 2.

● La función raw_input() fue descontinuada en Python 3.

FLUJO DE EJECUCIÓN

Indentación

● En Python la indentación implica una ejecución anidada.

● Por convención se utilizan cuatro espacios para indentar.

● Nunca se usan tabuladores en la indentación.● Para mayor referencia ir al PEP8.

Comentarios● Los comentarios son porciones de texto que no

son incluidos en el flujo de ejecución de un script y sirven para documentar al código.

● Cualquier texto después del carácter "#" y hasta el retorno de carro es considerado como un comentario.

● Algunas especificaciones de ejecución de Python también se colocan como si fueran comentarios.

● Los comentarios de varias líneas deben estar encerrados entre triples comillas o apóstrofes y son conocidos como docstrings.

El script hola_comentado.py

Documentación del código

● Los docstrings que se incluyen al principio de la un módulo o definición de una función o clase son reconocidos por Python para generación automática de la documentación del código (PEP 257).

Condicionales

● Cuando la ejecución de cierto bloque de código depende de una condición lógica en particular que sea de carácter booleanos (True/False), podemos utilizar los varios tipos de estructuras que if permite utilizar.

● A continuación se presentan algunos diagramas y script que ejemplifican el uso de las condicionales en Python.

Condicional if

El script if_simple.py

Condicional if... else

El script if_else.py

Condicional if... elif... else

El script if_elif_else.py

Recursividad con while

● Python cuenta con la declaración while para ejecutar un bloque de código recursivamente mientras se cumpla una condición determinada.

● Cuando dicha condición no se de, el flujo de ejecución continuará sin ejecutar el bloque dentro de while.

El script while.py

Interrupción del flujo lógico

● En ciertas circunstancias es necesario interrumpir el flujo lógico de un programa. Python cuenta con los siguientes recursos para hacerlo.

● La declaración break● La declaración continue● La función exit()

Dichos recursos se pueden utilizar en cualquier bloque de código. Para ilustrar su aplicación se utilizarán con while.

Terminación del bucle actual con continue

● Es posible terminar un subproceso de manera prematura con continue.

Terminación del bucle actual con continue

● Es posible terminar un subproceso de manera prematura con continue.

El script while_continue.py

Ruptura del bucle con break● Es posible terminar el bucle con break.

El script while_break.py

Terminación de la ejecución con exit()● El intérprete termina la ejecución del scritp a

ser invocada la función exit()

El script while_exit.py

Iteraciones● Una de las grandes fortalezas de Python es su

capacidad de generar muy diversos modos de realizar iteraciones de forma dinámica a partir de diversos tipos de datos.

for <iterador> in <objeto iterable>:● La forma más conocida de iterar es por medio

del uso de la función range()

La función range()

● Para definir rangos numéricos se usa la función range().

● range (n, m, s) cumple: rango >= n and rango < m en incrementos de s

● range (n, m) cumple: rango >= n and rango < m en incrementos de 1

● range (m) cumple: rango >= 0 and rango < m en incrementos de 1

El script for_simple.py

range() en Python 3

● La función range() en Python 2 crea una lista de números, lo cual puede consumir demasiados recursos cuando se trata de una iteración con números grandes.

● La función xrange() en lugar de crear una lista, genera un "iterador" a la vez, lo que hace más eficiente el uso de recursos.

● En Python 3 la función range() funciona como xrange() al estilo de Python 2.

GESTIÓN DE EXCEPCIONES

Gestión de excepciones

● Debido a lo dinámico que puede ser Python, es muy común que el intérprete se tope con múltiples fuentes de error.

● Una de las características más poderosas del lenguaje es la gestión de excepciones.

● Con Python no sólo es posible identificar y rastrear los errores, sino tomar acciones correctivas y preventivas.

Errores sintácticos● Los errores sintácticos son los más comunes

cuando se escribe código.● Un error sintáctico ocurre cuando el intérprete

encuentra una expresión que no está bien formada (rompe las reglas de sintaxis).

Excepciones● Las excepciones son errores lógicos que

detienen la ejecución del programa aún cuando la sintaxis del código sea correcta.

El script excepcion_probable.py

● El script excepcion_probable.py ejemplifica código susceptible a que ocurran errores de diversos tipos.

● El código tiene una sintaxis correcta.

Desencadenando una excepción● Al ejecutar error_probable.py, se provoca una excepción al ingresar

una cadena de texto sin estar encerrada entre paréntesis o apóstrofes.● Debido a que se utiliza la función input(), el intérprete evaluará como

una expresión aquello que se ingrese.● El error ocurre debido a que el intérprete identifica a la cadena de

caracteres como un nombre el cual no está definido en el espacio de nombres.

● El intérprete detiene la ejecución y despliega un mensaje.

Anatomía de un mensaje de error

● Un mensaje de error de Python se divide en 2 componentes:● La ruta de rastreo del error.

● La información sobre el error.

Rastreo del error

● Debido a que Python es altamente modular, un error puede desencadenarse en cierto punto, pero ocurrir en otro.

● Cuando ocurre un error, Python despliega la ruta. Esta ruta puede implicar a varios módulos.

● La ruta va en orden descendente desde el punto, pasando por varios puntos intermedios hasta el punto en el que se desencadenó el error.

Ruta del error

● En el caso que se ejemplifica, Python indica que el error se desencadenó en la línea 7 de excepcion_probable.py y despliega la línea en cuestión.

● El error ocurrió cuando el intérprete intentó ejecutar la expresión, por lo que en este caso no hay mayor información de la ruta, pero se deja evidencia del error.

Información del error

● La información del error se da en una sola línea.

● Indica el tipo de error que ocurrió.

● Despliega un mensaje que explica lo que ocurrió.

Tipos de excepciones

● Python es capaz de identificar muy diversos tipos de error a los que corresponden sendas excepciones capaces de tratar con cada uno de ellos.

● Se pueden consultar los diversos tipos de excepciones en la siguiente liga:

http://docs.python.org/2/library/exceptions.html

Posibles tipos de excepciones en el script excepcion_probable.py

● NameError

● ValueError

Posibles tipos de excepciones en el script excepcion_probable.py

● TypeError

● SyntaxError

Recursos de captura de excepciones● Python cuenta con una serie de recursos que

permiten la captura y gestión de excepciones, los cuales se ejecutan dependiendo de ciertas condiciones.

● Si la excepción no es capturada, ésta correrá hasta sus últimas consecuencias.

● Los recursos de gestión y captura de excepciones son:● try● except● else● finally

Delimitación del código con try● Cuando se identifica una sección de código

susceptible de errores, ésta puede ser delimitada con la expresión try.

● Cualquier excepción que ocurra dentro de esta sección de código podrá ser capturada y gestionada.

● En el caso del script excepcion_probable.py se puede observar por los mensajes de error que el segmento comprendido entre las líneas 7 y 9 es el que se debe delimitar.

Gestión de excepciones con except

...

...

try: <código suceptible de errores>except: <código>......

● La expresión except es la encargada de gestionar las excepciones que se capturan.

● Si se utiliza except sin mayores parámetros, ésta ejecutará el código que contiene para todas las excepciones que ocurran.

El script excepcion_basica.py

El script excepcion_basica.py

● El script excepcion_basica.py representa la forma más sencilla de capturar una excepción.

● El código susceptible de error fue delimitado con try.

● Cuando ocurre la excepción, except la captura, pero no hace nada en absoluto. Simplemente permite que el programa continúe.

La expresión pass

● La expresión pass no realiza ningún tipo de acción. Sin embargo, permite que un bloque de código no quede en blanco y se genere un error.

● En el script excepcion_basica.py, pass es utilizado para que la excepción sea atrapada, pero no se realiza ninguna acción.

● La expresión pass puede ser utilizada en funciones y métodos como se verá más adelante.

El script excepcion_simple.py

Uso de "banderas"● El script excepcion_simple.py levanta una

"bandera" cambiando el valor del objeto ocurre_error (de tipo booleano) en caso de que ocurra una excepción.

● El uso de "banderas" es muy común y permite cambiar el comportamiento en la ejecución de un programa en caso de que ocurran ciertas condiciones específicas.

Gestión de excepciones por tipo de error.

La expresión except puede ser utilizada de forma tal que ejecute código dependiendo del tipo de error que ocurra de una forma muy similar a elif.

...

...

try: <código suceptible de errores>except <ErrorTipo1>: <código1>except< ErrorTipo2>: <código2> except (<ErrorTipo3>, <ErrorTipo4>): <código3>except: <código4>......

El script excepciones_identificadas.py

El script excepciones_identificadas.py

Captura de descripciones de error● except tiene la capacidad de capturar la

descripción del error como un objeto de tipo str. ● Esta descripción puede ser asignada a un

nombre para ser desplegada.● Cuando se usa except sin parámetros, no es

posible recuperar el mensaje de descripción.......

try: <código suceptible de errores>except <TipodeError> as <nombre>: <código>......

La expresión as

● Existen algunos casos en los que sintácticamente no es posible utilizar el operador de asignación = para ligar un nombre a un objeto en el espacio de nombres.

● La expresión as actúa de forma idéntica al operador =, pero con una estructura sintáctica distinta como es el caso de except para capturar la descripción del error.

El script excepciones_descritas.py

El script excepciones_descritas.py

Uso de else

● Se utiliza else en el caso de que dentro del segmento de código delimitado por try no ocurra ninguna excepción.

...

...

try: <código suceptible de errores>except: <código1>......else: <código2>......

Uso de finally

● La expresión finally ejecuta el código dentro de ésta ya sea que ocurra la excepción o no.

● Este comportamiento es muy útil sobre todo cuando se hacen operaciones de escritura archivos, bases de datos o conexiones de red que pueden corromperse si no se cierran adecuadamente independientemente de si ocurre una excepción o no.

Uso de finally

..

...

try: <código suceptible de errores>except: <código1>......else: <código2>......finally: <código3>......

El script excepciones_atrapadas.py

El script excepciones_atrapadas.py

Levantar excepciones con raise

● En ciertas ocasiones es posible identificar una situación en la que cierta condición provocará un error. En ese caso se puede levantar una excepción antes de que el error ocurra y emitir un mensaje correspondiente.

● La expresión raise puede levantar esa excepción.

raise <TipodeError>(<mensaje>)

El script raise.py

El script raise.py

Evaluando resultados con assert

● La expresión assert es útil cuando se conoce el resultado esperado de un programa.

● La expresión assert levanta una excepción de tipo AssertionError si una condición no es verdadera.

assert(<condición>)

El script assert.py

ORIENTACIÓN A OBJETOS

Python está orientado a objetos

● Todos los elementos de Python son objetos, incluyendo los que podrían ser datos de tipos básicos como los números (int, float, complex), las cadenas de caracteres (str) y los booleanos (bool).

● Los tipos básicos están diseñados para comportarse de tal forma que un programador no requiera de utilizar el paradigma de programación de objetos en lo absoluto.

Clases y tipos● En Python los tipos de datos en realidad son

clases.● Una clase es el "prototipo" que ostenta las

características iniciales y define el comportamiento que adquirirán los objetos que se "instanciarán" de ésta.

● Cuando el intérprete de Python evalúa una declaración, éste infiere el tipo de dato del que se trata a partir de su sintaxis e instancia de esta clase un objeto en el que almacena el dato obtenido.

La función isinstance()

● Para validar si un objeto es una instancia de una clase, se utiliza la función isinstance(), la cual devolvería un valor True en caso de que así fuera.

Ejemplo de creación de objetos.● El intérprete crea a un objeto de clase

int que contiene un valor de 3 y un objeto de clase str que contiene al texto "Hola ".

● La clase str define un comportamiento específico cuando se encuentra con el operador * y un objeto de tipo int.

● El resultado es un nuevo objeto de tipo str que contiene al texto "Hola Hola Hola ".

● El objeto nuevo es desplegado.

● Todos los objetos son desechados tan pronto como son utilizados.

Persistencia de los objetos

● En este caso, ocurre algo muy similar a lo anterior, pero el objeto no es destruido inmediatamente.

● Un objeto puede ser ligado a un nombre en el espacio de nombres mediante el operador de asignación = o la expresión as.

● El objeto perdurará hasta que sea eliminada toda referencia a éste en el espacio de nombres, o hasta que el intérprete se cierre.

Comportamiento y contenido en los objetos.

● Los objetos adquieren los comportamientos propios de la clase de la que fueron instanciados. A éstos se les denominan "métodos".

● Los objetos pueden almacenar datos en incluso a otros objetos. A éstos se les llaman "atributos".

● Tanto métodos como atributos tienen un nombre por el cual pueden ser accedidos e invocados con la siguiente sintaxis que utiliza al punto (.) como "operador de atributo".

<objeto>.<atributo><objeto>.<método>(<parámetros>)

Invocando a un método

● En los objetos de tipo str, existe el método denominado __mul__(), que es el encargado del comportamiento de este tipo de objetos ante el operador *

Introspección

● Introspección es la capacidad que tiene Python de obtener información y documentación de un objeto a partir del código y los comentarios de dicho código (mediante las docstrings).

● Las funciones dir() y help() son herramientas que ayudan al usuario a encontrar información útil en el entorno interactivo.

La función dir()

● La función dir() ejecuta un listado de los métodos y atributos que contiene un objeto.

La función help()

● La función help() despliega la información sobre la estructura y documentación de un objeto en el entorno interactivo.

● help() también despliega algunos otros datos a partir de ciertas palabras clave en formato de cadena de texto como "keywords", "modules" o "topics", etc.

● Si se usa help() sobre un objeto de tipo str, es posible que se obtenga un error si su contenido no coincide con alguna palabra clave como las mencionadas.

Ejemplo: help(str)

Navegación dentro de help()

● Debido a que el contenido desplegado por help() generalmente se extiende más allá de la capacidad de la pantalla, al ejecutar la función, el entorno interactivo cambia a un modo de lectura en el cual uno se puede trasladar a lo largo del texto de ayuda con las teclas de <arriba>, <abajo>, <avpág>, <repág>, <inicio> y <fin>.

● Para salir del modo de lectura sólo es necesario ingresar la tecla q.

MÁS TIPOS DE DATOS

Tipos predeterminados de Python

● Debido a que los tipos de datos en Python son equiparables a las clases, extenderlos no sólo posible, sino muy común.

● Python cuenta con un conjunto de tipos predeterminados que el intérprete adquiere por defecto.

NOTA: Conforme a los alcances de este curso, se enumerarán la mayoría de los tipos, pero algunos de éstos no serán estudiados.

Clasificación de tipos.● Tipo booleanos (vistos previamente).● Tipos numéricos (vistos previamente).● Tipos secuenciales.● Tipos de colección.● Tipos mapeados.● Tipos de archivo.

Tipos de datos secuenciales.

● Listas list● Tuplas tuple● Cadenas de texto str● Archivos file● Texto unicode unicode (no se cubrirá)● Arreglo de bytes bytearray (no se cubrirá)● xrange (no se cubrirá)● buffer (no se cubrirá)

Tipos de datos de conjuntos.

● Conjuntos set● frozenset

Listas

Definidas entre corchetes “[“ “]”● Separadas por comas.● Los elementos de una lista también pueden ser una

lista o cualquier objeto.● Ejemplos:

● [“azul”, 3.2, “verde”, 45, True]● ["superficie", "perímetro", ["base", "altura"]]● [[“helicóptero”, “millas”, 230], [“autobús, “kilómetros”,

120, False]]

Indexado de elementos en listas

● La posición de un elemento de la lista corresponde a un número a partir de 0 de izquierda a derecha o a partir de -1 de derecha e izquierda.

Modificación de elementos en listas● Es posible modificar los contenidos de un

elemento de una lista mediante el operador de asignación "=" , sin embargo, no se pueden añadir elementos por este procedimiento.

<lista>[<índice>] = <valor>

Eliminación de un elemento de la lista

● Para desligar un elemento de una lista se utiliza la declaración del.

del <lista>[<índice>]

Concatenación y multiplicación de listas

● Es posible concatenar una lista con el operador "+" .

● El operador "*" repite y concatena una lista el número de veces que se indique.

Algunas funciones para listas

● len(<lista>) da el tamaño de la lista.● max(<lista>) despliega el elemento mayor de

la lista.● min(<lista>) despliega el elemento menor de la

lista.● sum(<lista>) despliega la suma de la lista.

Algunas funciones para listas

Algunos métodos de las listas● <lista>.append(valor) añade un valor al final de

la lista.

● <lista>.insert(posición, valor) añade un valor en la posición indicada, desplazando el resto de los elementos de la lista.

● <lista>.remove( valor) elimina el primer elemento que sea igual al valor indicado.

● <lista>.reverse( ) invierte el orden de la lista.

● <lista>.sort( ) ordena de forma ascendente los elementos de la lista.

● <lista>.pop( ) elimina el último elemento de la lista y regresa su valor.

Algunos métodos de las listas

Efecto de espejo (Aliasing)

● Debido a que las estructuras de datos son objetos, cuando utilizamos el operador de asignación "=", no se crea una nueva lista con un nombre distinto a la lista original, sino que se le da otro nombre a la lista (alias).

Efecto de espejo al asignar nombres a listas

(Alias)

"Rebanado" de listas

● Es posible extraer elementos de una lista dentro de un rango.

● <lista nueva> = <lista>(<índice_inicial>:<índice_final>)

● El resultado del rebanado será una nueva lista de elementos que van del índice inicial al anterior al índice final.

"Rebanado" de listas

● Es posible copiar hasta cierto nivel una lista mediante el "rebanado".

Rebanado de listas que contienen otros objetos

● El rebanado en las listas no es exhaustivo, por lo que los objetos dentro de las lista siguen sufriendo del efecto espejo.

● A este rebanado no exhaustivo se le llama "shallow copy".

● Más adelante se discutirá el tema de "deep copy".

Rebanado de listas que contienen otros objetos

El script for_lista.py

Uso de for con listas

TuplasDefinidas entre paréntesis “(“ “)”● Separadas por comas.● Las tuplas pueden ser indexadas como las listas.● No pueden cambiar sus valores.● No es posible eliminar un elemento de la tupla con del. ● No cuentan con los métodos de las listas.● Los operadores "+" y "*" pueden ser utilizados.● Es posible "rebanar" las tuplas.● Es posible usar la función len() en las tuplas.

Tuplas

Diccionarios

Los diccionarios son listas en la que los índices en vez de ser numéricos, corresponden a un identificador de tipo cadena de caracteres.● Definidas entre llaves “{“ “}”

● Separadas por comas.● Formato: <Identificador> : <objeto>● El identificador es inmutable y representa un

mapeo de los objetos.● No pueden ser concatenados.

Indexado de diccionarios

● A diferencia de las listas, el indexado de un diccionario no corresponde a una secuencia de números, sino al conjunto de los identificadores.

● Los identificadores de los diccionarios pueden ser de cualquier tipo.

Modificación de elementos en diccionarios

● Es posible modificar los contenidos de un elemento de un diccionario mediante el operador de asignación "=" , sin embargo, no se pueden añadir elementos por este procedimiento.

● Los identificadores no pueden modificarse.

<diccionario>[<identificador>] = <valor>

Adición de elementos a un diccionario

● Para añadir un elemento se hace lo siguiente:

<diccionario>[<identificador nuevo>] = <valor>

Eliminación de un elemento de un diccionario

● Para eliminar un elemento de un diccionario se utiliza la declaración del.

del <diccionario>[<identificador>]

Funciones para diccionarios

● len (<lista>) da el número de elementos en el diccionario.

● Es posible usar max() y min() para identificar el identificador de mayor valor como cadena de caracteres.

Algunos métodos de diccionarios

● <diccionario>.items() regresa los elementos de un diccionario como una lista de de tuplas.

● <diccionario>.keys() regresa los identificadores de un diccionario como una lista.

● <diccionario>.iteritems() regresa un iterador conteniendo cada elemento del diccionario como una tupla.

● <diccionario>.iterkeys() regresa un iterador conteniendo cada identificador del diccionario.

● <diccionario>.itervalues() regresa un iterador conteniendo cada valor del diccionario.

Métodos de diccionarios en Python 3

En Python 3 los siguientes métodos fueron descartados.● iteritems() ● iterkeys() ● itervalues()

El script for_diccionarios.py

El script for_diccionarios.py

Cadenas de caracteres● Las cadenas de caracteres son estructuras de

datos que contienen caracteres.● Los elementos de una cadena de caracteres

pueden ser indexados.● Los elementos de la cadena no pueden modificarse

mediante el operador "=" ● Los elementos de la cadena no pueden modificarse

mediante del. ● Las cadenas pueden concatenarse y multiplicarse.● Las cadenas pueden ser "rebanadas".● Es posible usar len() para conocer el tamaño de la

cadena.

Cadenas de caracteres

Algunos métodos de las cadenas

● <cadena>.upper() transforma en mayúsculas todos los elementos de la cadena.

● <cadena>.lower() transforma en minúsculas todos los elementos de la cadena.

● <cadena>.capitalize() transforma el primer carácter de una cadena en mayúsculas.

● <cadena>.isdigit() regresa un valor verdadero si la cadena está compuesta sólo por dígitos.

Algunos métodos de las cadenas

El script for_cadena.py

Conjuntos● A diferencia de las estructuras de datos previas, las

colecciones de datos que no se encuentran ordenadas y cuyos elementos no se repiten.

● Este tipo de datos están diseñados para ajustarse a la teoría de conjuntos.

● No son indexables, ni rebanables.● Sólo soportan la función len()● Los conjuntos se crean mediante el comando set()

<nuevo_set> = set(<lista>)

Algunos métodos para conjuntos● <set_1>.issubset(<set_2>) verifica si <set_1> es subconjunto

de <set_2>● <set_1>.issuperset(<set_2>) verifica si <set_2> es

subconjunto de <set_1>● <set_1>.union(<set_2>) regresa la unión entre <set_1> y

<set_2>● <set_1>.intersection(<set_2>) regresa la intersección entre

<set_1> y <set_2>● <set_1>.difference(<set_2>) regresa los elementos que están

en <set_1> pero no en <set_2>● <set_1>.symmetricdifference(<set_2>) regresa los

elementos que están en <set_1> o en <set_2>, pero no en ambos.

● <set>.copy() hace un shallow copy de <set>

Algunos métodos para conjuntos

Algunos métodos para conjuntos

● <set>.add(<elemento>) añade <elemento> a <set>● <set>.remove(<elemento>) elimina <elemento> de

<set>, marca un error en caso de que <elemento> no estuviera contenido en <set>

● <set>.discard(<elemento>) trata de eliminar <elemento> de <set> sin marcar error si no lo encuentra.

● <set>.pop() elimina un elemento arbitrariamente de <set>.

● <set>.clear() elimina todos los elementos de <set>.

Algunos métodos para conjuntos

El ejemplo de animales domésticos

El tipo frozenset

● El tipo frozenset es similar al tipo set, pero su contenido es inmutable.

● Los objetos de tipo frozenset no cuentan con métodos que los modifiquen.

Algunos métodos para frozenset● <frozenset_1>.issubset(<set_2>) verifica si <frozenset_1>

es subconjunto de <set_2>● <frozenset_1>.issuperset(<set_2>) verifica si <set_2> es

subconjunto de <frozenset_1>● <frozenset_1>.union(<set_2>) regresa la unión entre

<frozenset_1> y <set_2>● <frozenset_1>.intersection(<set_2>) regresa la intersección

entre <frozeset_1> y <set_2>● <frozenset_1>.difference(<set_2>) regresa los elementos

que están en <frozenset_1> pero no en <set_2>● <frozenset_1>.symmetricdifference(<set_2>) regresa los

elementos que están en <frozenset_1> o en <set_2>, pero no en ambos.

● <frozenset>.copy() hace un shallow copy de <frozenset>

Algunos ejemplos con frozenset

El operador in

● El operador in se utiliza para evaluar si un objetos está contenido dentro de una estructura. El resultado de este operador es un valor booleano.

El script poliglota.py

El script poliglota.py

FUNCIONES

Definición de funciones

● Las funciones son una serie de argumentos y expresiones que pueden ser invocadas durante la ejecución de un programa.

● Se utiliza la declaración def para crear una función.

● En Python, las funciones también son objetos.

def <nombre_función>(<argumentos>): <código>

Una función básica

● La función más simple que se pude hacer es una que no hace absolutamente nada.

● En este caso utilizaremos la expresión pass.

● Los comentarios contenidos en la primera docstring anidada en la función será identificada como la descripción de ésta al ejecutar help(funcion).

Una función básica

Funciones y flujo de ejecución ● El intérprete de Python sigue un orden lineal al

interpretar el código de un script.● Las funciones pueden ser invocadas sólo una

vez que son definidas.

Argumentos y parámetros en las funciones

● Al definir una función es posible designar "argumentos" cuyos valores podrían ser ingresados al invocar a dicha función.

● A los argumentos se les puede asignar valores iniciales que pueden ser reemplazados al ser invocados. En caso de no asignar un valor, se utilizará el valor inicial.

● A los datos ingresados al invocar una función se les llama "parámetros".

● Deben existir tantos parámetros como argumentos definidos en una función.

El script funcion_con_parametros.py

Ámbito (Scope).

● Cada objeto contiene su propio espacio de nombres.

● Al espacio de nombres de cada entidad se le conoce como "ámbito".

● Esta diferenciación de espacios de nombres evita colisiones entre 2 nombres idénticos en ámbitos distintos.

● El ámbito de una función existe hasta que la función termina de ejecutarse.

Ámbito global y local.● Ámbito global corresponde al espacio de

nombres principal del intérprete de Python.● Ámbito local corresponde al espacio de

nombres relacionado a un objeto.● Al invocar un nombre en una función, el

intérprete hace una búsqueda desde el ámbito local hacia el ámbito global y utiliza la referencia al primer nombre que coincida.

● En caso de no encontrar algún nombre se generará una excepción de tipo NameError indicando que el nombre no está definido.

Ámbito local y global

Las funciones globals() y locals()

● La función globals() regresa un diccionario que contiene a su vez el contenido del espacio de nombres principal.

● La función locals() regresa un diccionario que contiene a su vez el contenido del espacio de nombres de la función en la que se encuentra.

● Si se ejecuta locals() en el ámbito principal, el diccionario resultante será idéntico al de globals().

El script locals_globals.py

El script locals_globals.py

La declaración global

● Si quisiéramos que un nombre dentro de una función sea global podemos utilizar la declaración global.

def <nombre_función>(): global <nombre> <nombre> = <objeto> <código>

El script circulo.py

Funciones con un número arbitrario de parámetros

● En ocasiones se requiere que una función pueda aceptar un número indeterminado de parámetros.

● Existen dos maneras de hacerlo:● Ingresar los parámetros como una tupla.● Ingresar los parámetros como un diccionario.

Funciones que aceptan parámetros como tuplas (args)

● Para indicar al intérprete que la función puede aceptar una tupla en un argumento, se incluye un asterisco "*" como prefijo del argumento.

● Si la función requiere de otros argumentos, éstos deben ser definidos antes de insertar el argumento con parámetros múltiples.

def <nombre_función>(<argumentos_opcionales>, *<args>): <código>

El script promedio.py

El script promedio.py

Funciones que aceptan parámetros como diccionarios (kwargs)

● Para indicar al intérprete que la función puede aceptar un diccionario en un argumento, se incluye un asterisco (**) como prefijo del argumento.

def <nombre_función>(<argumentos_opcionales> **<kwargs>): <código>

El script superficies.py

El script superficies.py

Valores de retorno de las funciones

● Las funciones pueden regresar objetos con la expresión return.

● La expresión return funciona de modo similar a break.

def <nombre_función>(<argumentos>) ... ... <nombre> = <objeto> ... ... return <nombre>

El script calculo.py

MÓDULOS Y PAQUETES

Módulos

● Python cuenta con una gran biblioteca de módulos.

● Los módulos se pueden consultar ejecutando help("modules") en la interfaz interactiva.

● Los módulos pueden contener funciones y valores, clases y objetos.

Métodos de importación (i)

● import <module> carga el módulo seleccionado.

● Para invocar un componente del módulo se ejecuta <modulo>.<componente>

Métodos de importación (ii)

● from <modulo> import <componente> carga el componente seleccionado del módulo.

● El nombre del componente queda almacenado en el ámbito global.

Importación de un módulo

● Al importar un módulo, el intérprete de Python busca en los siguientes directorios en el orden especificado:● La ruta desde la que se ejecuta el script de Python.● Las rutas predefinidas por defecto por el intérprete de

Python.

● Al encontrar el primer módulo con el nombre indicado, el intérprete lo ejecuta de principio a fin.

● El intérprete crea un espacio de nombres propio del módulo el cual relaciona a los objetos creados durante su ejecución.

Archivos .pyc

● Al importar un módulo, Python genera un archivo "compilado" con extensión .pyc

● Los archivos .pyc contienen lo que se conoce como bytecode que optimiza la ejecución del módulo en cuestión.

● Si el módulo ha cambiado, Python genera un nuevo archivo .pyc al ser importado nuevamente.

Empalme en el espacio de nombres al importar

Prevención de empalmes con la expresión as

Recarga de un módulo

● La expresión import sólo se puede utilizar una vez sin tener que cerrar el intérprete/entorno.

● En caso de querer recargar un módulo se utiliza la función reload().

Funciones intrínsecas (built-in functions)

● El intérprete de Python al iniciar importa el módulo __builtin__, el cual contiene las funciones intrínsecas del lenguaje.

● Las funciones intrínsecas no deben confundirse con las "keywords" de Python.

Creación de módulos propios

● Cualquier script de Python que defina clases, objetos, funciones y/o valores es susceptible de ser un módulo en Python.

● En modo interactivo, los módulos deben estar en el directorio desde el que se está ejecutando la interfaz de Python o en las rutas predefinidas por el sistema.

El script cuenta_digitos.py

Ejemplo de un módulo de Python

● El módulo cuenta_digitos define las funciones digito_en_conteo() y programa().

● Además hay una línea al final del módulo que manda a ejecutar a la función programa()

● Al importarse el módulo por primera vez, éste se ejecuta, pero no cuando se importa por segunda vez.

Configuración de rutas

● El módulo sys de Pyhton contiene varias funciones y variables del entorno de ejecución de Python.

● Una de estas variables es el "path" de python, el cual define las rutas dentro del sistema de archivos a los que Python puede recurrir para buscar archivos.

● sys.path es donde se guarda el valor de la ruta como una lista de cadenas de texto.

● Para incluir una ruta de búsqueda es necesario añadirla mediante la instrucción:

sys.path.append(<ruta>)

Ejemplo del uso de un módulo propio

Ejecución de un archivo .py como un script o como un módulo

● Cuando un archivo es cargado como un módulo, la variable interna __name__ adquiere el nombre del módulo.

● Cuando un archivo es cargado como un script, la variable interna __name__ adquiere el nombre "__main__".

● De ese modo, es posible definir si el flujo dentro del archivo se ejecuta o no, dependiendo si es un módulo o un script.

El script cuenta_digitos_mod.py

El script modulo_cuenta_digitos.py

Al ser ejecutado en la línea de comando:

Al ser importado en el entorno interactivo:

Paquetes

● A un grupo de módulos se le llama paquete.● Los paquetes son una estructura de

subdirectorios jerárquicos.● En cada subdirectorio debe haber un archivo

__init__.py el cual puede servir para inicializar los valores de los módulos localizados en dicho subdirectorio.

● Es posible dejar archivos __init__.py vacíos.

Estructura de los paquetes

● En Windows, el paquete mail se localiza en C:\Python27\Lib\email

Estructura de los paquetes

● A su vez, el paquete mail.mime se localiza en C:\Python27\Lib\email\mime

Invocación de módulos dentro de paquetes

Acceso a la introspección de módulos y paquetes

Es posible acceder a la información de un módulo importado o de uno de sus componentes mediante la función help()

help(<modulo>)help(<modulo>.<componente>)

Introspección de módulos y paquetes

Ejemplo del uso de help()

Gestión de proyectos con Ninja-IDE

● Ninja-IDE cuenta con la funcionalidad de crear proyectos, los cuales son una serie de archivos modulares.

● Algunos atajos relativos a los proyectos son:● Ctrl+Shift+N: Crea un nuevo proyecto.● Ctrl+Shift+O: Abre un proyecto.● Ctrl+Shift+S: Guarda un proyecto.● F6: Corre un proyecto.

CASO DE ESTUDIO

Control escolar

Nombre de Pila str

Primer Apellido str

Segundo Apellido str

Semestre int

Promedio float

Al Corriente bool

Una escuela desea realizar el control escolar de sus alumnos con los siguientes campos.

Control escolarPor el momento sólo cuenta con la información de 5 alumnos:

Nombre Primer Apellido

Segundo Apellido

Carrera Semestre Promedio Al Corriente

Eduardo Sánchez Ramos Sistemas 6 7.5 True

Alberto Durán Montellano Derecho 2 6.3 True

Joaquín Ausencio Olvera Actuaría 2 5.2 False

Emiliano Rentería Administración 4 8.7 True

Patricio Ayala Arriaga Sistemas 5 8.0 True

Control escolar

La escuela cuenta con 5 carreras:

Sistemas

Derecho

Actuaría

Arquitectura

Administración

Control Escolar● Hay que crear un sistema que genere una lista de los

alumnos con todos sus datos.● Hay que crear un sistema de altas de nuevos

alumnos.● Hay que validar cada campo:

● Que los semestres sean positivos.● Que el nombre y primer apellido no estén vacíos.● Pedir confirmación en caso de dejar vacío el campo de

segundo apellido.● Que las carreras sean las indicadas.● Que el promedio sea mayor o igual que 0 y menor o igual a

10.● Que cada dato corresponda a su tipo.

Módulo datos.py

Módulo valida.py

Módulo listado.py

Módulo altas.py

__init__.py

Trabajo a realizar

● El código contiene pocos comentarios.● Analice y realice comentarios al código.

Acceso al código● Puede descargar todo el código de este curso, incluyendo

el subdirectorio caso desde:

https://docs.google.com/file/d/0B-tF2kZLbAXPN0dZX1ZHTUJqUkE/edit?usp=sharing

● El código del caso de uso se encuentra en el subdirectorio caso.

● El contenido puede ser abierto en el directorio como un proyecto de NINJA-IDE.

● También pueden modificar sys.path indicando la dirección donde se encuentre e importando el directorio como un módulo:

import syssys.path.append("<ruta>")import caso

ESCRITURA/LECTURA DE ARCHIVOS

Gestión de archivos de texto

● Los archivos en Python pertenecen al tipo file.● Para crear un objeto de tipo file se utiliza la

función open().

<archivo> = open(<nombre_archivo>, <modo>)

Modos de acceder a archivos

● "r" es el modo de lectura.● "w" es un modo de escritura. En caso de existir

un archivo, éste es sobreescrito.● "a" es un modo de escritura. En caso de existir

un archivo, comienza a escribir al final de éste.● "b" permite escritura en modo binario.● "U" define saltos de línea universales para el

modo de lectura.● Se utiliza el signo de "+" para combinar modos.

Algunos métodos para archivos

● <file>.read() lee el archivo completo.● <file>.readline() lee una línea del archivo.● <file>.readlines() regresa una lista de todas las líneas

del archivo.● <file>.write(<cadena>) escribe una <cadena> en el

archivo.● <file>.tell() regresa la posición del puntero en el archivo.● <file>.seek(<rango>, <posición>) mueve el puntero.● <file>.close() cierra el archivo.

Escritura/lectura de archivos.

El archivo texto.txt

La expresión with

● Es posible crear un proceso "sanitizado" con with.

● Lo anterior permite a ciertos objetos como los de tipo file un comportamiento muy similar a utilizar finally.

● En este caso, incluso cuando ocurra una excepción, el archivo se cerrará automáticamente, evitando posible corrupción de los archivos.

with open( <archivo>, <modo>) as <nombre>:

Revisitando el caso de uso

● A partir del caso de uso estudiado con anticipación se leerán y escribirán los datos de los alumnos en el archivo:● datos.txt

● Se modificarán los módulos:● __init__.py● datos.py● listado.py

datos.txt

datos.py

__init__.py

listado.py

Open Intelligence® http://openintelligence.mxinfo@openintelligence.mx

+52(55) 3548-1400

Algunos derechos reservados. Esta obra puede ser modificada, redistribuida y comercializada bajo los términos de la licencia Atribución 2.5 México (CC BY 2.5) http://creativecommons.org/licenses/by/2.5/mx/