Está en la página 1de 662

¿Por qué programar?

Capítulo 1

Python para Todos


es.py4e.com
Las computadoras quieren ser útiles...
• Las computadoras se construyen con un
solo propósito: hacer las cosas por ¿Qué
nosotros sigue?

• Pero, necesitamos hablar su idioma para


describirles qué queremos que realicen

• Para los usuarios es una tarea sencilla.


¿Qué ¿Qué ¿Qué
Otra persona ya ingresó distintos sigue? sigue? sigue?
programas (instrucciones) en la
computadora y los usuarios solo tienen ¿Qué ¿Qué ¿Qué
que elegir los que desean usar sigue? sigue? sigue?
Los programadores anticipan
necesidades
• Las aplicaciones para iPhone son un mercado

• Las aplicaciones para iPhone tienen más de


3,000 millones de descargas

• Los programadores han dejado sus trabajos


para convertirse en desarrolladores de tiempo ¡Elíjame! Elíjame! ¡Elíjame!
completo de iPhone

• Los programadores conocen el ¡Elíjame! Elíjame! ¡Págueme!


funcionamiento del programa
Usuarios vs. Programadores
• Los usuarios ven a las computadoras como un conjunto de herramientas:
procesador de texto, hoja de cálculo, mapa, listado de cosas para hacer, etc.

• Los programadores aprenden sobre el “funcionamiento” de la computadora


y su lenguaje

• Los programadores tienen algunas herramientas que los ayudan a construir


nuevas herramientas

• A veces, los programadores escriben herramientas para muchos usuarios y,


en ocasiones, escriben pequeños “asistentes” para poder automatizar una
tarea
¿Por qué ser un programador?
• Para que una tarea se realice – como usuario y programador

– Limpiar los datos de relevamiento

• Para producir algo que otros utilizarán – trabajo de programación

– Resolver un problema de rendimiento en el software Sakai

– Agregar un registro de visitas en un sitio web


Usuario

Computadora
Programador
Hardware + Software

Datos Información .... Redes


Desde el punto de vista del creador del software, nosotros construimos el software. Los
usuarios finales (partes interesadas/actores) son nuestros maestros. Queremos
complacerlos porque, con frecuencia, nos pagan si están conformes con el trabajo. Sin
embargo, los datos, la información y las redes son un problema que tenemos que
resolver nosotros por ellos. El hardware y el software son nuestros amigos, y nuestros
aliados, en esta misión.
¿Qué es un código? ¿Un Software? ¿Y
un Programa?
• Una secuencia de instrucciones guardadas

– Es una pequeña parte de nuestra inteligencia en la computadora

– Resolvemos algo, lo codificamos y se lo damos a otro para que ahorre


tiempo y energía tratando de resolverlo

• Una obra de arte creativo, en especial cuando hacemos un buen trabajo con la
experiencia del usuario
Programas para Humanos...

https://www.youtube.com/watch?v=gwWRjvwlLKg
Programas para Humanos...
Mientras suena la música:
Mano izquierda hacia adelante
Mazo derecha hacia adelante
Mano izquierda hacia atrás
Mano derecha hacia atrás
Mano izquierda a hombro derecho
Mano derecha a hombro izquierdo
Mano izquierda a la nuca
Manta derecha a la nuca
Mano izquierda a caldera derecha
Mano derecha a caldera izquierda
Mano izquierda a nalgas izquierdas
Mano derecha a nalgas derechas
Meneo
Meneo
Salto https://www.youtube.com/watch?v=gwWRjvwlLKg
Programas para Humanos...
Mientras suena la música:
Mano izquierda hacia adelante
Mazo derecha hacia adelante
Mano izquierda hacia atrás
Mano derecha hacia atrás
Mano izquierda a hombro derecho
Mano derecha a hombro izquierdo
Mano izquierda a la nuca
Manta derecha a la nuca
Mano izquierda a caldera derecha
Mano derecha a caldera izquierda
Mano izquierda a nalgas izquierdas
Mano derecha a nalgas derechas
Meneo
Meneo
Salto https://www.youtube.com/watch?v=gwWRjvwlLKg
Programas para Humanos...
Mientras suena la música:
Mano izquierda hacia adelante
Mazo derecha hacia adelante
Mano izquierda hacia atrás
Mano derecha hacia atrás
Mano izquierda a hombro derecho
Mano derecha a hombro izquierdo
Mano izquierda a la nuca
Mano derecha a la nuca
Mano izquierda a cadera derecha
Mano derecha a cadera izquierda
Mano izquierda a nalgas izquierdas
Mano derecha a nalgas derechas
Meneo
Meneo
Salto https://www.youtube.com/watch?v=gwWRjvwlLKg
Programas para Python...

El payaso persiguió al auto y el auto chocó contra la carpa y


la carpa cayó sobre el payaso y el auto

Imagen: https://www.flickr.com/photos/allan_harris/4908070612/ Attribution-NoDerivs 2.0 Generic (CC BY-ND 2.0)


name = input('Ingresar archivo:')
handle = open(name)

conteos = dict()
for línea in handle:
python words.py
palabras = line.split() Ingresar archivo:
for palabra in palabras: words.txt hasta 16
conteos[palabra] =
counts.get(palabra,0) + 1

bigcount = Ninguno
bigword = Ninguna
for palabra,conteo in counts.items(): python words.py
if bigcount is Ninguno or conteo > Ingresar archivo:
bigcount: clown.txt el 7
bigword = word
bigcount = count

print(bigword, bigcount)
Arquitectura del Hardware
http://upload.wikimedia.org/wikipedia/commons/3/3d/RaspberryPi.jpg
Computadora
Software ¿Qué
sigue? genérica
Dispositivos
de Entrada CPU
y Salida
Memoria
Secundaria

Memoria
Principal
Definiciones
• Unidad de procesamiento central (CPU): Ejecuta el programa
– La CPU siempre se está preguntando “qué es lo próximo ¿Qué
que tengo que hacer. ” No así el cerebro, muy silencioso pero, sigue?
al mismo tiempo, muy rápido

• Dispositivos de Entrada: Teclado, mouse, pantalla táctil

• Dispositivos de Salida: Monitor, parlantes, impresora, grabadora de DVD

• Memoria Principal: Almacenamiento pequeño y temporario pero rápido –que se


pierde al reiniciar– se la conoce como RAM

• Memoria Secundaria: Almacenamiento permanente y grande pero más lento – la


información permanece hasta que se la elimina– unidad de disco, tarjeta de
memoria
Computadora
Software ¿Qué
sigue? genérica
Dispositivos
de Entrada CPU
y Salida
Memoria
if x< 3: Secundaria
imprimir

Memoria
Principal
Computadora
Software ¿Qué
sigue? genérica
Dispositivos
de Entrada CPU
y Salida
01001001 Memoria
00111001 Secundaria

Memoria
Principal Lenguaje
de la
máquina
CPU muy caliente
¿Qué
sigue?

http://www.youtube.com/watch?v=y39D4529FM4
Disco duro en acción

http://www.youtube.com/watch?v=9eMWG3fwiEU
Python como Lenguaje
La Lengua Pársel es la lengua de las
serpientes y de aquellos que pueden
hablar con ellas. Un individuo que puede
hablar Pársel es conocido como hablante
de Pársel. Es una habilidad muy poco
común y puede ser hereditaria. Casi todos
los hablantes de Pársel conocidos son
descendentes de Salazar Slytherin.

http://harrypotter.wikia.com/wiki/Parseltongue
Python es el lenguaje del intérprete del software
Python y de quienes pueden hablar con él. Un
individuo que puede hablar Python es conocido
como Pythonista. Es una habilidad muy poco
común y puede ser hereditaria. Casi todos los
Pythonistas utilizan el software inicialmente
desarrollado por Guido van Rossum.
Características
• Lenguaje interpretado

• Tipado dinámico

• Fuertemente tipado

• Multiplataforma

• Orientado a objetos
Historia de los lenguajes de programación
Inicios...
Charles Babbage
(1791 – 1871)

Ada Lovelace
(1815 – 1852)
Grace Murray Hopper

1906 - 1992
Inventó el primer compilador (A0)
para el UNIVAC 1 en 1951

Popularizó la idea de lenguajes


independientes de la máquina
El primer bug
Se encontró una
rana atrapada en
una válvula del
Mark 2
Primeros ordenadores
• 1943 Colossus Mark 1,2,3
• 1946 ENIAC
• Primer Turing completo
• 1960 Circuito integrado
• 1971 Microprocesador
• 1981 IBM PC
Turing completo
Un ordenador es “turing completo” si tiene un poder computacional
equivalente a la máquina universal de Turing
Si tuviese memoria infinita
Si tuviese almacenamiento infinito

Tesis Church-Turing: Todo algoritmo puede ser descrito mediante una


máquina universal de Turing.

Es el inicio de los ordenadores programables (arquitectura de Von


Neumann)
Lenguajes “padre”
1. Fortran (1957) Algol, BASIC
2. ALGOL(1958) Pascal, Modula 2, Simula
3. LISP (1958) Clojure, Scheme
4. COBOL (1959)
5. Simula (1962, 67) Smalltalk, C++
6. CPL (1963)  C, C++, Java, C#, ObjectiveC
70’s segunda generación
• Pascal (1970)
• C (1972)
• Prolog (1972)
• ML (1973)
• Scheme (1975)
• SQL (1978)
80’s – Imperativos al poder
Se mejoran y combinan los paradigmas
inventados en las décadas 60-70.
• C++ (1980)
• MATLAB (1984)
• Eiffel (1985)
• Erlang (1986)
• Perl (1987)
90’s – Auge funcional
• Haskell (1990)
• Python (1991)
• Ruby (1993)
• CLOS (1994)
• Java (1995)
• JavaScript (1995)
• C# (2000)
Actualidad...
Mezca de paradigmas, metaprogramación,
programación distribuída...
• F# (2002)
• Groovy, Scala (2003)
• Clojure (2007)
• Dart (2011)
• Swift (2014)
Vista aérea de lenguajes de desarrollo
Una clasificación de lenguajes...

Tipado
Con / Sin tipos
Estáticos / Dinámicos
Fuerte / Débil
Nominal / Duck
Typing / Structural
Typing
Según paradigma
Imperativos secuenciales
El código se ejecuta en el orden en que está
escrito
Control de flujo muy reducido (salta x líneas, salta a la
línea x)
No hay encapsulación de ningún tipo (todas las
variables globales)

Ejemplo: Ensamblador
Imperativos estructurados
Basados en los secuenciales añaden secuencias
básicas de estructura:
Secuencias
Bucles (for, while, loop)
Condicionales (if/switch)

No hay encapsulación de ningún tipo

Ejemplo: Basic
Imperativos procedurales
Código es básicamente un conjunto de procedimientos
(funciones).
Un procedimiento concreto es el “inicial”
El programa consiste en una secuencia de llamadas a
procedimientos
Encapsulación de estado de procedimiento (variables
locales)

Ejemplo: C, Pascal
Imperativos orientados a objetos
Código consiste en un conjunto de objetos que colaboran entre ellos.
Objeto consiste en identidad, estado y funcionalidad
Encapsulación a nivel de objeto (estado)

Basados en clases (Smalltalk, Java, C#, C++, Ruby)


Usan clases para definir la funcionalidad y posibles valores de los estados de
los objetos
Basados en objetos (JavaScript)
Se definen objetos y se especifica su funcionalidad y estado ad-hoc para
cada objeto

Todos ellos soportan las características “básicas” de la OOP


(herencia, polimorfismo, ...)
Declarativos lógicos
Lenguajes basados en la lógica formal
Programa es un conjunto de sentencias en lógica
formal indicando hechos y reglas sobre un
determinado problema

Ejemplo: Prolog
Declarativos funcionales
Código basado en funciones entendiendo por
función el concepto matemático de ella: sin cambios
de estado, inmutabilidad, sin efectos colaterales
(función “pura”)
Muy basados en recursión y en tratamiento de
listas (influencia matemática)

Ejemplos: Scala, F#, LISP, Scheme, Haskell


Según tipado
Tipado estático vs dinámico
En tipado estático...
1. El tipo de una variable es fijo e inmutable
2. El tipo de una variable es conocido en algun momento antes de
usarse

En tipado dinámico...
1. El tipo de una variable es mutable
2. El tipo de una variable no tiene por que ser declarado ni conocido
de antemano
Tipado fuerte vs tipado débil
No hay definición clara sobre lo que es tipado fuerte y tipado débil.

En general decimos que un lenguaje tiene tipado débil si las reglas sobre lo
que se puede hacer con los tipos no son estrictas. Variables de distintos tipos
pueden ser mezcladas en distintas operaciones. En caso contrario decimos
que el lenguaje tiene un tipado fuerte.

Pero muchos lenguajes ofrecen comportamientos mixtos.

No debe confundirse nunca con lenguajes dinámicos o estáticos


Primera clasificación...
Tipado estático Tipado dinámico
Tipado fuerte Scala, Haskell, Java, C++, Java, C# Ruby
Tipado débil Objective-C, Visual Basic (variant) JavaScipt

Algunos lenguajes con tipado estático fuerte ofrecen características de


tipado estático débil (C# con conversiones de tipo, C/C++ con punteros
void, ...)
Algunos lenguajes con tipado estático ofrecen características de tipado
dinámico (C# con dynamic, Objective-C con id, Swift con Any, ...).
Duck typing
Paradigma típico de algunos lenguajes en el que la presencia de
determinados métodos y propiedades en un objeto determina su
validez semántica, en lugar de la relación de herencia que pueda tener
con otros objetos.

Se resume en la frase: “Si camina como un pato y grazna como un


pato, entonces es un pato”.

Muy común en lenguajes dinámicos


Structural typing
Sistema de tipos estático en el que la presencia de determinados
métodos y propiedades en una clase determina su validez semántica.
Dos tipos se consideran “iguales” si tienen las mismas propiedades y
métodos con independencia de donde se declaran.

Viene a ser el “equivalente” al Duck Typing para lenguajes con tipado


estático.

Ejemplo: C++ a través de templates, Ocaml, Scala


Aprendizaje Inicial: Errores de
Sintaxis
• Necesitamos aprender el lenguaje Python para poder comunicar nuestras
instrucciones a Python. Al principio, cometeremos muchos errores y hablaremos
mal como ocurre con los niños pequeños.

• Cuando usted comete un error, la computadora no cree que usted es “tierno”. Le


dice que hay “error de sintaxis” (syntax error) porque ella conoce el lenguaje pero
usted recién lo está aprendiendo. Da la sensación de que Python es cruel y
carece de sentimientos.

• Sin embargo, recuerde que usted es inteligente y puede aprender. La


computadora es simple y muy veloz pero es incapaz de aprender. Entonces, es
más sencillo para usted aprender Python que para la computadora aprender
español...
Hablemos con Python
csev$ python3
Python 3.5.1 (v3.5.1:37a07cee5969, Dic 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] en darwin. Escriba
"ayuda ", "derechos de autor ", "créditos " o "licencia " si
desea más información.
>>> ¿Qué
sigue?
csev$ python3
Python 3.5.1 (v3.5.1:37a07cee5969, Dic 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] en darwin. Escriba
"ayuda ", "derechos de autor ", "créditos " o "licencia " si
desea más información.
>>> x = 1
>>> print (x)
1 Esta es una buena prueba para asegurarse de
>>> x = x + 1 que ha instalado Python correctamente.
>>> print (x) Observe que quit() también sirve para terminar
2 una sesión interactiva.
>>> exit()
¿Qué decimos?
Elementos de Python
• Vocabulario / Palabras – variables y palabras reservadas (capítulo
2)

• Estructura de la sentencia – patrones de sintaxis válidos (capítulos


3-5)

• Estructura de la historia – construir un programa para un


determinado propósito
name = input('Ingresar archivo:')
handle = open(nombre)
Una “historia” breve
conteos = dict() sobre cómo contar
for línea in handle:
palabras = line.split() palabras en un
for palabra in palabras: archivo realizado en
conteos [palabra] =
counts.get(palabra,0) + 1 Python
bigcount = Ninguno python words.py
bigword = Ninguna
for palabra, conteo en counts.items():
Ingresar archivo: words.txt
if bigcount is Ninguno or conteo > hasta 16
bigcount:
bigword = palabra
bigcount = conteo

print(bigword, bigcount)
Palabras Reservadas
• No puede utilizar las palabras reservadas como nombres o
identificadores de variables
False class return is finally
None if for lambda continue
True def from while nonlocal
and del global not with
as elif try or yield
assert else import pass
break except in raise
Sentencias o Líneas
x = 2 Enunciado de asignación
x = x + 2 Asignación con expresión
print(x) Función print (imprimir)

Variable Operador Constante Función


Programación de Párrafos
Scripts de Python
• Interactive Python (Python interactivo) es bueno para los
experimentos y programas de 3-4 líneas de largo.

• La mayoría de los programas son mucho más largos, entonces los


escribimos en un archivo y le decimos a Python que ejecute los
comandos en el archivo.

• De algún modo, le estamos “dando un script (guión) a Python”.

• Como convención, agregamos “.py” como sufijo al final de estos


archivos para indicar que contienen Python.
Interactivo versus Script
• Interactivo
– Usted escribe directamente en Python de a una línea por vez y el
programa responde

• Script
– Usted ingresa una secuencia de enunciados (líneas) en un archivo
utilizando un editor de texto y le dice a Python que ejecute los
enunciados en el archivo
Pasos del Programa o Flujo del
Programa
• Al igual que una receta o las instrucciones de instalación, un
programa es una secuencia de pasos que se deben dar en
orden.

• Algunos pasos son condicionales, es decir, pueden saltearse.


• A veces un paso o un grupo de pasos debe repetirse.
• A veces, almacenamos un conjunto de pasos para utilizar una y
otra vez tal como sea necesario en distintos lugares durante el
programa (Capítulo 4).
Pasos Secuenciales
x=2 Programa:
Resultado:
print(x) x = 2
print(x) 2
x=x+2 x = x + 2 4
print(x)
print(x)
Cuando se está ejecutando un programa, fluye de un paso al
otro. Como programadores, configuramos los “paths”
(caminos) que el programa debe seguir.
x=5 Pasos
x < 10 ?
Sí Condicionales
No
Programa:
print('Más
pequeño') Resultado:
x = 5
if x < 10:
Sí print('Más Más pequeño
x > 20 ? pequeño') Finis
if x > 20:
No print('Más
print('Más grande')
grande')

print('Finis')
print('Finis')
n=5 Pasos Repetidos
No Sí Resultado:
n>0? Programa:
5
print(n) n = 5 4
while n > 0 :
print(n)
3
n = n -1 n = n – 1 2
print(‘Blastoff') 1
¡Blastoff!

print('Blastoff') Los bucles (pasos repetidos) tienen variables de iteración


que cambian cada vez a través del bucle.
Introducción – Parte 4 PYTHON PARA TODOS
name = input('Ingresar archivo:')
handle = open(nombre)
Secuencial
conteos = dict() Repetido
for línea in handle:
palabras = line.split() Condicional
for palabra in palabras:
conteos[palabra] =
counts.get(palabra,0) + 1

bigcount = Ninguno
bigword = Ninguna
for palabra, conteo in counts.items():
if bigcount is Ninguno or conteo >
bigcount:
bigword = palabra
bigcount = conteo

print(bigword, bigcount)
Una breve “historia” de
name = input('Ingresar archivo:')
handle = open(nombre, 'r') Python sobre cómo
contar palabras en un
conteos = dict() archivo
for línea in handle:
palabras = line.split()
for palabra in palabras: Palabra utilizada para
conteos[palabra] = counts.get(palabra,0) + 1 leer datos de un
usuario
bigcount = Ninguno
bigword = Ninguna
for palabra, conteo in counts.items(): Una sentencia sobre la
if bigcount is Ninguno or conteo > bigcount: actualización de uno de
bigword = palabra los muchos conteos
bigcount = conteo
Un párrafo sobre cómo
print(bigword, bigcount)
encontrar el ítem más
largo en un listado
Variables, Expresiones
y Enunciados
Capítulo 2

Python para Todos


es.py4e.com
Constantes
• Los valores fijos como los números, letras y cadenas reciben el
nombre de “constantes” porque su valor no cambia
• Las constantes numéricas son las que usted espera
• Las constantes de la cadena son comillas simples (') o dobles (")
>>> print(123)
123
>>> print(98.6)
98.6
>>> print('Hola mundo')
Hola mundo
Palabras Reservadas
• No puede utilizar las palabras reservadas como nombres o
identificadores de variables
False class return is finally
None if for lambda continue
True def from while nonlocal
and del global not with
as elif try or yield
assert else import pass
break except in raise
Variables
• Una variable es un lugar designado en la memoria donde el programador
puede guardar los datos y luego recuperar esos datos utilizando el “nombre”
de la variable

• Los programadores elijen los nombres de las variables

• Usted puede cambiar el contenido de una variable en un enunciado


posterior
x = 12.2 x 12.2
y = 14
y 14
Variables
• Una variable es un lugar designado en la memoria donde el programador
puede guardar los datos y luego recuperar esos datos utilizando el “nombre”
de la variable

• Los programadores elijen los nombres de las variables

• Usted puede cambiar el contenido de una variable en un enunciado


posterior
x = 12.2 x 12.2 100
y = 14
x = 100 y 14
Reglas para el Nombre de
Variables en Python
Debe comenzar con una letra o guión bajo_
Debe constar de letras, números y guión bajo
Es sensible a la mayúscula y minúscula

Bien: spam eggs spam23 _speed


Mal: 23spam #sign var.12
Diferente: spam Spam SPAM
Sentencias o Líneas
x = 2 Enunciado de asignación
x = x + 2 Enunciado con expresión
print(x) Enunciado print (impresión)

Variable Operador Constante Función


Nombres de Variables
Nemotécnicas
• Como nosotros, los programadores, tenemos la libertad de elegir
los nombres de las variables, nos focalizamos en “las mejores
prácticas”
• Nombramos a las variables de un modo que nos permita recordar
qué nos proponemos guardar en ellas (“nemotécnica” = “ayuda
memoria”)
• Esto puede confundir a los alumnos que se inician porque las
variables nombradas correctamente a veces “suenan” tan bien
que parecen palabras clave
http://en.wikipedia.org/wiki/Mnemonic
x1q3z9ocd = 35.0
x1q3z9afd = 12.50
x1q3p9afd = x1q3z9ocd * x1q3z9afd
print(x1q3p9afd)

¿Qué está
haciendo este
código?
x1q3z9ocd = 35.0 a = 35.0
x1q3z9afd = 12.50 b = 12.50
x1q3p9afd = x1q3z9ocd * x1q3z9afd c = a * b
print(x1q3p9afd) print(c)

¿Qué están
haciendo estos
códigos?
x1q3z9ocd = 35.0 a = 35.0
x1q3z9afd = 12.50 b = 12.50
x1q3p9afd = x1q3z9ocd * x1q3z9afd c = a * b
print(x1q3p9afd) print(c)

¿Qué están Horas = 35.0


haciendo estos Tarifa = 12.50
códigos? Salario = horas * tarifa
print(salario)
Enunciados de Asignación
Asignamos un valor a una variable utilizando el enunciado de
asignación (=)

Un enunciado de asignación consta de una expresión en el lado


derecho y una variable para almacenar el resultado

x = 3.9 * x * ( 1 - x )
Una variable es un lugar de la
memoria que se utiliza para
guardar un valor (0.6) x 0.6

0.6 0.6
x = 3.9 * x * ( 1 - x )

0.4
El lado derecho es una expresión. Una
vez evaluada la expresión, el resultado
0.936
se coloca en (se asigna a) x.
Una variable es un lugar de la memoria
que se utiliza para para almacenar un
valor. El valor almacenado en una x 0.6 0.936
variable puede actualizarse
reemplazando el valor anterior (0.6) con
uno nuevo (0.936).
0.6 0.6
x = 3.9 * x * ( 1 - x )

0.4
El lado derecho es una expresión. Una
vez evaluada la expresión, el resultado se
coloca en (se asigna a) la variable que
0.936
está a la izquierda (es decir, x).
Expresiones
Expresiones Numéricas
• Dada la falta de símbolos matemáticos Operador Operación
en los teclados de la computadora,
utilizamos el “lenguaje de la + Suma
computadora” para expresar las - Resta
operaciones matemáticas clásicas
* Multiplicación
• El asterisco es la multiplicación / División

• La potenciación (elevar a la potencia) ** Potencia


tiene un aspecto diferente que en % Resto
matemáticas
Expresiones Numéricas
>>> jj = 23
>>> xx = 2
>>> kk = jj % 5 Operador Operación
>>> xx = xx + 2
>>> print(kk)
>>> print(xx) + Suma
3
4
>>> print(4 ** 3) - Resta
>>> yy = 440 * 12
64
>>> print(yy) * Multiplicación
5280
>>> zz = yy / 1000
4R3 / División

>>> print(zz) 5 23 ** Potencia


5.28 20 % Resto

3
Orden de Evaluación
• Cuando introducimos una cadena de operadores,
Python debe saber cuál tiene que hacer primero

• Esto recibe el nombre de “precedencia del operador”

• Ahora, ¿qué operador “tiene precedencia” sobre los otros?

x = 1 + 2 * 3 - 4 / 5 ** 6
Reglas de Precedencia del
Operador
De la regla de precedencia más alta a la regla de precedencia más baja:
Paréntesis
– Siempre se respetan los paréntesis
Potencia
– Potenciación (elevar a la potencia) Multiplicación
Suma
– Multiplicación, división, resto Izquierda a
derecha
– Suma y resta

– Izquierda a derecha
1 + 2 ** 3 / 4 * 5
>>> x = 1 + 2 ** 3 / 4 * 5
>>> print(x)
11.0 1 + 8 / 4 * 5
>>>
1 + 2 * 5
Paréntesis
Potencia
Multiplicación
1 + 10
Suma
Izquierda a
derecha 11
Precedencia del Operador
Paréntesis
Potencia
• Recuerde las reglas de arriba hacia abajo Multiplicación
Suma
• Cuando escribe un código, utilice paréntesis Izquierda a
derecha
• Cuando escribe un código, use las expresiones matemáticas más
simples que le sea posible para que sean fáciles de entender

• Divida las series de operaciones matemáticas largas para que sean


más claras
¿Qué Significa “Type” (Tipo)?
• En Python, las variables, literales y
constantes tienen un “type” (tipo) >>> ddd = 1 + 4
>>> print(ddd)
• Python sabe la diferencia entre un 5
número entero y una cadena >>> eee = 'hola ' + 'a
todos'
>>> print(eee)
• Por ejemplo “+” significa “suma” si se
Hola a todos
trata de número y “concatenación” si
se trata de una cadena

concatenación = unión
El “Type” (Tipo) Importa
• Python sabe cual es el “type” >>> eee = 'hola ' + 'a todos'
de todo >>> eee = eee + 1
Trazas de rastreo (llamada más
reciente a lo último): Archivo
• Algunas operaciones están "<stdin>", línea 1, in
prohibidas <module>TypeError: Can't convert
'int' object to str implicitly
• No se puede “agregar 1” a una >>> type(eee)
<class'str'>
cadena >>> type('hola')
<class'str'>
• Podemos preguntarle a Python >>> type(1)
de qué tipo se trata con la <class'int'>
>>>
función type()
Diferentes Types (Tipos) de
Número >>> xx = 1
• Los números tienen dos types (tipos)
>>> type (xx)
– Enteros (int): <class 'int'>
>>> temp = 98.6
-14, -2, 0, 1, 100, 401233
>>> type(temp)
– Números con punto flotante (float), <class'float'>
que tienen decimales: -2.5 , 0.0, >>> type(1)
<class 'int'>
98.6, 14.0
>>> type(1.0)
• Hay otros tipos de números: son <class'float'>
>>>
variantes entre los números decimales
y los números enteros
Conversiones de Type (Tipo)
• Cuando introduce un número >>> print(float(99) + 100)
entero y un decimal en una 199.0
expresión, el entero (int) se >>> i = 42
convierte implícitamente en >>> type(i)
uno decimal (float) <class'int'>
>>> f = float(i)
• Puede controlar esto con las >>> print(f)
42.0
funciones incorporadas int() y
>>> type(f)
float()
<class'float'>
>>>
División de Números Enteros
>>> print(10 / 2)
• La división de números 5.0
>>> print(9 / 2)
enteros arroja un
4.5
resultado con punto >>> print(99 / 100)
flotante 0.99
>>> print(10.0 / 2.0)
5.0
>>> print(99.0 / 100.0)
0.99
La división de enteros era diferente en
Python 2.x
>>> sval = '123'

Conversiones >>> type(sval)


<class 'str'>
>>> print(sval + 1)

de Cadenas Trazas de rastreo (llamada más


reciente a lo último): Archivo
"<stdin>", línea 1, in <module>
• Puede también utilizar int() y TypeError: Can't convert 'int' object
to str implicitly
float() para realizar >>> ival = int(sval)
conversiones entre cadenas y >>> type(ival)
enteros <class 'int'>
>>> print(ival + 1)

• Obtendrá un error si la 124


>>> nsv = 'hola bob'
cadena no contiene >>> niv = int(nsv)
Trazas de rastreo (llamada más
caracteres numéricos reciente a lo último): Archivo
"<stdin>", línea 1, in <module>
ValueError: invalid literal for int()
with base 10: 'x'
Input (Entrada) del Usuario
• Podemos instruirle a
Python que haga una nam = input('Quién es usted')
pausa y lea los datos del print('Bienvenido', nam)
usuario con la función
input() Quién es usted
• La función input() regresa Chuck
a la cadena Bienvenido Chuck
Crear un Programa
Comentarios en Python
• Todo lo que aparezca luego de # es ignorado por Python

• ¿Por qué usar comentarios?

– Permiten describir lo que está pasando en la secuencia de un


código

– Permiten documentar quién escribió el código o la información


auxiliar

– Permiten desactivar la línea de un código, quizás de manera


temporaria
# Obtener el nombre del archivo y abrirlo
name = input('Ingresar archivo:')
handle = open(nombre, 'r')

# Frecuencia de la palabra count


conteos = dict()
for línea in handle:
palabras = line.split()
for palabra in palabras:
conteos[palabra] = counts.get(palabra,0) + 1

# Encontrar la palabra más común


bigcount = Ninguno
bigword = Ninguna
for palabra, conteo in counts.items():
if bigcount is ninguno or conteo > bigcount:
bigword = palabra
bigcount = conteo

# Todo terminado
print(bigword, bigcount)
Convertir Input
(Entrada) del Usuario
• Si queremos leer un
número del usuario,
# Convertir pisos del elevador
debemos convertirlo de una inp = input('Piso europeo')
cadena a un número usf = int(inp) + 1
print('piso de EUA', usf)
utilizando la función type
conversion (conversión de
tipo)
Piso europeo 0
• Luego, analizaremos cómo Piso de EUA 1
manejar datos de entrada
incorrectos
Síntesis
• Type (tipo) • División de números enteros

• Palabras reservadas • Conversión de Types (tipos)

• Variables (nemotécnicas) • Input (entrada) del usuario

• Operadores • Comentarios (#)

• Precedencia del operador


Ejercicio

Escriba un programa para recordarle al usuario


las horas y la tarifa por hora para calcular el
salario bruto.

Ingresar Horas: 35
Ingresar Tarifa: 2.75

Salario: 96.25
Agradecimientos / Colaboraciones
Estas diapositivas están protegidas por derechos de autor 2010- ...
Charles R. Severance (www.dr-chuck.com) de la Facultad de
Información de la Universidad de Michigan, y se ponen a
disposición bajo licencia de Creative Commons Attribution 4.0.
Por favor, conserve esta última diapositiva en todas las copias
del documento para cumplir con los requisitos de atribución de la
licencia. Si realiza algún cambio, siéntase libre de agregar su
nombre y el de su organización a la lista de colaboradores en
esta página cuando republique los materiales.

Desarrollo inicial: Charles Severance, Facultad de Información


de la Universidad de Michigan
… Ingrese nuevos colaboradores y traductores aquí
Ejecución Condicional
Capítulo 3

Python para Todos


es.py4e.com
x=5
Pasos Condicionales

x < 10 ?
Programa:
print('Más
pequeño') Resultado:
x = 5
if x < 10:
print('Más Más pequeño
x > 20 ? Pequeño') Finis
if x > 20:
No print('Más Grande') print('Más
Grande')

print('Finis')
print('Finis')
Operadores de Comparación
• Las expresiones booleanas formulan
una pregunta y generan un resultado
Yes (afirmativo) o No (negativo) que Python Significado
utilizamos para controlar el flujo del < Menor que
programa
<= Menor que o Igual a
• Las expresiones booleanas utilizan == Igual a
operadores de comparación para >= Mayor que o igual a
evaluar si es True (Verdadero) /
> Mayor que
False (Falso) o Yes (Sí) / No
!= No igual a
• Los operadores de comparación
observan las variables pero no las Recuerde: “=” se usa para asignación.
modifican
http://en.wikipedia.org/wiki/George_Boole
Operadores de Comparación
x = 5
if x == 5 :
print('Igual a 5') Igual a 5
if x > 4 :
Mayor que 4
print('Mayor que 4')
if x >= 5 : Mayor que o Igual a 5
print('Mayor que o Igual a 5')
if x < 6 : print('Menor que 6') Menor que 6
if x <= 5 :
print('Menor que o Igual a 5') Menor que o Igual a 5
if x != 6 :
print('No igual a 6') No igual a 6
x =5
Decisiones Unidireccionales
print('Antes de 5') Sí
if x == 5 : x == 5 ?
print('Es 5') Antes de 5
print('Sigue Siendo Es 5
No print(‘Es 5’)
5') Sigue siendo 5
print('Tercer 5') Tercer 5 print('Sigue
print('Después de 5') Después de 5 siendo 5')
print('Antes de 6')
Antes de 6
if x == 6 : print('Tercer 5')
print('Es 6')
Después de 6
print('Sigue siendo
6')
print('Tercer 6')
print('Después de 6')
Indentación
• Aumentar la indentación sirve para indentar luego de un enunciado if o for
(después: )

• Mantener la indentación sirve para indicar el alcance del bloque (qué


líneas son afectadas por if/for)

• Reducir la indentación permite regresarla al nivel del enunciado if o for


para indicar el final del bloque

• Las líneas en blanco son ignoradas y no afectan la indentación

• Los comentarios en una línea en sí mismos se ignoran en lo que respecta


a la indentación
Advertencia: ¡Deshabilite las Tabulaciones!

Atom automáticamente usa los espacios para los archivos con la extensión ".py" (¡genial!)

• La mayoría de los editores de texto pueden convertir las tabulaciones en espacios – asegúrese de
habilitar esta funcionalidad

– NotePad++: Settings -> Preferences -> Language Menu/Tab Settings (Configuración ->
Preferencias -> Menú de Idiomas/Configuración de Tabulación)

– TextWrangler: TextWrangler -> Preferences -> Editor Defaults (TextWrangler: TextWrangler ->
Preferencias -> Valores Predeterminados del Editor)

• A Python le importa *mucho* cuánta indentación tiene una línea. Si usted mezcla tabulaciones y
espacios, tal vez obtenga “indentation errors” (errores de indentación) incluso aunque todo se vea bien
Esto le ahorrará dolores
de cabeza innecesarios.
aumentar / mantener después de if o for
reducir para indicar el final del bloque
x = 5
if x > 2 :
print('Mayor que 2')
print('Sigue siendo mayor')
print('Terminado con 2')

for i in rango(5) :
print(i)
if i > 2 :
print('Mayor que 2')
print('Terminado con i', i)
print('Todo Terminado')
Piense en los bloques de
inicio/fin
x = 5
if x > 2 :
print('Mayor que 2')
print('Sigue siendo mayor')
print('Terminado con 2’)

for i in rango(5) :
print(i)
if i > 2 :
print('Mayor que 2')
print('Terminado con i', i)

print('Todo Terminado')
Decisiones x>1

Anidadas no print('Más de uno')

x = 42
if x > 1 : sí
print('Más de 1') x < 100
if x < 100 :
no
print('Menos de 100') print('Menos de 100')
print('Todo Terminado')

print 'Todo
Terminado'
Decisiones Bidireccionales
X=4
• A veces, queremos
hacer una cosa si una
no Sí
expresión lógica es x>2
verdadera y otra cosa
si la expresión es falsa print('No más print('Más
grande') grande')
• Es como una
encrucijada –
debemos elegir un print 'Todo
camino u otro pero no Terminado'
podemos elegir ambos
Decisiones
Bidireccionales con X=4

else: no Sí
x = 4 x>2

if x > 2 : print('No más print('Más


print('Más grande') grande') grande')
else :
print('Más pequeño')

print 'Todo Terminado' print 'Todo


Terminado'
Más Patrones de Ejecución Condicional
Visualizar Bloques X=4

no Sí
x>2
x = 4

if x > 2 :
print('No más print(‘Más
print('Más grande') grande') grande')
else :
print('Más pequeño')

print 'Todo Terminado' print 'Todo


Terminado'
Multidireccional

x<2 print('pequeño')

if x < 2 : no
print('Pequeño') sí
elif x < 10 : x < 10 print('Mediano')
print('Mediano') no
else :
print('ENORME') print('ENORME')
print('Todo terminado')

print('Todo Terminado')
Multidireccional x=0


x<2 print('pequeño')
x = 0
if x < 2 : no
print('pequeño') sí
elif x < 10 : x < 10 print('Mediano')
print('Mediano')
no
else :
print('ENORME') print('ENORME')
print('Todo
terminado')
print('Todo
Terminado')
Multidireccional
x=5


x<2 print('pequeño')
x = 5
if x < 2 : no
print('pequeño') sí
elif x < 10 : x < 10 print('Mediano')
print('Mediano') no
else :
print('ENROME') print('ENORME')
print('Todo
terminado')
print('Todo
Terminado')
Multidireccional
x = 20


x<2 print('pequeño')
x = 20
if x < 2 : no
print('pequeño') sí
elif x < 10 : x < 10 print('Mediano')
print('Mediano') no
else :
print('ENORME') print(‘ENORME')
print('Todo
terminado')
print('Todo
Terminado')
Multidireccional if x < 2 :
print('pequeño')
elif x < 10 :
# No Else print('Mediano')
x = 5 elif x < 20 :
if x < 2 : print('Grande')
print('Pequeño') elif x < 40 :
elif x < 10 : print('Enorme')
print('Mediano') elif x < 100:
print('Gigante')
print 'Todo terminado' else :
print('Descomunal')
Enigmas Multidireccionales
¿Cuál es el que nunca se
imprimirá independientemente
del valor de x? if x < 2 :
print('Debajo de 2')
if x < 2 : elif x < 20 :
print('Debajo de 2') print('Debajo de 20')
elif x >= 2 : elif x < 10 :
print('Dos o más') print('Debajo de 10')
else : else :
print('Otro') print('Otro')
La Estructura try / except
• Usted rodea una sección peligrosa del código con try y except
• Si el código en try funciona – except es omitido
• Si el código en try falla – pasa a la sección except 5
$ python3 notry.py
Traza de rastreo (llamada más
reciente a la último): Archivo
"notry.py", línea 2, in <module> istr
= int(astr)ValueError: invalid literal for
int() with base 10: 'Hola Bob'
$ cat notry.py
astr = 'Hola Bob' Todo
istr = int(astr) Terminado
print('Primero', istr)
astr = '123'
istr = int(astr)
print('Segundo', istr)
$ python3 notry.py
Trazas de rastreo (llamada más
reciente a lo último): Archivo
"notry.py", línea 2, in <module> istr
El = int(astr)ValueError: invalid literal for
programa int() with base 10: 'Hola Bob'
se detiene $ cat notry.py
aquí astr = 'Hola Bob' Todo
istr = int(astr) Terminado
print('Primero', istr)
astr = '123'
istr = int(astr)
print('Segundo', istr)
Computadora
Software
genérica
Dispositivos
de Entrada
CPU

Memoria
Secundaria

Dispositivos Memoria
de Salida Principal
Computadora
Software
genérica
Dispositivos
de Entrada
CPU

Memoria
Secundaria

Dispositivos Memoria
de Salida Principal
Cuando la primera conversión falla
astr = 'Hola Bob' – simplemente cae en except
try: (excepción): clausula, y el
istr = int(astr) programa continúa.
except:
istr = -1
$ python tryexcept.py
print('Primero', istr) Primero -1
Segundo 123
astr = '123'
try:
istr = int(astr)
except:
istr = -1 Cuando la segunda conversión es
exitosa – solo omite except
print('Segundo', istr) (excepción): clausula, y el
programa continúa.
try / except astr = 'Bob'

print('Hola')
astr = 'Bob'
try:
print('Hola') istr = int(astr)
istr = int(astr)
print('a todos')
except: print('a todos')
istr = -1

print('Terminado', istr = -1
istr) Red de
print('Terminado', istr) seguridad
Muestra de try / except
rawstr = input('Ingresar un número:')
try: $ python3 trynum.py
ival = int(rawstr) Ingresar un número:42
except: Buen trabajo
ival = -1 $ python3 trynum.py
Ingresar un
if ival > 0 : número:cuarenta-y-dos
print('Buen trabajo') No es un número
else: $
print('No es un número')
Ejercicio

Reescriba su cálculo del salario para darle al


empleado 1,5 veces la tarifa por hora para las
horas trabajadas que excedan las 40 horas.

Ingresar Horas: 45
Ingresar Tarifa: 10

Salario: 475.0
475 = 40 * 10 + 5 * 15
Ejercicio
Reescriba su programa de salarios usando try y
except de modo que su programa maneje input
(entradas) no numéricas de forma correcta.

Ingresar Horas: 20
Ingresar Tarifa: nueve
Error, por favor, ingresar un valor
numérico

Ingresar Horas: cuarenta


Error, por favor, ingresar un valor
numérico
Síntesis
• Operadores de comparación • Decisiones Anidadas
== <= >= > < ! =
• Decisiones
• Indentación Multidireccionales usando
elif
• Decisiones Unidireccionales
• try / except para compensar
• Decisiones Bidireccionales: errores
if: y else:
Agradecimientos / Colaboraciones
Estas diapositivas están protegidas por derechos de autor 2010-
Charles R. Severance (www.dr-chuck.com) de la Facultad de ...
Información de la Universidad de Michigan, y se ponen a
disposición bajo licencia de Creative Commons Attribution 4.0.
Por favor, conserve esta última diapositiva en todas las copias
del documento para cumplir con los requisitos de atribución de la
licencia. Si realiza algún cambio, siéntase libre de agregar su
nombre y el de su organización a la lista de colaboradores en
esta página cuando republique los materiales.

Desarrollo inicial: Charles Severance, Facultad de Información


de la Universidad de Michigan

… Ingrese nuevos colaboradores y traductores aquí


Funciones
Capítulo 4

Python para Todos


es.py4e.com
Pasos Almacenados (y
reutilizados)
def Programa:
objeto():
print('Hola') def objeto(): Resultado:
print('Diversión') print('Hola')

print('Diversión') Hola
Objeto() Diversión
objeto()
print('Zip') Zip
print 'Zip' objeto() Hola
Diversión
Objeto()
A estas piezas de códigos reutilizables las
denominamos “funciones”
Funciones de Python
• Existen dos tipos de funciones en Python.

– Funciones incorporadas que se presentan como parte de Python -


print(), input(), type(), float(), int() ...

– Funciones que nosotros definimos y luego utilizamos

• Tratamos a los nombres de las funciones incorporadas como


“nuevas” palabras reservadas (es decir, las evitamos como
nombres de variables)
Definición de la Función
• En Python una función es un código reutilizable que toma
argumentos(s) como input, realiza algunos cálculos y luego devuelve
uno o más resultado(s)

• Para definir una función utilizamos la palabra reservada def

• Llamamos/Invocamos a la función utilizando una expresión que


contenga el nombre de la función, paréntesis y argumentos
Argumento

grande = max('Hola mundo')


Asignación
'w'

Resultado
>>> grande = max('Hola mundo')
>>> print(grande)
w
>>> pequeño = min('Hola mundo')
>>> print(pequeño)

>>>
Función Max
Una función es un
>>> grande = max('Hola mundo') código almacenado que
>>> print(grande) nosotros utilizamos.
w Una función toma un
input y arroja un
resultado.
'Hola mundo' Función 'w'
(una cadena) max() (una cadena)

Guido escribió este


código
Función Max
Una función es un
>>> grande = max('Hola mundo') código almacenado que
>>> print(grande) nosotros utilizamos.
w Una función toma un
input y arroja un
def max(inp): resultado.
blah
'Hola mundo' blah 'w'
for x in inp:
(una cadena) blah
(una cadena)
blah

Guido escribió este


código
Conversiones de Type (Tipo)
• Cuando coloca un
número entero y un >>> print float(99) / 100
0.99
punto flotante en una >>> i = 42
expresión, el número >>> type(i)
entero implícitamente se <class 'int'>
>>> f = float(i)
convierte en decimal >>> print(f)
42.0
• Puede controlar esto >>> type(f)
con las funciones <class 'float'>
incorporadas int() y >>> print(1 + 2 * float(3) / 4 – 5)
-2.5
float() >>>
>>> sval = '123'

Conversiones >>> type(sval)


<class 'str'>
>>> print(sval + 1)

de Cadenas Traza de rastreo (llamada más reciente


a lo último):
Archivo "<stdin>", línea 1, in
• También puede usar int() y <module>
TypeError: cannot concatenate 'str'
float() para convertir entre and 'int'
cadenas y valores enteros >>> ival = int(sval)
>>> type(ival)
<class 'int'>
• Se mostrará error si la >>> print(ival + 1)
cadena no contiene 124
>>> nsv = 'hola bob'
caracteres numéricos >>> niv = int(nsv)
Traza de rastreo (llamada más reciente
a lo último):
Arhivo "<stdin>", línea 1, in
<module>
ValueError: invalid literal for int()
Una Función Propia
Construyendo Nuestras Propias
Funciones
• Creamos una nueva función usando la palabra clave def seguida de
parámetros opcionales entre paréntesis

• Indentamos el cuerpo de la función

• Esto define la función pero no ejecuta el cuerpo de la función

def print_lyrics():
print(“Soy un leñador, y estoy bien.")
print(‘Duermo toda la noche y trabajo todo el
día.')
print "Soy un leñador, y estoy bien."
print_lyrics(): print 'Duermo toda la noche y trabajo
todo el día.'
x = 5
print('Hola')

def print_lyrics():
print("Soy un leñador, y estoy bien.")
print('Duermo toda la noche y trabajo todo el Hola
día.') Yo
7
print('Yo')
x = x + 2
print(x)
Definiciones y Usos
• Una vez que hemos definido una función, podemos llamarla (o
invocarla) todas las veces que queramos

• Este es el patrón almacenar y reutilizar


x = 5
print('Hola')

def print_lyrics():
print("Soy un leñador, y estoy bien.")
print('Duermo toda la noche y trabajo todo el
día.')

print('Yo') Hola
print_lyrics()
x = x + 2
Yo
print(x) Soy un leñador, y estoy bien.
Duermo toda la noche y trabajo
todo el día.
7
Argumentos
• Un argumento es un valor que informamos a la función como su
entrada (input) cuando llamamos a la función

• Utilizamos argumentos para poder instruir a la función que


realice diferentes tareas cuando la llamamos en diferentes
oportunidades

• Colocamos los argumentos entre paréntesis luego del nombre


de la función
grande = max('Hola mundo')
Argumento
Parámetros
>>> def saludo(lang):
... if lang == 'es':
Un parámetro es una variable que ... print('Hola')
utilizamos en la función definition ... elif lang == 'fr':
... print('Bonjour')
(definición). Es una “handle” (palanca) ... else:
... print('Hello')
que permite al código de la función ...
acceder a los argumentos para >>> saludo ('en')
Hello
invocar una función en particular. >>> saludo ('es')
Hola
>>> saludo ('fr')
Bonjour
>>>
Valores de Retorno
A menudo, una función tomará sus argumentos, hará algunos
cálculos, y retornará un valor que se usará como el valor de la
llamada de la función en la expresión de llamada. La palabra clave
return (retorno) se utiliza para esto.

def saludo ():


return "Hola" Hola Glenn
Hola Sally
print(saludo (), "Glenn")
print(saludo (), "Sally")
Valor de Retorno
• Una función “fructífera” es la >>> def saludo (lang):
... if lang == 'es':
que arroja un resultado (o ... return 'Hola'
valor de retorno) ... elif lang == 'fr':
... return 'Bonjour'
... else:
• El enunciado return termina ... return 'Hello'
la ejecución de la función y ...
>>> print(saludo ('en'),'Glenn')
“devuelve” el resultado de la Hello Glenn
función >>> print(saludo ('es'),'Sally')
Hola Sally
>>> print(saludo ('fr'),'Michael')
Bonjour Michael
>>>
Argumentos, Parámetros, y
Resultados
>>> grande = max('Hola mundo') Parámetro
>>> print(grande)
w
def max(inp):
blah
blah
'Hola mundo' for x in inp: 'w'
blah
blah
Argumento return 'w'
Resultado
Múltiples Parámetros
• Podemos definir más de un
/ Argumentos
parámetro en la definición de la def addtwo(a, b):
función agregado = a + b
return agregado
• Simplemente agregamos más x = addtwo(3, 5)
argumentos cuando llamamos a print(x)
la función
8
• Hacemos coincidir el número y
orden de los argumentos y
parámetros
Funciones Nulas (no fructíferas)
• Cuando una función no retorna un valor, la denominamos una
función “void” (nula)

• Las funciones que retornan valores son las funciones “fructíferas”


• Las funciones Void (Nulas) son “no fructíferas”
Funcionar o no funcionar...
• Organice su código en “párrafos”; capture una idea completa y
“póngale un nombre”

• No se repita, hágalo funcionar una vez y luego reutilícelo

• Si algo se vuelve demasiado largo o complejo, desglose en bloques


lógicos y coloque esos bloques en funciones

• Haga una biblioteca de objetos comunes que usted repite todo el


tiempo, tal vez deba compartirlo con sus amigos...
Síntesis
• Argumentos • Funciones

• Resultados (funciones fructíferas) • Funciones incorporadas

• Funciones Void (nulas, no fructíferas) – Conversiones de Type


(tipo) (int, float)
• ¿Por qué usar funciones?
– Conversiones de cadenas
• Parámetros
Ejercicio
Reescriba el cálculo de su salario con una-hora-y-
media para las horas extras y cree una función llamada
computepay (calcular salario) que toma dos
parámetros (horas y tarifa).

Ingresar Horas: 45
Ingresar Tarifa: 10

Salario: 475.0
475 = 40 * 10 + 5 * 15
Agradecimientos / Colaboraciones
Estas diapositivas están protegidas por derechos de autor 2010- ...
Charles R. Severance (www.dr-chuck.com) de la Facultad de
Información de la Universidad de Michigan y open.umich.edu, y
se ponen a disposición bajo licencia de Creative Commons
Attribution 4.0. Por favor, conserve esta última diapositiva en
todas las copias del documento para cumplir con los requisitos
de atribución de la licencia. Si realiza algún cambio, siéntase
libre de agregar su nombre y el de su organización a la lista de
colaboradores en esta página cuando republique los materiales.

Desarrollo inicial: Charles Severance, Facultad de Información


de la Universidad de Michigan

… Ingrese nuevos colaboradores y traductores aquí


Bucles e Iteración
Capítulo 5

Python para Todos


es.py4e.com
n=5 Pasos Repetidos
Resultado:
No Sí Programa:
n>0? 5
n = 5 4
print(n) while n > 0 :
3
print(n)
n = n – 1 2
n = n -1 print('Blastoff') 1
print(n) ¡Blastoff!
0
Los bucles (pasos repetidos) tienen variables de iteración
que cambian cada vez a través del bucle. A menudo,
print('Blastoff') estas variables de iteración atraviesan una secuencia de
números.
n=5 Un Bucle Infinito
No Sí
n>0?
n = 5
print('Enjabonar') while n > 0 :
print('Enjabonar')
print('Enjuagar')
print('Enjuagar') print('Secar')

¿Qué es lo que está mal en este


print 'Secar' bucle?
n=0 Otro Bucle
No Sí
n>0?
n = 0
print('Enjabonar') while n > 0 :
print('Enjabonar')
print('Enjuagar')
print('Enjuagar') print('Secar!')

¿Qué es lo que está haciendo


print 'Secar' este bucle?
Romper un Bucle
• El enunciado break (romper) termina el bucle actual y salta al
enunciado que le sigue inmediatamente al bucle

• Es como una prueba de bucle que puede suceder en cualquier


lado en el cuerpo del bucle
while True:
línea = input('> ')
> hola
if línea == 'terminado' hola
: > finished
break finalizado
print(línea) > done
print('terminado') terminado
Romper un Bucle
• El enunciado break (romper) termina el bucle actual y salta al
enunciado que le sigue inmediatamente al bucle

• Es como una prueba de bucle que puede suceder en cualquier


lado en el cuerpo del bucle
while True:
> hola
línea = input('> ')
if línea == 'terminado' hola
: > finished
break finalizado
print(línea) > done
print('Terminado') terminado
while True: No ¿ Sí
línea = input('> ') Verdade-
if línea == 'terminado' ro?
: ....
break
print(línea)
print('terminado')
Break

...

http://en.wikipedia.org/wiki/Transporter_(Star_Trek)
print('Terminado')
Finalizar una Iteración con Continue
El enunciado continue (continuar) termina la iteración actual y salta
a la parte superior del bucle y comienza la siguiente iteración
while True:
line = input('> ')
> hola
if line[0] == '#' :
continue
Hola
if line == 'terminado' > # no imprimir esto
: > Imprimir esto
break imprimir esto
print(line) > terminado
print('Terminado') Terminado
Finalizar una Iteración con Continue
El enunciado continue (continuar) termina la iteración actual y salta
a la parte superior del bucle y comienza la siguiente iteración
while True:
línea = input('> ') > hola
if línea[0] == '#' : hola
continue > # no imprimir esto
if línea == 'terminado' : > Imprimir esto
break imprimir esto
print(línea) > terminado
print('Terminado') Terminado
No ¿Verda
dero?

while True:
línea = raw_input('> ') ....
if línea[0] == '#' :
continue
if línea == 'terminado' : continue
break
print(línea)
...
print('Terminado')

print('Terminado')
Bucles Indefinidos
• Los bucles while se llaman “bucles indefinidos” porque continúan
hasta que una condición lógica se vuelve False (Falsa)

• Los bucles que hemos visto hasta ahora son bastante fáciles de
examinar para determinar si terminarán o si serán “bucles infinitos”

• A veces, es más difícil saber con seguridad si un bucle terminará


Bucles Definidos
Bucles Definidos
• Con bastante frecuencia tenemos una lista de los ítems de las
líneas en un archivo, es decir un conjunto finito de cosas

• Podemos escribir un bucle para ejecutar el bucle una vez para cada
uno de los ítems de un conjunto utilizando la secuencia for de
Python

• Estos bucles se denominan “bucles definidos” porque se ejecutan


una cantidad exacta de veces

• Decimos que los “bucles definidos iteran a través de los miembros


de un conjunto”
Un Bucle Definido Simple
5
for i in [5, 4, 3, 2, 1] : 4
print(i) 3
print('Blastoff')
2
1
Blastoff
Un Bucle Definido con
Cadenas
Feliz año nuevo: Joseph
amigos = ['Joseph', 'Glenn', 'Sally'] Feliz año nuevo: Glenn
for amigo in amigos : Feliz año nuevo: Sally
print('Feliz año nuevo:', amigo)
print('Terminado')
¡Terminado!
Un Bucle Definido Simple
Sí No
¿Termi-
nado?
Avanzar i 5
for i in [5, 4, 3, 2, 1] : 4
print(i) 3
imprimir(i) print('Blastoff')
2
1
Blastoff
Los bucles definidos (bucles for) tienen variables de
imprimir('Blastoff') iteración explícitas que cambian cada vez a través del
bucle. Estas variables de iteración se mueven a través
del conjunto o secuencia.
Observando
• La variable de iteración
a In...
“itera” a través de la
secuencia (conjunto
ordenado) Secuencia de cinco
Variable de elementos
• El bloque (cuerpo) del iteración
código se ejecuta una vez
para cada valor in de la for i in [5, 4, 3, 2, 1] :
secuencia print(i)

• La variable de iteración se
mueve a través de todos los
valores in de la secuencia
No • La variable de iteración “itera” a
Sí ¿Termin
ado?
Avanzar i través de la secuencia (conjunto
ordenado)
imprimir(i)
• El bloque (cuerpo) del código se
ejecuta una vez para cada valor in
de la secuencia

• La variable de iteración avanza a


for i in [5, 4, 3, 2, 1] : través de todos los valores in de la
print(i)
secuencia
i=5
Sí No
¿Termi- print(i)
nado?
Avanzar i
i=4

imprimir(i) print(i)
i=3
print(i)

i=2
for i in [5, 4, 3, 2, 1] : print(i)
print(i)
i=1
print(i)
Bucles Definidos
• Con bastante frecuencia tenemos una lista de los ítems de las líneas
en un archivo, es decir un conjunto finito de cosas

• Podemos escribir un bucle para ejecutar el bucle una vez para cada
uno de los ítems de un conjunto utilizando la secuencia for de
Python

• Estos bucles se denominan “bucles definidos” porque se ejecutan


una cantidad exacta de veces

• Decimos que los “bucles definidos iteran a través de los miembros


de un conjunto”
Lenguajes de Bucle:
Lo Que Hacemos en los
Bucles
Nota: Aunque estos ejemplos sean simples, los
patrones se aplican a todos los tipos de bucles
Creando Bucles “inteligentes”
Configure algunas
variables con los valores
El truco consiste en “conocer” algo iniciales
acerca del bucle entero cuando para objeto en los datos:
está estancado escribiendo código
Buscar o hacer algo
que solo ve una entrada por vez
para cada entrada por
separado, que
actualice una variable

Observe las variables


Iteración de un conjunto
$ python basicloop.py
print('Antes')
Antes
for objeto in [9, 41, 12, 3, 74, 15] : 9
print(objeto) 41
print('Después')
12
3
74
15
Después
¿Cuál es el número mayor?
¿Cuál es el número mayor?

3
¿Cuál es el número mayor?

41
¿Cuál es el número mayor?

12
¿Cuál es el número mayor?

9
¿Cuál es el número mayor?

74
¿Cuál es el número mayor?

15
¿Cuál es el número mayor?
¿Cuál es el número mayor?

3 41 12 9 74 15
¿Cuál es el número mayor?

largest_so_far -1
¿Cuál es el número mayor?

largest_so_far 3
¿Cuál es el número mayor?

41

largest_so_far 41
¿Cuál es el número mayor?

12

largest_so_far 41
¿Cuál es el número mayor?

largest_so_far 41
¿Cuál es el número mayor?

74

largest_so_far 74
Bucles e Iteración – Parte 3 PYTHON PARA TODOS

¿Cuál es el número mayor?

15

74
¿Cuál es el número mayor?

3 41 12 9 74 15

74
Para encontrar el mayor valor
$ python largest.py
largest_so_far = -1
print('Antes', largest_so_far) Antes -1
for the_num in [9, 41, 12, 3, 74, 15] : 9 9
if the_num > largest_so_far : 41 41
largest_so_far = the_num 41 12
print(largest_so_far, the_num) 41 3
74 74
print('Después', largest_so_far)
74 15
Después 74
Creamos una variable que contenga el mayor valor que se haya visto hasta ahora
(largest_so_far). Si el número actual que estamos buscando es más grande, entonces
será el nuevo mayor valor que se haya visto hasta ahora (largest_so_far).
Más Lenguajes de Bucle
Conteo en un Bucle
$ python countloop.py
zork = 0 Antes 0
print('Antes', zork) 19
for objeto in [9, 41, 12, 3, 74, 15] :
2 41
zork = zork + 1
print(zork, objeto) 3 12
print('Después', zork) 43
5 74
6 15
Después 6
Para contar cuántas veces ejecutamos un bucle, introducimos una variable de
conteo que comience en 0 y le sumamos uno cada vez a través del bucle.
Suma en un Bucle
$ python countloop.py
zork = 0
Antes 0
print('Antes', zork)
for objeto in [9, 41, 12, 3, 74, 15] 99
: 50 41
zork = zork + objeto 62 12
print(zork, objeto) 65 3
print('Después', zork) 139 74
154 15
Después 154
Para sumar un valor que encontramos en un bucle, introducimos una variable de
suma que comience en 0 y le sumamos el valor a la suma cada vez a través del
bucle.
Sacar el Promedio en un
Bucle
conteo = 0 $ python averageloop.py
suma = 0 Antes 0 0
print('Antes', conteo, suma) 199
for valor in [9, 41, 12, 3, 74, 15] : 2 50 41
conteo = conteo + 1 3 62 12
suma = suma + valor
print(conteo, suma, valor)
4 65 3
print('Después', conteo, suma, suma / 5 139 74
conteo) 6 154 15
Después 6 154 25
Un promedio solo combina los patrones de conteo (count) y suma (sum)
y divide cuando el bucle ha terminado.
Filtrar en un Bucle
print('Antes') $ python search1.py
for valor in [9, 41, 12, 3, 74, 15] : Antes
if valor > 20: Mayor número 41
print 'Mayor Número',valor
print('Después')
Mayor número 74
Después

Utilizamos un enunciado hipotético “if” en el bucle para


captar / filtrar los valores que estamos buscando.
Búsqueda Utilizando una Variable
Booleana $ python search1.py
found = False Antes False (Falsa)
print('Antes', found) False (Falsa) 9
for valor in [9, 41, 12, 3, 74, 15] : False (Falsa) 41
if valor == 3 : False (Falsa) 12
found = True True (Falsa) 3
print(found, valor)
True (Falsa) 74
print('Después', found)
True (Falsa) 15
Después True (Verdadera)

Si solo deseamos buscar y saber si un valor fue hallado (found), utilizamos una
variable que comience como False (Falsa) y se vuelva True (Verdadera) tan
pronto como encontramos (find) lo que estamos buscando.
Cómo Encontrar el Menor Valor
$ python largest.py
mayor_hasta_ahora = -1
Antes -1
print('Antes', mayor_hasta_ahora)
for the_num in [9, 41, 12, 3, 74, 15] : 9 9
if the_num > mayor_hasta_ahora : 41 41
mayor_hasta_ahora = the_num 41 12
print(mayor_hasta_ahora, the_num) 41 3
74 74
print('Después', mayor_hasta_ahora) 74 15
Después 74

¿Cómo cambiaríamos esto para hacer que encuentre el menor valor de la lista?
Cómo Encontrar el Menor Valor
menor_hasta_ahora = -1
print('Antes', menor_hasta_ahora)
for the_num in [9, 41, 12, 3, 74, 15] :
if the_num < menor_hasta_ahora :
menor_hasta_ahora = the_num
print(menor_hasta_ahora, the_num)

print('Después', menor_hasta_ahora)

Cambiamos el nombre de la variable por menor valor hasta ahora


(smallest_so_far) y cambiamos > por <
Cómo Encontrar el Menor Valor
$ python smallbad.py
menor_hasta_ahora = -1
print('Antes', menor_hasta_ahora)
Antes -1
for the_num in [9, 41, 12, 3, 74, 15] : -1 9
if the_num < menor_hasta_ahora : -1 41
menor_hasta_ahora = the_num -1 12
print(menor_hasta_ahora, the_num) -1 3
-1 74
print('Después', menor_hasta_ahora)
-1 15
Después -1
Cambiamos el nombre de la variable por menor valor hasta ahora
(smallest_so_far) y cambiamos > por <
Cómo Encontrar el Menor Valor
menor = Ninguno $ python smallest.py
print('Antes')
Antes
for valor in [9, 41, 12, 3, 74, 15] :
if menor is Ninguno: 99
menor = valor 9 41
elif valor < menor : 9 12
menor = valor 33
print(menor, valor) 3 74
print('Después', menor) 3 15
Después 3
Aún tenemos una variable que es menor valor (smallest) hasta ahora. La primera
vez en el bucle menor valor es Ninguno, entonces tomamos el primer valor como
menor valor.
Los Operadores “is” e “is not”
• Python tiene un operador is (es)
que puede ser utilizado en
menor = Ninguno
print('Antes')
expresiones lógicas
for valor in [3, 41, 12, 9, 74, 15] :
if menor is Ninguno: • Implica que “es el mismo que”
menor = valor
elif valor < menor : • Similar a, pero más fuerte que ==
menor = valor
print menor, valor
• is not (no es) también es un
print('Después', menor) operador lógico
Síntesis
• Bucle While (indefinido) • Bucle For (definido)

• Bucles infinitos • Variables de iteración

• Uso de Break • Lenguajes de bucle

• Uso de Continue • Mayor o menor


Agradecimientos / Colaboraciones
Estas diapositivas están protegidas por derechos de autor 2010- ...
Charles R. Severance (www.dr-chuck.com) de la Facultad de
Información de la Universidad de Michigan y open.umich.edu, y
se ponen a disposición bajo licencia de Creative Commons
Attribution 4.0. Por favor, conserve esta última diapositiva en
todas las copias del documento para cumplir con los requisitos
de atribución de la licencia. Si realiza algún cambio, agregue su
nombre y el de su organización a la lista de colaboradores en
esta página cuando republique los materiales.

Desarrollo inicial: Charles Severance, Facultad de Información


de la Universidad de Michigan

… Ingrese nuevos colaboradores y traductores aquí


Cadenas
Capítulo 6

Python para Todos


es.py4e.com
El Tipo de dato
Cadena
>>> str1 = "Hola"
>>> str2 = 'ahí'
>>> bob = str1 + str2
• Una cadena (string) es una secuencia >>> print(bob)
de caracteres. Holaahí
>>> str3 = '123'
• Una cadena utiliza comillas >>> str3 = str3 + 1
'Hola' o "Hola" Traceback (most recent call
last): File "<stdin>", line 1,
• Para las cadenas, + significa in <module>
“concatenar”. TypeError: cannot concatenate
'str' and 'int' objects
• Cuando una cadena contiene números, >>> x = int(str3) + 1
aún sigue siendo una cadena. >>> print(x)
124
>>>
• Podemos convertir números dentro de
una cadena, a enteros, utilizando int()
Leyendo y >>> nombre = input('Ingresa:')
Ingresa:Chuck
convirtiendo datos >>> print(nombre)
Chuck
>>> manzana = input('Ingresa:')
• Preferimos leer datos de entrada
Ingresa:100
utilizando cadenas y después
>>> x = manzana – 10
analizar y convertir los datos
Traceback (most recent call
conforme sea necesario
last): File "<stdin>", line 1,
in <module>
• Esto nos da más control sobre
TypeError: unsupported operand
situaciones de error y/o datos de
type(s) for -: 'str' and 'int'
entrada del usuario incorrectos
>>> x = int(manzana) – 10
>>> print(x)
• Los números como datos de
90
entrada deben ser convertidos
de cadenas a enteros
Buscando dentro de una
Cadena
• Podemos obtener cualquier carácter b a n a n a
en una cadena usando un índice 0 1 2 3 4 5
especificado en corchetes
>>> fruta = 'banana'
• El valor del índice debe ser un >>>
>>>
letra = fruta[1]
print(letra)
entero y comienza desde el cero a
>>> x = 3
• El valor del índice puede ser una >>> w = fruta[x - 1]
expresión que se ha calculado >>> print(w)
n
Un carácter muy lejano
• Vas a obtener un error
de Python si tratas de >>> zot = 'abc'
acceder un índice más >>> print(zot[5])
allá del final de la Traceback (most recent call
cadena. last): File "<stdin>", line
1, in <module>
• Así que sé cuidadoso IndexError: string index out
of range
cuando construyas >>>
valores de índices y
rebanadas
Las Cadenas tienen Tamaño

b a n a n a
La función nativa len nos
0 1 2 3 4 5
retorna el tamaño de una
cadena
>>> fruta = 'banana'
>>> print(len(fruta))
6
Función len
>>> fruta = 'banana' Una función es un
>>> x = len(fruta) código almacenado que
>>> print(x) utilizamos. Una función
6 toma datos de entrada y
produce datos de salida.

'banana’ Función 6
(una cadena) len() (un número)
Función len
>>> fruta = 'banana' Una función es un
>>> x = len(fruta) código almacenado que
>>> print(x) utilizamos. Una función
6 toma datos de entrada y
produce datos de salida.
def len(inp):
bla
'banana’ bla 6
for x in y:
(una cadena) bla
(un número)
bla
Recorriendo una Cadena
Utilizando una sentencia
while, una variable de fruta = 'banana’ 0b
iteración, y la función indice = 0 1a
len, podemos construir while indice < len(fruta): 2n
letra = fruta[indice] 3a
un bucle para mirar cada
print(indice, letra)
una de las letras de una 4n
indice = indice + 1
cadena de forma 5a
individual
Recorriendo una Cadena
• Un bucle finito
utilizando una b
sentencia for es mucho a
fruta = 'banana'
más elegante n
for letra in fruta:
• La variable de iteración print(letra) a
n
es completamente a
manejada por el bucle
for
Recorriendo una Cadena
• Un bucle finito
utilizando una fruta = 'banana'
sentencia for es for letra in fruta :
b
mucho más elegante print(letra) a
n
• La variable de indice = 0
a
iteración es n
while indice < len(fruta) :
completamente letra = fruta[indice] a
manejada por el bucle print(letra)
for indice = indice + 1
Recorriendo y Contando
palabra = 'banana’
Este es un bucle sencillo contador = 0
que itera a través de cada for letra in palabra :
letra en una cadena y if letra == 'a' :
cuenta el número de veces contador =
que el bucle encuentra el contador + 1
carácter 'a' print(contador)
Analizando in más a fondo
• La variable de iteración
“itera” a través de una
secuencia (un conjunto Variable de Cadena de seis
ordenado) iteración caracteres
• El bloque (cuerpo) de
código es ejecutado una vez for letra in 'banana' :
para cada valor en (in) la print(letra)
secuencia

• La variable de iteración se
mueve a través de todos los
valores en (in) la secuencia
Sí No b a n a n a
Hecho? Avanzar letra

print(letra)

for letra in 'banana' :


print(letra)

La variable de iteración “itera” a través de la cadena y el bloque


(cuerpo) de código es ejecutado para cada valor en (in) la secuencia
Más Operaciones de Cadenas
Rebanado de
Cadenas M o n t y P y t h o n
• También podemos mirar a 0 1 2 3 4 5 6 7 8 9 10 11
cualquier sección continua de
una cadena utilizando el
operador dos puntos >>> s = 'Monty Python'
>>> print(s[0:4])
• El segundo número es un Mont
número más allá del final de la >>> print(s[6:7])
rebanada - “hasta pero no P
incluyendo” >>> print(s[6:20])
Python
• Si el segundo número está más
allá del final de la cadena,
entonces termina al final
Rebanado de
Cadenas M o n t y P y t h o n
0 1 2 3 4 5 6 7 8 9 10 11

Si dejamos en blanco el >>> s = 'Monty Python'


primer o el último número >>> print(s[:2])
de la rebanada, se asume Mo
que es el inicio o el final >>> print(s[8:])
de la cadena, thon
respectivamente >>> print(s[:])
Monty Python
Concatenación de Cadenas
>>> a = 'Hola'
>>> b = a + 'Ahí'
Cuando el operador + es >>> print(b)
aplicado a una cadena, HolaAhí
significa “concatenación” >>> c = a + ' ' + 'Ahí'
>>> print(c)
Hola Ahí
>>>
Utilizando in como Operador
Lógico
• La palabra in puede ser >>> fruta = 'banana'
>>> 'n' in fruta
utilizada para revisar si True
una cadena se encuentra >>> 'm' in fruta
“en (in)” otra cadena False
>>> 'nan' in fruta
• La expresión in es una True
expresión lógica que >>> if 'a' in fruta :
... print('Encontrada!')
retorna True o False y ...
puede ser utilizada una Encontrada!
sentencia if >>>
Comparación de Cadenas
if palabra == 'banana':
print('Muy bien, bananas.')

if palabra < 'banana':


print('Tu palabra,' + palabra + ', está antes de banana.')
elif palabra > 'banana':
print('Tu palabra,' + palabra + ', está después de banana.')
else:
print('Muy bien, bananas.')
• Python tiene un número de
funciones de cadenas que están
Librería String
en la librería string (cadena)
>>> saludo = 'Hola Bob'
• Esas funciones ya están >>> zap = saludo.lower()
previamente construidas dentro >>> print(zap)
de cada cadena – las invocamos hola bob
al agregar la función a la >>> print(saludo)
variable de la cadena Hola Bob
>>> print('Hola Ahí'.lower())
• Esas funciones no modifican la hola ahí
cadena original, sino que >>>
retornan una nueva cadena que
ha sido modificada
>>> cosa = 'Hola mundo'
>>> type(cosa)
<class 'str'>
>>> dir(cosa)
['capitalize', 'casefold', 'center', 'count', 'encode',
'endswith', 'expandtabs', 'find', 'format', 'format_map',
'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust',
'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper',
'zfill']

https://docs.python.org/3/library/stdtypes.html#string-methods
Librería String
str.capitalize() str.replace(old, new[, count])
str.center(width[, fillchar]) str.lower()
str.endswith(suffix[, start[, end]]) str.rstrip([chars])
str.find(sub[, start[, end]]) str.strip([chars])
str.lstrip([chars]) str.upper()
Buscando una Cadena
• Utilizamos la función find() para b a n a n a
buscar una subcadena dentro de 0 1 2 3 4 5
otra cadena
>>> fruta = 'banana'
• find() encuentra la primer ocurrencia
>>> pos = fruta.find('na')
de la subcadena >>> print(pos)
2
• Si la subcadena no se encuentra, >>> aa = fruta.find('z')
find() regresa -1 >>> print(aa)
-1
• Recuerda que las posiciones de una
cadena comienzan en cero.
Convirtiéndo Todo a MAYÚSCULAS
• Puedes crear una copia de una
cadena en minúsculas o
mayúsculas >>> saludo = 'Hola Bob'
>>> nnn = saludo.upper()
• Frecuentemente cuando >>> print(nnn)
estamos buscando una cadena HOLA BOB
utilizando find() primero >>> www = saludo.lower()
convertimos la cadena a >>> print(www)
minúsculas, de modo que hola bob
podemos buscar una cadena >>>
sin importar si está en
mayúsculas o minúsculas
Buscar y Reemplazar
• La función replace() es
como una operación >>> saludo = 'Hola Bob'
“buscar y reemplazar” >>> ncad = saludo.replace('Bob','Jane')
en un editor de texto >>> print(ncad)
Hola Jane
• Esta función reemplaza >>> ncad = saludo.replace('o','X')
todas las ocurrencias >>> print(ncad)
HXla BXb
de una cadena de >>>
búsqueda con una
cadena de reemplazo
Removiendo Espacios en Blanco
• A veces queremos tomar
una cadena y remover los
espacios en blanco al >>> saludo = ' Hola Bob '
inicio y/o al final >>> saludo.lstrip()
'Hola Bob '
• lstrip() y rstrip() remueven >>> saludo.rstrip()
los espacios en blanco a la ' Hola Bob'
>>> saludo.strip()
izquierda o a la derecha
'Hola Bob'
• strip() remueve espacios >>>

en blanco tanto al inicio


como al final de la cadena
Prefijos
>>> linea = 'Que tengas un buen día'
>>> linea.startswith('Que')
True
>>> linea.startswith('q')
False
Análisis y
21 31 Extracción
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

>>> datos = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'


>>> arrpos = datos.find('@')
>>> print(arrpos)
21
>>> esppos = datos.find(' ', arrpos)
>>> print(esppos)
31
>>> direccion = datos[arrpos+1 : esppos]
>>> print(direccion)
uct.ac.za
Dos tipos de Cadenas
Python 2.7.10 Python 3.5.1
>>> x = '이광춘' >>> x = '이광춘'
>>> type(x) >>> type(x)
<type 'str'> <class 'str'>
>>> x = u'이광춘' >>> x = u'이광춘'
>>> type(x) >>> type(x)
<type 'unicode'> <class 'str'>
>>> >>>

En Python 3, todas las cadenas son Unicode


Resumen
• Tipo Cadena (String) • Operaciones de Cadenas
• Leer/Convertir • Librería String
• Indexando cadenas [] • Comparación de Cadenas
• Rebanando cadenas [2:4] • Búsqueda de Cadenas
• Atravesando cadenas con • Reemplazando texto
for y while • Removiendo espacios
• Concatenando cadenas con +
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-05-02


Leyendo Archivos
Capítulo 7

Python para Todos


es.py4e.com
¡Es momento de ir a
Software ¿Qué buscar datos con los
sigue? que meterse!
Dispositivos Unidad Central
Somos
de Entrada y de los
de Salida Procesamiento archivos
Memoria
Secundaria

if x < 3:
print
Memoria From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>

Principal Date: Sat, 5 Jan 2008 09:12:18 -0500To:


source@collab.sakaiproject.orgFrom:
stephen.marquard@uct.ac.zaSubject: [sakai] svn commit: r39772 -
content/branches/Details:
http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
...
Procesamiento de Archivos
Un archivo de texto puede ser pensado como una secuencia de
líneas
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Date: Sat, 5 Jan 2008 09:12:18 -0500
To: source@collab.sakaiproject.org
From: stephen.marquard@uct.ac.za
Subject: [sakai] svn commit: r39772 - content/branches/

Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772

http://www.py4e.com/code/mbox-short.txt
Abriendo un Archivo
• Before we can read the contents of the file, we must tell Python
which file we are going to work with and what we will be doing
with the file

• This is done with the open() function

• open() returns a “file handle” - a variable used to perform


operations on the file

• Similar to “File -> Open” in a Word Processor


Utilizando open()
man_a
– manejador = open(nombrearchivo, modo) = open('mbox.txt', 'r')

– retorna un manejador que se usa para manipular el


archivo

– nombrearchivo es el nombre del archivo

– modo es opcional y debería ser 'r' si estamos


planeando leer el archivo, y 'w' si vamos a escribir al
archivo
¿Qué es un Manejador?
>>> man_a = open('mbox.txt')
>>> print(man_a)
<_io.TextIOWrapper name='mbox.txt' mode='r' encoding='UTF-8'>
Cuando un archivo no Existe
>>> man_a = open('cosa.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or
directory: 'cosa.txt'
El carácter salto de línea
>>> cosa = '¡Hola\nMundo!'
• Utilizamos un carácter >>> cosa
especial llamado “salto de '¡Hola\nMundo!'
línea” para indicar cuando >>> print(cosa)
una línea termina ¡Hola
Mundo!
>>> cosa = 'X\nY'
• Es representado como \n en
>>> print(cosa)
las cadenas X
Y
• Salto de Línea sigue siendo >>> len(cosa)
un solo carácter - no dos 3
Procesamiento de Archivos
Un archivo de texto puede ser pensado como una secuencia
de líneas
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Date: Sat, 5 Jan 2008 09:12:18 -0500
To: source@collab.sakaiproject.org
From: stephen.marquard@uct.ac.za
Subject: [sakai] svn commit: r39772 - content/branches/

Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
Procesamiento de Archivos
Un archivo de texto tiene saltos de líneas al final de cada línea

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008\n


Return-Path: <postmaster@collab.sakaiproject.org>\n
Date: Sat, 5 Jan 2008 09:12:18 -0500\n
To: source@collab.sakaiproject.org\n
From: stephen.marquard@uct.ac.za\n
Subject: [sakai] svn commit: r39772 - content/branches/\n
\n
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772\n
Leyendo Archivos en Python
Manejador de Archivos como
una Secuencia
• Un manejador de archivos abierto en
modo de lectura puede ser tratado archivox = open('mbox.txt')
como una secuencia de cadenas for queso in archivox :
donde cada línea en el archivo es una print(queso)
cadena en la secuencia

• Podemos usar la sentencia for para


iterar a través de una secuencia

• Recuerda - una secuencia es un


conjunto ordenado
Contando Líneas en un Archivo
• Abre un archivo en modo de man_a = open('mbox.txt’)
lectura contador = 0
for linea in man_a:
• Utiliza un bucle for para leer contador = contador + 1
cada línea print('Total de Líneas:', contador)

• Cuenta las líneas e imprime


$ python abrir.py
el número total de líneas
Total de Líneas: 132045
Leyendo el Archivo *Entero*
Podemos leer un >>> man_a = open('mbox-short.txt')
archivo entero (saltos >>> ent = man_a.read()
de líneas y todo lo >>> print(len(ent))
94626
demás) dentro de una
>>> print(ent[:20])
sola cadena From stephen.marquar
Búsqueda a Través de un Archivo
Podemos poner una
sentencia if nuestro bucle man_a = open('mbox-short.txt')
for para únicamente for linea in man_a:
imprimir líneas que if linea.startswith('From:') :
satisfacen cierta print(linea)
característica
¿Qué están haciendo ahí ¡Uy!
todas esas líneas en
blanco? From: stephen.marquard@uct.ac.za

From: louis@media.berkeley.edu

From: zqian@umich.edu

From: rjlowe@iupui.edu
...
¿Qué están haciendo ahí ¡Uy!
todas esas líneas en
blanco? From: stephen.marquard@uct.ac.za\n
\n
• Cada línea del archivo From: louis@media.berkeley.edu\n
tiene un salto de línea \n
al final From: zqian@umich.edu\n
\n
• La sentencia print From: rjlowe@iupui.edu\n
\n
agrega un salto de
...
línea a cada línea
Búsqueda a Través de un Archivo
(arreglado)
• Podemos remover los
espacios en blanco del man_a = open('mbox-short.txt')
for linea in man_a:
lado derecho de la cadena linea = line.rstrip()
utilizando rstrip() de la if linea.startswith('From:') :
librería de cadenas print(linea)

(string)
From: stephen.marquard@uct.ac.za
• El salto de línea es From: louis@media.berkeley.edu
considerado como un From: zqian@umich.edu
“espacio en blanco” y es From: rjlowe@iupui.edu
removido ....
Ignorando con continue

Podemos ignorar man_a = open('mbox-short.txt')


líneas de forma for linea in man_a:
conveniente al utilizar linea = linea.rstrip()
if not linea.startswith('From:') :
la sentencia continue continue
(continuar) print(linea)
Usando in para Seleccionar Lineas
Podemos buscar una man_a = open('mbox-short.txt')
cadena en cualquier for linea in man_a:
parte en una línea como linea = linea.rstrip()
if not '@uct.ac.za' in linea:
nuestro criterio de continue
selección print(linea)

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008


X-Authentication-Warning: set sender to stephen.marquard@uct.ac.za using –f
From: stephen.marquard@uct.ac.za
Author: stephen.marquard@uct.ac.za
From david.horwitz@uct.ac.za Fri Jan 4 07:02:32 2008
X-Authentication-Warning: set sender to david.horwitz@uct.ac.za using -f...
nombrea = input('Ingresa un nombre de archivo: ')
Solicitar
Nombre
man_a = open(nombrea)
contador = 0
for linea in man_a:

de Archivo
if linea.startswith('Subject:') :
contador = contador + 1
print('Había', contador, 'líneas de subject en', nombrea)

Ingresa un nombre de archivo: mbox.txt


Había 1797 líneas de subject en mbox.txt

Ingresa un nombre de archivo: mbox-short.txt


Había 27 líneas de subject en mbox-short.txt
Nombres nombrea = input('Ingresa un nombre de archivo: ')
try:
man_a = open(nombrea)

de Archivo except:
print('El archivo no se puede abrir:', nombrea)
quit()

Incorrectos contador = 0
for linea in man_a:
if linea.startswith('Subject:') :
contador = contador + 1
print('Había', contador, 'líneas de subject en', nombrea)

Ingresa un nombre de archivo: mbox.txt


Había 1797 líneas de subject en mbox.txt

Ingresa un nombre de archivo: na na boo boo


El archivo no se puede abrir: na na boo boo
Resumen
• Almacenamiento Secundario • Búsqueda por líneas
• Abriendo un archivo - manejador de archivo • Leyendo nombres
de archivos
• Estructura de archivo - salto de línea
• Manejando archivos
• Lectura de un archivo línea por línea
incorrectos
con un bucle for
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-05-18


Listas en Python
Capítulo 8

Python para Todos


es.py4e.com
Programación
Algoritmos
– Un conjunto de reglas o pasos usados para resolver un problema

Estructuras de Datos
– Una forma particular de organizar datos en una computadora

https://es.wikipedia.org/wiki/Algoritmo
https://es.wikipedia.org/wiki/Estructura_de_datos
¿Qué No es Una “Colección”?
La mayoría de nuestras variables solo tienen un valor en ellas –
cuando ponemos un nuevo valor en una variable, el valor
anterior es sobrescrito

$ python
>>> x = 2
>>> x = 4
>>> print(x)
4
Una Lista Es un Tipo de
Colección
• Una colección nos permite poner muchos valores en una
sola “variable”

• Una colección es buena porque podemos mover muchos


valores alrededor en un paquete conveniente

amigos = [ 'Joseph', 'Glenn', 'Sally' ]

equipaje = ['calcetin', 'camisa', 'perfume' ]


Constantes en Listas
• Las constantes de una Lista
están encerradas por corchetes >>> print([1, 24, 76])
[1, 24, 76]
y los elementos en la lista están
>>> print(['rojo', 'amarillo', 'azul'])
separados por comas ['rojo', 'amarillo', 'azul']
>>> print(['rojo', 24, 98.6])
• Un elemento de una lista puede ['rojo', 24, 98.6]
ser cualquier objeto de Python – >>> print([ 1, [5, 6], 7])
[1, [5, 6], 7]
incluso otra lista >>> print([])
[]
• Una lista puede estar vacía
¡Ya estamos usando Listas!

5
for i in [5, 4, 3, 2, 1] :
print(i) 4
print('¡Despegue!') 3
2
1
¡Despegue!
Listas y Bucles Definidos – Mejores
Amigos
amigos = ['Joseph', 'Glenn', 'Sally']
for amigo in amigos : ¡Feliz Año Nuevo!: Joseph
print('¡Feliz año nuevo!:', amigo)
print('¡Hecho!') ¡Feliz Año Nuevo!: Glenn
¡Feliz Año Nuevo!: Sally
¡Hecho!
z = ['Joseph', 'Glenn', 'Sally']
for x in z:
print('¡Feliz año nuevo!:', x)
print('¡Hecho!')
Búsqueda dentro de Listas
Así como en las cadenas, podemos obtener cualquier elemento
individual de una lista utilizando un índice especificado en
corchetes
>>> amigos = [ 'Joseph', 'Glenn', 'Sally' ]
Joseph Glenn Sally >>> print(amigos[1])
Glenn
0 1 2 >>>
Las Listas son Mutables
>>> fruta = 'Banana'
• Las Cadenas son “inmutables” – >>> fruta[0] = 'b'
no podemos cambiar el contenido Traceback
TypeError: 'str' object does not
de una cadena – tenemos que support item assignment
crear una nueva cadena para haer >>> x = fruta.lower()
cualquier cambio >>> print(x)
banana
• Las Listas son “mutables” - >>> loto = [2, 14, 26, 41, 63]
>>> print(loto)
podemos cambiar un elemento de [2, 14, 26, 41, 63]
una lista utilizando el operador >>> loto[2] = 28
índice >>> print(loto)
[2, 14, 28, 41, 63]
¿Qué tan Larga es una Lista?
• La función len() toma una lista
>>> saludo = 'Hola Bob'
como parámetro y retorna el >>> print(len(saludo))
número de elementos en la lista 9
>>> x = [ 1, 2, 'joe', 99]
• De hecho, len() nos da el número >>> print(len(x))
de elementos de cualquier 4
conjunto o secuencia (tal como >>>
una cadena...)
Usando la Función range
• La función range retorna
una lista de números que
>>> print(range(4))
van desde cero hasta el [0, 1, 2, 3]
número anterior al >>> amigos = ['Joseph', 'Glenn', 'Sally']
>>> print(len(amigos))
parámetro 3
>>> print(range(len(amigos)))
[0, 1, 2]
• Podemos construir un >>>
bucle por índices usando
un for y un entero
iterador
Un Cuento Sobre Dos Bucles...
>>> amigos = ['Joseph', 'Glenn', 'Sally']
amigos = ['Joseph', 'Glenn', 'Sally'] >>> print(len(amigos))
3
for amigo in amigos : >>> print(range(len(amigos)))
print('Feliz año nuevo:', amigo) [0, 1, 2]
>>>
for i in range(len(amigos)) :
amigo = amigos[i]
print('Feliz año nuevo:', amigo) Feliz año nuevo: Joseph
Feliz año nuevo: Glenn
Feliz año nuevo: Sally
Concatenando Listas Usando +
>>> a = [1, 2, 3]
Podemos crear una
>>> b = [4, 5, 6]
nueva lista al juntar dos >>> c = a + b
listas creadas >>> print(c)
previamente [1, 2, 3, 4, 5, 6]
>>> print(a)
[1, 2, 3]
Las Listas pueden ser
Rebanadas Usando :
>>> t = [9, 41, 12, 3, 74, 15]
>>> t[1:3]
[41,12] Recuerda: Tal como en
>>> t[:4] las cadenas, el segundo
[9, 41, 12, 3] número es “hasta pero no
>>> t[3:]
incluyendo”
[3, 74, 15]
>>> t[:]
[9, 41, 12, 3, 74, 15]
Métodos de Listas
>>> x = list()
>>> type(x)
<type 'list'>
>>> dir(x)
['append', 'count', 'extend', 'index', 'insert',
'pop', 'remove', 'reverse', 'sort']
>>>

http://docs.python.org/tutorial/datastructures.html
Construyendo una Lista desde
Cero
• Podemos crear una lista >>> cosas = list()
vacía y después agregar >>> cosas.append('libro')
elementos usando el >>> cosas.append(99)
método append (agregar) >>> print(cosas)
['libro', 99]
• La lista mantiene su orden >>> cosas.append('galleta')
>>> print(cosas)
y los nuevos elementos
['libro', 99, 'galleta']
son agregados al final de la
lista
¿Se Encuentra Algo en una Lista?
• Python provee dos
operadores que te permiten >>> algunos = [1, 9, 21, 10, 16]
revisar si un elemento se >>> 9 in algunos
True
encuentra en una lista
>>> 15 in algunos
False
• Son operadores lógicos >>> 20 not in algunos
retornan True o False True
>>>
• Esos operadores no
modifican la lista
Las Listas están en Orden
• Una lista puede almacenar
muchos elementos y los
mantiene en orden hasta que >>> amigos = [ 'Joseph', 'Glenn', 'Sally' ]
>>> amigos.sort()
hagamos algo para cambiarlo >>> print(amigos)
['Glenn', 'Joseph', 'Sally']
• Una lista puede ser ordenada >>> print(amigos[1])
(i.e., cambiar su orden) Joseph
>>>
• El método sort (ordenar) (al
contrario que en las cadenas)
significa “ordénalo tu mismo”
Funciones Nativas y Listas
>>> nums = [3, 41, 12, 9, 74, 15]
• Hay un cierto número de >>> print(len(nums))
funciones nativas en 6
Python que toman listas >>> print(max(nums))
como parámetros 74
>>> print(min(nums))
3
• ¿Recuerdas los bucles >>> print(sum(nums))
que hicimos? Son mucho 154
más sencillos >>> print(sum(nums)/len(nums))
25.6
total = 0 Ingresa un número: 3
contador = 0
while True :
Ingresa un número: 9
inp = input('Ingresa un número: ') Ingresa un número: 5
if inp == 'hecho' : break
valor = float(inp) Ingresa un número: hecho
total = total + valor Promedio: 5.66666666667
contador = contador + 1

promedio = total / contador


numlista = list()
print('Promedio:', promedio)
while True :
inp = input('Ingresa un número: ')
if inp == 'hecho' : break
valor = float(inp)
numlista.append(valor)

promedio = sum(numlista) / len(numlista)


print('Promedio:', promedio)
Mejores Amigos: Cadenas y Listas
>>> abc = 'Con tres palabras' >>> print(cosas)
>>> cosas = abc.split() ['Con', 'tres', 'palabras']
>>> print(cosas) >>> for w in cosas :
['Con', 'tres', 'palabras'] ... print(w)
>>> print(len(cosas)) ...
3 Con
>>> print(cosas[0]) tres
Con palabras
>>>
Split separa una cadena en partes y produce una lista de cadenas. Podemos
verlas como palabras. Podemos acceder una palabra en particular o iterar a
través de todas ellas.
>>> linea = 'Muchos espacios'
>>> etc = linea.split()
>>> print(etc)
['Muchos', 'Espacios'] ● Cuando no especificas un
>>>
>>> linea = 'primero;segundo;tercero' delimitador, múltiples espacios son
>>> cosa = linea.split()
>>> print(cosa) tratados como un solo delimitador
['primero;segundo;tercero']
>>> print(len(cosa)) ● Puedes especificar qué carácter
1 delimitador utilizar al dividir
>>> cosa = linea.split(';')
>>> print(cosa) llamando a la función split
['primero', 'segundo', 'tercero']
>>> print(len(cosa))
3
>>>
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

man_a = open('mbox-short.txt') Sat


for linea in man_a:
linea = linea.rstrip() Fri
if not linea.startswith('From ') : continue Fri
palabras = linea.split()
print(palabras[2]) Fri
...

>>> linea = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008’


>>> palabras = linea.split()
>>> print(palabras)
['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008']
>>>
El Patrón Doble División
A veces dividimos una línea de una forma, y luego tomamos
una de las partes de la línea y dividimos esa parte de nuevo

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

palabras = linea.split()
email = palabras[1]
print(piezas[1])
El Patrón Doble División

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

palabras = linea.split()
email = palabras[1] stephen.marquard@uct.ac.za
print(piezas[1])
El Patrón Doble División

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

palabras = linea.split()
email = palabras[1] stephen.marquard@uct.ac.za
piezas = email.split('@') ['stephen.marquard', 'uct.ac.za']
print(piezas[1])
El Patrón Doble División

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

palabras = linea.split()
email = palabras[1] stephen.marquard@uct.ac.za
piezas = email.split('@') ['stephen.marquard', 'uct.ac.za']
print(piezas[1]) 'uct.ac.za'
Resumen
• Concepto de “colección” • Rebanado de listas

• Listas y bucles finitos • Métodos de listas: append, remove

• Indexación y búsqueda • Ordenado de listas

• Mutabilidad de listas • División de cadenas en listas de


palabras
• Funciones: len, min, max, sum
• Uso de split para analizar cadenas
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-05-18


Diccionarios en Python
Capítulo 9

Python para Todos


es.py4e.com
¿Qué Es Una
Colección?
• Una colección es genial porque podemos poner más de un
valor en ella y moverla alrededor en un paquete muy
conveniente

• Tenemos un grupo de valores en una sola “variable”

• Hacemos esto al tener más de un solo lugar “en” la variable

• Tenemos forma de definir los diferentes lugares en la variable


¿Qué No Es Una “Colección”?
• La mayoría de nuestras variables tienen un único valor en
ellas – cuando ponemos un nuevo valor en la variable – el
valor anterior se sobrescribe
$ python
>>> x = 2
>>> x = 4
>>> print(x)
4
Una Historia De Dos
Colecciones...
• Lista

– Una colección lineal de valores que


mantienen un orden

• Diccionario

– Una “bolsa” de valores, cada uno con una


etiqueta
Diccionarios

papel
calculadora

perfume
dinero
dulce
https://es.wikipedia.org/wiki/Vector_asociativo
Diccionarios
• Los diccionarios son la colección de datos más poderosa de Python

• Los diccionarios nos permiten hacer operaciones rápidas similares a una


base de datos en Python

• Los diccionarios tienen diferentes nombres en diferentes lenguajes

– Vectores Asociativos - Perl / PHP

– Propiedades o Mapas o HashMap - Java

– Bolsa de Propiedades - C# / .Net


Diccionarios
• Las listas indexan sus
entradas basadas en la >>> bolsa = dict()
posición en la lista >>> bolsa['dinero'] = 12
>>> bolsa['dulce'] = 3
>>> bolsa['papel'] = 75
• Los Diccionarios son >>> print(bolsa)
{'dinero': 12, 'papel': 75, 'dulce': 3}
como bolsas – no tienen >>> print(bolsa['dulce'])
orden 3
>>> bolsa['dulce'] = bolsa['dulce'] + 2
>>> print(bolsa)
• Así que indexamos las {'dinero': 12, 'papel': 75, 'dulce': 5}
cosas que ponemos en
un diccionario con una
“etiqueta de búsqueda”
Comparación de Listas y Diccionarios
Los Diccionarios son como listas a excepción de que utilizan
claves en vez de números para buscar valores

>>> lst = list() >>> ddd = dict()


>>> lst.append(21) >>> ddd['edad'] = 21
>>> lst.append(183) >>> ddd['curso'] = 182
>>> print(lst) >>> print(ddd)
[21, 183] {'curso': 182, 'edad': 21}
>>> lst[0] = 23 >>> ddd['edad'] = 23
>>> print(lst) >>> print(ddd)
[23, 183] {'curso': 182, 'edad': 23}
>>> lst = list() Lista
>>> lst.append(21)
>>> lst.append(183) Clave Valor
>>> print(lst)
[0] 21
[21, 183] lst
>>> lst[0] = 23 [1] 183
>>> print(lst)
[23, 183]

>>> ddd = dict()


Diccionario
>>> ddd['edad'] = 21
>>> ddd['curso'] = 182 Clave Valor
>>> print(ddd)
{'curso': 182, 'edad': 21} ['curso'] 182
>>> ddd['edad'] = 23 ddd
>>> print(ddd) ['edad'] 21
{'curso': 182, 'edad': 23}
Literales de Diccionarios
(Constantes)
• Las literales de diccionarios se escriben con llaves y tienen una lista
en par tipo clave : valor

• Puedes inicializar un diccionario vacío escribiendo corchetes vacíos


>>> jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
>>> print(jjj)
{'jan': 100, 'chuck': 1, 'fred': 42}
>>> ooo = { }
>>> print(ooo)
{}
>>>
¿El Nombre Más Común?
¿El Nombre Más Común?
marquard cwen cwen
zhen marquard zhen
csev
csev zhen
marquard
zhen csev zhen
¿El Nombre Más Común?
marquard cwen cwen
zhen marquard zhen
csev
csev zhen
marquard
zhen csev zhen
Múltiples Contadores con un
Diccionario
Un uso común de diccionarios es Clave Valor
contar con qué frecuencia “vemos”
algo
>>> ccc = dict()
>>> ccc['csev'] = 1
>>> ccc['cwen'] = 1
>>> print(ccc)
{'csev': 1, 'cwen': 1}
>>> ccc['cwen'] = ccc['cwen'] + 1
>>> print(ccc)
{'csev': 1, 'cwen': 2}
Errores de Diccionarios
• Es un error hacer referencia a una clave que no existe en un
diccionario

• Podemos usar el operador in para comprobar si una clave


se encuentra en un diccionario

>>> ccc = dict()


>>> print(ccc['csev'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'csev'
>>> 'csev' in ccc
False
Cuando Encontramos un
Nuevo Valor
Cuando encontramos un nuevo nombre, necesitamos agregar una
nueva entrada en el diccionario y si es la segunda vez o después
encontramos de nuevo el nombre, simplemente sumamos uno al
contador en el diccionario bajo ese nombre
contadores = dict()
nombres = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for nombre in nombres :
if nombre not in contadores: {'csev': 2, 'zqian': 1, 'cwen': 2}
contadores[nombre] = 1
else :
contadores[nombre] = contadores[nombre] + 1
print(contadores)
El Método get de un Diccionario
El patrón de verificar si una clave
ya existe en un diccionario y if nombre in contadores:
asumir un valor por defecto si la x = contadores[nombre]
else :
clave no se encuentra es tan x = 0
común, que hay un método
llamado get() que hace esto por
nosotros x = contadores.get(name, 0)

Valor por defecto si la clave no


existe (y no produce errores). {'csev': 2, 'zqian': 1, 'cwen': 2}
Conteo Simplificado usando
get()
Podemos usar get() y proveer un valor por defecto de cero
cuando la clave no existe aún en el diccionario - y después
sumar uno
contadores = dict()
nombres = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for nombre in nombres :
contadores[nombre] = contadores.get(nombre, 0) + 1
print(contadores)

{'csev': 2, 'zqian': 1, 'cwen': 2}


Valor por
defecto
Conteo Simplificado usando
get()
contadores = dict()
nombres = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for nombre in nombres :
contadores[nombre] = contadores.get(nombre, 0) + 1
print(contadores)

http://www.youtube.com/watch?v=EHJ9uYx5L58
Conteo de Palabras en un Texto
Escribir programas (o programar) es una actividad muy creativa y gratificante. Puedes escribir
programas por muchas razones, desde resolver un problema complicado de análisis de datos
hasta pasar un rato divertido con alguien resolviendo un problema. Este curso asume que todos
necesitan saber cómo programar, y que, una vez que aprendes a programar, serás capaz de
encontrar qué quieres hacer con ese nuevo conocimiento.
En nuestra vida diaria nos encontramos rodeados de computadoras, desde computadoras
portátiles hasta teléfonos celulares. Podemos pensar en esas computadoras como “asistentes
personales” que pueden ocuparse de muchas cosas por nosotros. El hardware en las
computadoras de hoy es esencialmente construido para preguntarnos continuamente, “¿Qué te
gustaría que haga ahora?”
Nuestras computadoras son rápidas y tienen cantidades grandes de memoria, y pueden sernos
muy útiles solamente si sabemos hablar el lenguaje correcto para explicarle a la computadora lo
que queremos que haga ahora. Si supiéramos este lenguaje podríamos decirle a la
computadora que se encargue de las tareas que repetimos con frecuencia. Es interesante saber
que las cosas que las computadoras pueden hacer mejor son con frecuencia las cosas que los
humanos encontramos aburridas y poco interesantes.
Patrón del Contador
contadores = dict()
print('Ingresa una línea de texto:') El patrón general para contar las
lineaa = input('') palabras en una línea de texto
es dividir la línea en palabras, y
palabras = lineaa.split()
después recorrer las palabras y
print('Palabras:', palabras) usar un diccionario para
mantener la cuenta de cada
print('Contando...') palabra de forma independiente.
for palabra in palabras:
contadores[palabra] = contadores.get(palabra,0) + 1
print('Contadores', contadores)
python contador_palabras.py
Ingresa una línea de texto:
el payaso corrio detras del carro y el carro corrio dentro
de la tienda y la tienda cayo sobre el payaso y el carro

Palabras: ['el', 'payaso', 'corrio', 'detras', 'del',


'carro', 'y', 'el', 'carro', 'corrio', 'dentro', 'de',
'la', 'tienda', 'y', 'la', 'tienda', 'cayo', 'sobre',
'el', 'payaso', 'y', 'el', 'carro’]
Contando...

Contadores {'el': 4, 'payaso': 2, 'corrio': 2, 'detras':


1, 'del': 1, 'carro': 3, 'y': 3, 'dentro': 1, 'de': 1,
'la': 2, 'tienda': 2, 'cayo': 1, 'sobre': 1}

http://www.flickr.com/photos/71502646@N00/2526007974/
contadores = dict() python contador_palabras.py
lineaa = input('Ingresa una línea de Ingresa una línea de texto:
texto:’) el payaso corrio detras del carro y el carro
palabras = lineaa.split()
corrio dentro de la tienda y la tienda cayo
print('Palabras:', palabras) sobre el payaso y el carro
print('Contando...')
Palabras: ['el', 'payaso', 'corrio', 'detras',
for palabra in palabras: 'del', 'carro', 'y', 'el', 'carro', 'corrio', 'dentro',
contadores[palabra] = 'de', 'la', 'tienda', 'y', 'la', 'tienda', 'cayo',
contadores.get(palabra,0) + 1
'sobre', 'el', 'payaso', 'y', 'el', 'carro']
print('Contadores', contadores)
Contando...
Contadores {'el': 4, 'payaso': 2, 'corrio': 2,
'detras': 1, 'del': 1, 'carro': 3, 'y': 3, 'dentro':
1, 'de': 1, 'la': 2, 'tienda': 2, 'cayo': 1, 'sobre':
1}
Bucles Finitos y Diccionarios
A pesar de que los diccionarios no se almacenan en orden,
podemos escribir un bucle for que recorre todas las entradas
en un diccionario – de hecho recorre todas las claves en el
diccionario y busca los valores
>>> contadores = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
>>> for clave in contadores:
... print(clave, contadores[clave])
...
jan 100
chuck 1
fred 42
>>>
Recuperando listas de Claves y
Valores
Puedes obtener >>> jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
>>> print(list(jjj))
una lista de ['jan', 'chuck', 'fred']
claves, valores, o >>> print(jjj.keys())
['jan', 'chuck', 'fred']
ítems (ambos) de >>> print(jjj.values())
un diccionario [100, 1, 42]
>>> print(jjj.items())
[('jan', 100), ('chuck', 1), ('fred', 42)]
>>>

¿Qué es una
“tupla”? - próximamente...
Bonus: Dos Variables de
• Iteración!
Iteramos a través de
los pares clave-valor
en un diccionario jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
for aaa,bbb in jjj.items() :
usando *dos* print(aaa, bbb)
variables de iteración aaa bbb

• En cada iteración, la jan 100 [jan] 100


chuck 1
primera variable es la fred 42 [chuck] 1
clave y la segunda
variable es el valor [fred] 42
correspondiente a la
clave
nombre = input('Ingresa un nombre de archivo:')
manejador = open(nombre)

contadores = dict() python palabras.py


for linea in manejador:
palabras = linea.split() Enter file: palabras.txt
for palabra in palabras: a 16
contadores[palabra] =
contadores.get(palabra,0) + 1

grancontador = None python palabras.py


granpalabra = None
for palabra,contador in contadores.items():
Enter file: payaso.txt
if grancontador is None or contador > el 4
grancontador:
granpalabra = palabra
grancontador = contador
Usando dos bucles anidados
print(granpalabra, grancontador)
Resumen
• ¿Qué es una “colección”? • Indexado y falta de orden

• Listas contra Diccionarios • Escribiendo bucles de


diccionarios
• Constantes de Diccionarios
• Un vistazo: tuplas
• La palabra más común
• Ordenando diccionarios
• Usando el método get()
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-05-19


Tuplas
Capítulo 10

Python para Todos


es.py4e.com
Las Tuplas Son Como Listas
Las tuplas son otro tipo de secuencia que funciona de forma
parecida a una lista – tienen elementos indexados
empezando desde 0
>>> x = ('Glenn', 'Sally', 'Joseph') >>> for iter in y:
>>> print(x[2]) ... print(iter)
Joseph ...
>>> y = ( 1, 9, 2 ) 1
>>> print(y) 9
(1, 9, 2) 2
>>> print(max(y)) >>>
9
pero... Las Tuplas son
“inmutables”
A diferencia de una lista, una vez que creas una tupla,
no puedes alterar su contenido – de forma similar a una
cadena
>>> x = [9, 8, 7] >>> y = 'ABC' >>> z = (5, 4, 3)
>>> x[2] = 6 >>> y[2] = 'D' >>> z[2] = 0
>>> print(x) Traceback:'str' Traceback:'tuple'
>>>[9, 8, 6] object does object does
>>> not support item not support item
Assignment Assignment
>>> >>>
Cosas que no se deben Hacer
con Tuplas
>>> x = (3, 2, 1)
>>> x.sort()
Traceback:
AttributeError: 'tuple' object has no attribute 'sort'
>>> x.append(5)
Traceback:
AttributeError: 'tuple' object has no attribute 'append'
>>> x.reverse()
Traceback:
AttributeError: 'tuple' object has no attribute 'reverse'
>>>
Un Cuento sobre Dos
Secuencias
>>> l = list()
>>> dir(l)
['append', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']

>>> t = tuple()
>>> dir(t)
['count', 'index']
Las Tuplas Son Más
Eficientes
• Puesto que Python no tiene que construir la estructura de
una tupla de modo que sea modificable, las tuplas son
más simples y eficientes, en términos de uso de memoria
y desempeño, que una lista

• Así que en nuestros programas, cuando creamos


“variables temporales”, preferimos tuplas en vez de listas
Tuplas y Asignaciones
• También podemos poner una tupla en el lado izquierdo de
una sentencia de asignación
• Incluso podemos omitir los paréntesis

>>> (x, y) = (4, 'fred')


>>> print(y)
fred
>>> (a, b) = (99, 98)
>>> print(a)
99
Tuplas y Diccionarios
>>> d = dict()
>>> d['csev'] = 2
>>> d['cwen'] = 4
El método items() >>> for (k,v) in d.items():
en un diccionario ... print(k, v)
retorna una lista de ...
tuplas (clave, csev 2
valor) cwen 4
>>> tups = d.items()
>>> print(tups)
dict_items([('csev', 2), ('cwen', 4)])
Las Tuplas son Comparables
Los operadores de comparación funcionan con tuplas y
otras secuencias. Si el primer elemento es igual, Python
revisa el siguiente elemento y así sucesivamente, hasta
que encuentra elementos diferentes.
>>> (0, 1, 2) < (5, 1, 2)
True
>>> (0, 1, 2000000) < (0, 3, 4)
True
>>> ( 'Jones', 'Sally' ) < ('Jones', 'Sam')
True
>>> ( 'Jones', 'Sally') > ('Adams', 'Sam')
True
Ordenando Listas de Tuplas
• Podemos aprovechar la habilidad de ordenar una lista de
tuplas para obtener una versión ordenada de un
diccionario
• Primero, ordenamos el diccionario basado en las claves
utilizando el método items() y la función sorted()
>>> d = {'a':10, 'b':1, 'c':22}
>>> d.items()
dict_items([('a', 10), ('c', 22), ('b', 1)])
>>> sorted(d.items())
[('a', 10), ('b', 1), ('c', 22)]
Usando sorted()
>>> d = {'a':10, 'b':1, 'c':22}
Incluso podemos hacer >>> t = sorted(d.items())
esto de forma más >>> t
directa usando [('a', 10), ('b', 1), ('c', 22)]
directamente la función >>> for c, v in sorted(d.items()):
... print(c, v)
nativa sorted, la cual
...
toma una secuencia
a 10
como parámetro y b 1
retorna una secuencia c 22
ordenada
Ordenamiento por Valores en
Lugar de Claves
• Si pudiéramos construir >>> c = {'a':10, 'b':1, 'c':22}
una lista de tuplas en la >>> tmp = list()
forma (valor, clave), >>> for cl, v in c.items() :
podríamos ordenar ... tmp.append( (v, cl) )
...
(sort) por valor
>>> print(tmp)
• Hacemos esto con un [(10, 'a'), (22, 'c'), (1, 'b')]
>>> tmp = sorted(tmp, reverse=True)
bucle for que crea una >>> print(tmp)
lista de tuplas [(22, 'c'), (10, 'a'), (1, 'b')]
El top 10 de las
man_a = open('romeo.txt’)
contadores = dict() palabras más
for linea in man_a: comunes
palabras = linea.split()
for palabra in palabras:
contadores[palabra] = contadores.get(palabra, 0 ) + 1

lst = list()
for clave, val in contadores.items():
nuevatup = (val, clave)
lst.append(nuevatup)

lst = sorted(lst, reverse=True)

for val, clave in lst[:10] :


print(clave, val)
Una Versión Todavía Más Corta
>>> c = {'a':10, 'b':1, 'c':22}

>>> print( sorted( [ (v,c) for k,v in c.items() ] ) )

[(1, 'b'), (10, 'a'), (22, 'c')]


La comprensión de listas crea una lista dinámica. En
este caso, creamos una lista de tuplas invertidas y
después las ordenamos.
http://wiki.python.org/moin/HowTo/Sorting
Resumen
• Sintaxis de Tuplas • Tuplas en sentencias
de asignación
• Inmutabilidad
• Ordenamiento de
• Comparabilidad
diccionarios por clave
• Ordenamiento o valor
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-05-19


Expresiones Regulares

Capítulo 11

Python para Todos


es.py4e.com
Expresiones Regulares
En la computación, una expresión regular, también
conocida como “regex” o “regexp”, provee una
forma concisa y flexible para encontrar cadenas de
texto tales como caracteres específicos, palabras, o
patrones de caracteres. Una expresión regular está
escrita en un lenguaje formal que puede ser
interpretado por un procesador de expresiones
regulares.
https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
Expresiones Regulares
Expresiones “comodines” realmente inteligentes
para encontrar y analizar cadenas

http://en.wikipedia.org/wiki/Regular_expression
El muy inteligente “Búscar” o “Encontrar”
(“Search” o “Find” en inglés)
Entendiendo Expresiones Regulares
• Muy poderoso y un poco críptico
• Divertido una vez que los entiendes
• Las expresiones regulares son un lenguaje en sí mismas
• Un lenguaje de “caracteres marcados” – programando
con caracteres
• Es un tipo de lenguaje de la “vieja escuela” - compacto
http://xkcd.com/208/
Guia rápida de Expresiones Regulares
^ Encuentra el inicio de la línea
$ Encuentra el final de la línea
. Encuentra cualquier carácter
\s Encuentra espacio en blanco
\S Encuentra cualquier carácter que no sea espacio en blanco
* Repite un carácter cero o más veces
*? Repite un carácter cero o más veces (no-codicioso)
+ Repite un carácter una o más veces
+? Repite un carácter una o más veces (no-codicioso)
[aeiou] Encuentra un solo carácter en un conjunto
[^XYZ] Encuentra un solo carácter que no se encuentre un conjunto
[a-z0-9] El conjunto de caracteres puede incluir un rango
( Indica cuando una extracción de una cadena comienza
) Indica cuando una extracción termina

https://es.py4e.com/lectures3/Pythonlearn-11-Regex-Handout.txt
El Módulo de Expresiones Regulares
• Antes de que puedas usar expresiones regulares en tu
programa, debes importar la librería utilizando “import re”

• Puedes usar re.search() para ver si una cadena coincide con


una expresión regular, similar a usar el método find() de una
cadena

• Puedes usar re.findall() para extraer porciones de una cadena


que coincidan con tu expresión regular, similar a la
combinación de find() y rebanado de cadenas: var[5:10]
Usando re.search() Como find()

import re
manejador = open('mbox-short.txt')
for linea in manejador: manejador = open('mbox-short.txt')
linea = linea.rstrip() for linea in manejador:
if linea.find('From:') >= 0: linea = linea.rstrip()
print(linea) if re.search('From:', linea) :
print(linea)
Usando re.search() Como startswith()
import re
manejador = open('mbox-short.txt')
for linea in manejador: manejador = open('mbox-short.txt')
linea = linea.rstrip() for linea in manejador:
if linea.startswith('From:') : linea = linea.rstrip()
print(linea) if re.search('^From:', linea) :
print(linea)

Ajustamos lo que coincide agregando caracteres especiales a la cadena


Caracteres comodín
• El carácter punto encuentra cualquier carácter

• Si agregas el carácter de asterisco, el carácter es “cualquier


número de veces”
Muchas
Encuentra el inicio de
veces
X-Sieve: CMU Sieve 2.3 línea
X-DSPAM-Result: Innocent
X-DSPAM-Confidence: 0.8475
X-Content-Type-Message-Body: text/plain
^X.*:
Encuentra cualquier
carácter
Ajustando Tu Coincidencia
Dependiendo que tan “limpios” estén tus datos y el propósito
de tu aplicación, puedes reducir tu coincidencia un poco

Encuentra el Muchas
inicio de línea veces
X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-Plane is behind schedule: two weeks
X-: Very short
^X.*:
Encuentra cualquier
carácter
Ajustando Tu Coincidencia
Dependiendo que tan “limpios” estén tus datos y el propósito
de tu aplicación, puedes reducir tu coincidencia un poco

Una o más
X-Sieve: CMU Sieve 2.3 Encuentra el inicio
veces
X-DSPAM-Result: Innocent de línea
X-: Very Short
X-Plane is behind schedule: two weeks ^X-\S+:
Encuentra cualquier carácter que no sea
espacio en blanco
Buscando y Extrayendo Datos
• re.search() retorna True/False dependiendo de si la cadena
coincide con la expresión regular

• Si de hecho queremos extraer la coincidencia, usamos


re.findall()
>>> import re
[0-9]+ >>> x = 'Mis 2 números favoritos son 19 y 42'
>>> y = re.findall('[0-9]+',x)
>>> print(y)
['2', '19', '42']
Uno o más digitos
Buscando y Extrayendo Datos
Cuando usamos re.findall(), la función regresa una lista de cero
o más sub-cadenas que coinciden con la expresión regular

>>> import re
>>> x = 'Mis 2 números favoritos son 19 y 42'
>>> y = re.findall('[0-9]+',x)
>>> print(y)
['2', '19', '42']
>>> y = re.findall('[AEIOU]+',x)
>>> print(y)
[]
Advertencia: Búsqueda Codiciosa
Los caracteres para repetir (* y +) se extienden en ambas
direcciones (de forma codiciosa) para encontrar la cadena
más larga posible
Uno o más caracteres
>>> import re
>>> x = 'Desde: Usando el : caracter'
>>> y = re.findall('^D.+:', x)
>>> print(y)
^D.+:
['Desde: Usando el :']

¿Por qué no El primer carácter El último carácter es


“Desde:” ? es una D un :
Búsqueda No-Codiciosa
¡No todos los códigos de repetición de las
expresiones regulares son codiciosos! Si agregas Uno o más
el carácter ?, el + y * se relajan un poco... caracteres pero
no codicioso
>>> import re
>>> x = 'From: Using the : character'
>>> y = re.findall('^F.+?:', x) ^F.+?:
>>> print(y)
['From:']
El primer carácter El último carácter es
es una F un :
Ajustando Extracción de Cadenas
Puedes redefinir la coincidencia de re.findall() y determinar de
forma separada qué porción de la coincidencia va a ser
extraída utilizando paréntesis

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

\S+@\S+
>>> y = re.findall('\S+@\S+',x)
>>> print(y)
['stephen.marquard@uct.ac.za’]
Al menos un
carácter que no es
espacio en blanco
Ajustando Extracción de Cadenas
Los Paréntesis no son parte de la coincidencia – pero indican
dónde empieza y termina cuál cadena extraer

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

>>> y = re.findall('\S+@\S+',x)
>>> print(y)
['stephen.marquard@uct.ac.za']
^From (\S+@\S+)
>>> y = re.findall('^From (\S+@\S+)',x)
>>> print(y)
['stephen.marquard@uct.ac.za'] Al menos un
carácter que no es
espacio en blanco
Ejemplos de análisis de cadenas…
21 31

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

>>> data = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'


>>> atpos = data.find('@')
>>> print(atpos) Extrayendo un
21
>>> sppos = data.find(' ',atpos) nombre de un
>>> print(sppos) equipo – usando
31
>>> host = data[atpos+1 : sppos] find y rebanado de
>>> print(host) cadenas
uct.ac.za
El Patrón de Doble División
A veces dividimos una línea en una forma, después tomamos
una de las piezas de esa línea y la dividimos de nuevo

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

palabras = linea.split() stephen.marquard@uct.ac.za


email = palabras[1] ['stephen.marquard', 'uct.ac.za']
piezas = email.split('@')
print(piezas[1]) 'uct.ac.za'
La Versión Regex
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'

Busca a través de la cadena hasta encontrar una arroba


La Versión Regex
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'

Encuentra un carácter que no Encuentra muchos de


sea espacio en blanco ellos
La Versión Regex
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'

Extrae los caracteres que no sean


espacios en blanco
Versión Regex Incluso Más Cool
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]*)'

Comenzando por el inicio de la línea, busca la cadena 'From '


Versión Regex Incluso Más Cool
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]*)'

Saltar un grupo de caracteres, buscando un signo de arroba


Versión Regex Incluso Más Cool
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

'^From .*@([^ ]*)'


['uct.ac.za']

Comienza a extraer
Versión Regex Incluso Más Cool
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]+)'

Encuentra un carácter que Encuentra muchos


no sea espacio en blanco de ellos
Versión Regex Incluso Más Cool
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]+)'

Detenerse de extraer
Confianza de Spam
import re
manejador = open('mbox-short.txt')
numlist = list()
for linea in manejador:
linea = linea.rstrip()
cosa = re.findall('^X-DSPAM-Confidence: ([0-9.]+)', linea)
if len(cosa) != 1 : continue
num = float(cosa[0])
numlist.append(num)
print('Máximo:', max(numlist)) python ds.py
Máximo: 0.9907
X-DSPAM-Confidence: 0.8475
Carácter de Escape
Si quieres que un carácter en una expresión regular se
comporte normalmente (la mayoría del tiempo) debes agregar
un prefijo con '\'
>>> import re Al menos
>>> x = 'Acabamos de recibir $10.00 para galletas.'
>>> y = re.findall('\$[0-9.]+',x)
uno o más
>>> print(y)
['$10.00']
\$[0-9.]+

Un signo de pesos real Un dígito o punto


Resumen
• Las expresiones regulares son un lenguaje críptico pero
poderoso para buscar cadenas y extraer elementos de
ellas
• Las expresiones regulares tienen caracteres especiales
que indican la intención de búsqueda
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-06-01


Programas en Red

Capítulo 12

Python para Todos


es.py4e.com
Un Libro Gratis acerca
de Arquitectura de
Redes

Si te interesa aprender
más sobre esta área o
necesitas más detalles
www.net-intro.com
Protocolo de Control de Transmisión
(TCP)
Construido sobre el protocolo IP
(Internet Protocol)

Asume que IP podría perder datos


– almacena y retransmite datos
si parece que están perdidos

Maneja el “control de flujo” usando


una ventana de transmisión

Provee un camino de transmisión Fuente:


https://es.wikipedia.org/wiki/Familia_de_protocolos_de_internet
de confianza
https://es.wikipedia.org/wiki/Tel%C3%A9fono_de_lata

http://www.flickr.com/photos/kitcowan/2103850699/
Conexiones TCP / Sockets
“En las redes de computadoras, un socket de Internet o socket de
red es un punto de flujo de comunicación bidireccional entre-
procesos a través de una red de computadoras basadas en un
protocolo de Internet, tal como el Internet.”

Proceso Internet Proceso

https://es.wikipedia.org/wiki/Socket_de_Internet
Números de Puerto TCP
• Un puerto es una aplicación-específica o un programa
de punto final de un software de procesos específicos
de comunicaciones
• Permiten que múltiples aplicaciones en red coexistan
en el mismo servidor
• Existe una lista de números de puerto estandarizados

https://es.wikipedia.org/wiki/Puerto_de_red
www.umich.edu
E-Mail 25
Entrante

bla bla bla


Inicio de 23 bla bla
Sesión
74.208.28.177
80
Servidor Web
443

Bandeja de 109
Entrada
Personal 110

Clipart: http://www.clker.com/search/networksym/1
Puertos TCP Comunes
• Telnet (23) – Inicio de • IMAP (143/220/993) – Recuperación
Sesión de Email
• SSH (22) – Inicio de • POP (109/110) – Recuperación de
Sesión seguro Email
• HTTP (80) • DNS (53) – Nombre de dominio
• HTTPS (443) – Seguro • FTP (21) – Transferencia de Archivos
• SMTP (25) (Email)
https://es.wikipedia.org/wiki/Anexo:Puertos_de_red
A veces vemos el número
de puerto en la URL si el
servidor web está
corriendo en un puerto
“no-estándar”.
Sockets en Python
Python tiene soporte nativo para Sockets TCP

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )

Host Port

http://docs.python.org/library/socket.html
http://xkcd.com/353/
Protocolos de Aplicación
Protocolos de Aplicación
Puesto que TCP (y Python) nos dan
un socket estable, ¿qué
queremos hacer con el socket?
¿Qué problema queremos
resolver?

Protocolos de Aplicación

- Correo

- World Wide Web (Red Fuente:


https://es.wikipedia.org/wiki/Familia_de_protocolos_de_internet
informática virtual)
HTTP – Protocolo de Transferencia
de Hypertexto
El Protocolo de la Capa de Aplicación dominante del Internet

Inventado para la Web – para obtener HTML, Imágenes,


Documentos, etc.

Extendido para ser datos en adición a documentos - RSS,


Servicios Web, etc. – Conceptos Básicos – Hacer una conexión
– Solicitar un documento – Recuperar el Documento – Cerrar la
Conexión
https://es.wikipedia.org/wiki/Protocolo_de_transferencia_de_hipertexto
HTTP
El Protocolo de Transferencia de HyperTexto es
un conjunto de reglas que permiten a los
buscadores obtener documentos web desde
servidores en el Internet
¿Qué es un Protocolo?
Un conjunto de reglas que todas las partes
deben seguir para que se pueda predecir el
comportamiento de otros
Y no chocar con los demás

- En los caminos de doble sentido en USA,


se maneja en el lado derecho del camino

- En caminos de doble sentido en el Renio


Unido, se maneja en el lado izquierdo del
camino
http://www.dr-chuck.com/page1.htm

protocolo host documento


(huésped)

http://www.youtube.com/watch?v=x2GylLq59rI
Robert Cailliau
1:17 - 2:19 CERN
Obteniendo Datos desde El Servidor
Cada vez que el usuario da un clic en una etiqueta de anclaje con un
valor href= para cambiar a una nueva página, el buscador hace una
conexión al servidor web e inicia una solicitud “GET” – para obtener
(get) el contenido de una página en una URL específica.
El servidor regresa un documento HTML al navegador, el cual formatea
y muestra el documento al usuario.
Servidor Web
80

Navegador
Servidor Web
80

Navegador
Clic
Solicitud Servidor Web
80

GET http://www.dr-chuck.com/page2.htm

Navegador
Clic
Solicitud Servidor Web
80

GET http://www.dr-chuck.com/page2.htm

Navegador
Clic
Solicitud Servidor Web Respuesta

80
<h1>The Second
Page</h1><p>If you like, you
can switch back to the <a
href="page1.htm">First
GET http://www.dr-chuck.com/page2.htm Page</a>.</p>

Navegador
Clic
Solicitud Servidor Web Respuesta

80
<h1>The Second
Page</h1><p>If you like, you
can switch back to the <a
href="page1.htm">First
GET http://www.dr-chuck.com/page2.htm Page</a>.</p>

Navegador
Clic Analizar/
Renderizar
Estándares de Internet
Los estándares para todos los
protocolos de Internet (mecanismos
internos) son desarrollados por una
organización
Grupo de Trabajo de Ingeniería de
Internet (IETF, por sus siglas en
inglés)
www.ietf.org
Los Estándares son conocidos como
“RFCs” - “Request for Comments”
(solicitudes de comentarios)
Fuente: http://tools.ietf.org/html/rfc791
http://www.w3.org/Protocols/rfc2616/rfc2616.txt
Haciendo una solicitud HTTP
Conectar al servidor como www.dr-chuck.com
Solicitar un documento (o el documento por defecto)
– GET http://www.dr-chuck.com/page1.htm HTTP/1.0
– GET http://www.mlive.com/ann-arbor/ HTTP/1.0
– GET http://www.facebook.com HTTP/1.0
$ telnet www.dr-chuck.com 80 Servidor Web
Trying 74.208.28.177...
Connected to www.dr-chuck.com.Escape character is '^]'.
GET http://www.dr-chuck.com/page1.htm HTTP/1.0

HTTP/1.1 200 OK
Date: Thu, 08 Jan 2015 01:57:52 GMT
Last-Modified: Sun, 19 Jan 2014 14:25:43 GMT
Connection: close
Content-Type: text/html
Navegador
<h1>The First Page</h1>
<p>If you like, you can switch to
the <a href="http://www.dr-chuck.com/page2.htm">Second
Page</a>.</p>
Connection closed by foreign host.
Hacking preciso en las
Películas
Matrix Reloaded
Bourne Ultimatum
Die Hard 4
...

http://nmap.org/movies.html
¡Vamos Escribiendo un
Navegador Web!
Una Solicitud HTTP en Python
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True: Tu programa


datos = mysock.recv(512) es.py4e.com

if (len(datos) < 1): •



Socket
Conexión Páginas Web
SOCKET Puerto 80
break •

Enviar
Recibir
.
.
print(datos.decode(),end='') .

mysock.close()
HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Encabezado HTTP
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea" while True:
Accept-Ranges: bytes datos = mysock.recv(512)
Content-Length: 167 if ( len(datos) < 1 ) :
Connection: close break
Content-Type: text/plain print(datos.decode())

But soft what light through yonder window breaks


It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief Cuerpo HTTP
Acerca de Caracteres y Cadenas…
ASCII
Código
Estándar
Estadounidense
para el
Intercambio de
Información

(American
Standard Code
for Information
Interchange)
https://es.wikipedia.org/wiki/ASCII
http://www.catonmat.net/download/ascii-cheat-sheet.png
Representando Cadenas Sencillas
Cada carácter está representado
por un número entre 0 y 256
almacenado en 8 bits de memoria. >>> print(ord('H'))
Nos referimos a 8 bits de memoria 72
como un "byte" de memoria – (i.e. >>> print(ord('e'))
101
mi disco contiene 3 Terabytes de >>> print(ord('\n'))
memoria) 10
La función ord() nos dice el valor >>>
numérico de un simple carácter
ASCII
ASCII

>>> print(ord('H'))
72
>>> print(ord('e'))
101
>>> print(ord('\n'))
10
>>>

En los 1960s y 1970s,


se asumió que un byte
sería un carácter
http://unicode.org/charts/
Caracteres Multi-Bytes
Para representar el amplio rango de caracteres las computadoras deben saber que
representamos caracteres con más de un byte.
– UTF-16 – Tamaño Fijo – Dos bytes https://es.wikipedia.org/wiki/UTF-8
– UTF-32 – Tamaño Fijo – Cuatro Bytes
– UTF-8 – 1-4 bytes
- Compatible con ASCII
- Detección automática entre ASCII y UTF-8
- UTF-8 es una práctica recomendada para
codificar datos para ser intercambiados entre sistemas
Dos Tipos de Cadenas en
Python 2.7.10
Python
Python 3.5.1
>>> x = '이광춘' >>> x = '이광춘'
>>> type(x) >>> type(x)
<type 'str'> <class 'str'>
>>> x = u'이광춘' >>> x = u'이광춘'
>>> type(x) >>> type(x)
<type 'unicode'> <class 'str'>
>>> >>>

En Python 3, todas las cadenas


son Unicode
Python 2 versus Python 3
Python 2.7.10 Python 3.5.1
>>> x = b'abc' >>> x = b'abc'
>>> type(x) >>> type(x)
<type 'str'> <class 'bytes'>
>>> x = '이광춘' >>> x = '이광춘'
>>> type(x) >>> type(x)
<type 'str'> <class 'str'>
>>> x = u'이광춘' >>> x = u'이광춘'
>>> type(x) >>> type(x)
<type 'unicode'> <class 'str'>
Python 3 y Unicode
En Python 3, internamente, todas las Python 3.5.1
cadenas son UNICODE . >>> x = b'abc'
Trabajando con variables de cadenas >>> type(x)
en programas de Python y leyendo <class 'bytes'>
datos de archivos simplemente >>> x = '이광춘'
“funciona”.
>>> type(x)
Cuando hablamos con un recurso en <class 'str'>
la red utilizando sockets o hablamos
a una base de datos tenemos que >>> x = u'이광춘'
codificar y decodificar los datos >>> type(x)
(usualmente a UTF-8) <class 'str'>
Cadenas de Python a Bytes
Cuando hablamos con un recurso externo como un socket de red enviamos
bytes, así que necesitamos codificar las cadenas de Python 3 en una
codificación específica de caracteres.
Cuando leemos datos de una fuente externa, debemos decodificarlos
basados en un set de caracteres de modo que sean representados
propiamente en Python 3 como una cadena.
while True:
datos = mysock.recv(512)
if ( len(datos) < 1 ) :
break
mystring = datos.decode()
print(mystring)
Una solicitud HTTP en Python
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

while True: Tu programa


datos = mysock.recv(512) es.py4e.com

if (len(datos) < 1): •



Socket
Conexión Páginas Web
SOCKET Puerto 80
break •

Enviar
Recibir
.
.
print(datos.decode()) .

mysock.close()
https://docs.python.org/3/library/stdtypes.html#bytes.decode
https://docs.python.org/3/library/stdtypes.html#str.encode
decode() Bytes recv()
UTF-8
Unicode Socket Red
De Cadenas
Bytes
encode() send()
UTF-8

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

while True:
datos = mysock.recv(512)
if (len(datos) < 1):
break
print(datos.decode())
mysock.close()
Haciendo HTTP Más Facil Con
urllib
Usando urllib en Python
Puesto que HTTP es tan común, tenemos una librería que hace
todo el trabajo del socket por nosotros y hace que las páginas
web se vean como un archivo

import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for linea in fhand:
print(linea.decode().strip())

urllib1.py
import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for linea in fhand:
print(linea.decode().strip())

But soft what light through yonder window breaks


It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

urllib1.py
Como un Archivo...
import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt’)

contadores = dict()
for linea in fhand:
palabras = line.decode().split()
for palabra in palabras:
contadores[palabra] = contadores.get(palabra, 0) + 1
print(contadores)
urlwords.py
Leyendo Páginas Web
import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for linea in fhand:
print(linea.decode().strip())

<h1>The First Page</h1>


<p>If you like, you can switch to the <a
href="http://www.dr-chuck.com/page2.htm">Second
Page</a>.
</p>
urllib2.py
Siguiendo Links
import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for linea in fhand:
print(linea.decode().strip())

<h1>The First Page</h1>


<p>If you like, you can switch to the <a
href="http://www.dr-chuck.com/page2.htm">Second
Page</a>.
</p>
urllib2.py
¿Las Primeras Líneas de Código
de Google?
import urllib.request, urllib.parse, urllib.error

fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for linea in fhand:
print(linea.decode().strip())
Analizando HTML
(conocido como Raspado Web,
o Web Scrapping en inglés)
¿Qué es el Raspado Web?
• Cuando un programa o script pretende ser un navegador y
obtiene páginas web, revisa esas páginas, extrae
información, y luego busca por más páginas web.

• Los Motores de Búsqueda “raspan” las páginas web – a


esto se le conoce como “rascar la web” o “rastrear la web”.

https://es.wikipedia.org/wiki/Web_scraping
https://es.wikipedia.org/wiki/Ara%C3%B1a_web
¿Por qué hacer Raspado?
• Obtener datos – particularmente datos sociales - ¿quién
lleva a quién?

• Obtener tus propios datos respaldados desde algún


sistema que no tiene “capacidades de exportación”.

• Monitorear un sitio para obtener nueva información.


• Arañar la web para crear una base de datos para un motor
de búsqueda.
Rascando Páginas Web
• Hay cierta controversia acerca del raspado de la web y
algunos sitios web son un poco delicados acerca de esto.

• Republicar información con derechos de autor no es


permitido.

• Violar términos del servicio no está permitido


El Camino Fácil - Beautiful Soup
• Puedes hacer búsquedas de cadenas por el camino difícil

• O utilizar la librería de software libre BeautifulSoup de


www.crummy.com

https://www.crummy.com/software/BeautifulSoup/
Instalación de BeautifulSoup
# Para ejecutar esto, puedes instalar BeautifulSoup
# https://pypi.python.org/pypi/beautifulsoup4

# O descargar el archivo
# http://www.py4e.com/code3/bs4.zip
# y descomprimirlo en el mismo directorio de este archivo

import urllib.request, urllib.parse, urllib.error


from bs4 import BeautifulSoup

...
urllinks.py
import urllib.request, urllib.parse,
urllib.error
from bs4 import BeautifulSoup

url = input('Ingresa - ')


html = urllib.request.urlopen(url).read()
sopa = BeautifulSoup(html, 'html.parser')

# Recuperar todas las etiquetas de anclaje


etiquetas = sopa('a')
for etiqueta in etiquetas:
print(etiqueta.get('href', None))

python urllinks.py
Ingresa - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm
Resumen
El protocolo TCP/IP nos brinda sockets entre aplicaciones

Diseñamos protocolos de aplicación para hacer uso de


esas conexiones

El Protocolo de Transferencia de HyperTexto (HTTP) es un


protocolo simple pero poderoso

Python tiene buen soporte para sockets, HTTP, y análisis de


HTML
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-06-20


Usando Servicios Web
Capítulo 13

Python para Todos


es.py4e.com
Datos en la Web
Después de que las Solicitudes/Respuestas HTTP fueron bien
entendidas y soportadas, hubo una transición natural hacia el
intercambio de datos entre programas utilizando esos
protocolos.
Era necesario llegar a una forma de representar datos moviéndose
entre aplicaciones y entre redes.

Hay dos formatos utilizados comúnmente: XML y JSON


Envío de Datos a través de la
“Red”
Array de Objeto de
PHP {
JavaScript
"name" : "Chuck",
"phone" : "303-4456"
}
Diccionario HashMap
de Python de Java
También conocido como “Protocolo de Cable” – Lo que
enviamos por el “cable”
Acordando un “Formato de
Cableado”
<persona>
<nombre>
De-Serializar
Chuck
Diccionario </nombre> HashMap
de Python <telefono> de Java
303 4456
Serializar
</telefono>
</persona>
XML
Acordando un “Formato de
Cableado”
De-Serializar
{
Diccionario “nombre" : "Chuck", HashMap
de Python }
“telefono" : "303-4456"
de Java
Serializar

JSON
XML
Marcando datos para enviarlos a través de la red...

http://es.wikipedia.org/wiki/XML
“Elementos” XML (o Nodos)
<gente>
<persona>
<nombre>Chuck</ nombre >
<telefono>303 4456</ telefono >
• Elemento Simple </persona>
• Elemento Complejo <persona>
<nombre>Noah</nombre>
<telefono>622 7421</telefono>
</persona>
</gente>
eXtensible Markup Language
El propósito principal es ayudar a sistemas de información a
compartir datos estructurados
Comenzó como un subconjunto simplificado del Lenguaje de
Marcado Generalizado Estándar (SGML - Standard
Generalized Markup Language, por sus siglas en Inglés) y
está diseñado para ser relativamente legible para los
humanos
http://es.wikipedia.org/wiki/XML
Elementos básicos de XML
• Etiqueta inicial <persona>
<nombre>Chuck</nombre>
• Etiqueta final <telefono tipo="intl">
• Contenido de texto +1 734 303 4456
• Atributo </telefono>
<email ocultar="yes" />
• Etiqueta de auto-finalizado </persona>
Espacio en Blanco
<persona> Los saltos de línea no
<nombre>Chuck</nombre> importan. El espacio en
<telefono tipo="intl"> blanco es generalmente
+1 734 303 4456 descartado en elementos de
</telefono> texto. Sólo indentamos para
<email ocultar="yes" /> hacerlo legible.
</persona>
<person>
<name>Chuck</name>
<phone type="intl">+1 734 303 4456</phone>
<email hide="yes" />
</person>
Terminología XML
Etiquetas - Indican el inicio y el final de los elementos
Atributos - Pares clave/valor en una etiqueta de inicio de XML
Serializar / De-Serializar - Convertir datos de un programa en un
formato común que puede ser almacenado y/o transmitido entre
sistemas, de modo que no dependa de un lenguaje de
programación específico

http://es.wikipedia.org/wiki/Serializaci%C3%B3n
XML como un Árbol
a
<a>
<b>X</b>
<c>
b c
<d>Y</d>
<e>Z</e>
</c> X d e
</a>

Elementos Texto Y Z
Texto y Atributos en XML
a
<a>
<b w="5">X</b>
<c> w
b Nodo
c
<d>Y</d> atrib texto
<e>Z</e>
</c> 5 X d e
</a>

Elementos Texto Y Z
XML como Rutas a
<a>
<b>X</b>
b c
<c> /a/b X
<d>Y</d> /a/c/d Y
<e>Z</e> /a/c/e Z X d e
</c>
</a>
Y Z
Elementos Texto
Esquema XML
Describiendo un “contrato” como lo que es un XML aceptable

http://es.wikipedia.org/wiki/XML_Schema
http://en.wikibooks.org/wiki/XML_Schema
Esquema XML
Descripción del formato legal de un documento XML

Expresado en términos de reglas en la estructura y contenido de


documentos

Usualmente utilizado para especifica un “contrato” entre sistemas -


“Mi sistema solo aceptará XML que se ajuste a este Esquema
particular.”

Si una pieza de XML en particular cumple con la especificación del


Esquema - se le llama “validar”
http://es.wikipedia.org/wiki/XML_Schema
Validación XML
Documento
XML

Esquema de
Validador
Contrato XML
Documento XML Validación XML
<persona>
<apellido>Severance</apellido >
<edad>17</edad>
<nacimiento>2001-04-17</nacimiento>
</persona>
Esquema de Contrato
XML
<xs:complexType name=”persona”>
<xs:sequence>
Validator
<xs:element name=“apellido" type="xs:string"/>
<xs:element name=“edad" type="xs:integer"/>
<xs:element name=“nacimiento" type="xs:date"/>
</xs:sequence>
</xs:complexType>
Muchos Lenguajes de
Esquemas XML
Declaración de Tipo de Documento (DTD)

- http://es.wikipedia.org/wiki/Declaraci%C3%B3n_de_tipo_de_documento

Standard Generalized Markup Language (ISO 8879:1986 SGML)

- http://es.wikipedia.org/wiki/SGML

Esquema XML de W3C - (XSD)

- http://es.wikipedia.org/wiki/XML_Schema

http://es.wikipedia.org/wiki/XML_Schema
Esquema XSD XML
(especificación W3C)
Vamos a enfocarnos en la versión del World Wide Web Consortium
(W3C)

Es comúnmente llamado “Esquema W3C” debido a que “Esquema” es


considerado genérico

Más comúnmente es llamado XSD porque los nombres de archivo


terminan en .xsd
http://www.w3.org/XML/Schema
http://es.wikipedia.org/wiki/XML_Schema
Estructura <persona>
XSD <apellido>Severance</apellido>
<edad>17</edad>
<nacimiento>2001-04-17</nacimiento>
</persona>
xs:element

<xs:complexType name=”persona”>
xs:sequence <xs:sequence>
<xs:element name=“apellido" type="xs:string"/>
<xs:element name=“edad" type="xs:integer"/>
xs:complexType <xs:element name=“nacimiento" type="xs:date"/>
</xs:sequence>
</xs:complexType>
<xs:element name="persona">
<xs:complexType> Reglas XSD
<xs:sequence>
<xs:element name=“nombre_completo" type="xs:string"
minOccurs="1" maxOccurs="1" />
<xs:element name=“nombre_hijo" type="xs:string"
minOccurs="0" maxOccurs="10" />
</xs:sequence>
</xs:complexType> <persona>
</xs:element> <nombre_completo>Tove Refsnes</nombre_completo>
<nombre_hijo>Hege</nombre_hijo>
<nombre_hijo>Stale</nombre_hijo>
<nombre_hijo>Jim</nombre_hijo>
<nombre_hijo>Borge</nombre_hijo>
</persona>

http://www.w3schools.com/Schema/schema_complex_indicators.asp
<xs:element name=“cliente" type="xs:string"/>
Tipos de
<xs:element name=“inicio" type="xs:date"/>
<xs:element name=“fechadeinicio" type="xs:dateTime"/>
Datos XSD
<xs:element name=“premio" type="xs:decimal"/>
<xs:element name=“semanas" type="xs:integer"/>

<cliente>John Smith</cliente>
Es común representar el
<inicio>2002-09-24</inicio>
tiempo en UTC/GMT, dado
que los servidores están <fechadeinicio>2002-05-30T09:30:10Z</fechadeinicio>
regados por todo el mundo <prize>999.50</premio>
<weeks>30</semanas>

http://www.w3schools.com/Schema/schema_dtypes_numeric.asp
ISO 8601 Formato de Fecha/Hora
2002-05-30T09:30:10Z
Hora del Zona horaria –
Año-Mes-Día tipicamente especificada
día
en UTC / GMT en vez de
la zona horaria local
http://es.wikipedia.org/wiki/ISO_8601
http://es.wikipedia.org/wiki/Tiempo_universal_coordinado
http://www.w3schools.com/Schema/schema_example.asp
xml1.py
import xml.etree.ElementTree as ET
data = '''<persona>
<nombre>Chuck</nombre>
<telefono type="intl">
+1 734 303 4456
</telefono>
<email ocultar="si"/>
</persona>'''

tree = ET.fromstring(data)
print('Nombre:',tree.find('nombre').text)
print('Atributo:',tree.find('email').get('ocultar'))
import xml.etree.ElementTree as ET
datos = '''
<cosa> xml2.py
<usuarios>
<usuario x="2">
<id>001</id>
<nombre>Chuck</nombre>
</usuario>
<usuario x="7">
<id>009</id>
<nombre>Brent</nombre>
</usuario>
</usuarios>
</cosa>'''

cosa = ET.fromstring(datos)
lst = cosa.findall('usuarios/usuario')
print('Total de usuarios:', len(lst))

for item in lst:


print('Nombre', item.find('nombre').text)
print('Id', item.find('id').text)
print('Atributo', item.get('x'))
Notación de Objetos de
JavaScript
Notación de Objetos de
JavaScript
• JavaScript Object Notation
• Douglas Crockford -
“Descubrió” JSON
• Notación literal de Objetos en
JavaScript

http://www.youtube.com/watch?v=kc8BAR7SHJI
import json
json1.py
datos = '''
{
"nombre" : "Chuck",
"teléfono" : {
"tipo" : "intl", JSON representa datos
"número" : "+1 734 303 4456" como “listas” anidadas y
}, “diccionarios”
"email" : {
"oculto" : "si"
}
}'''

info = json.loads(datos)
print('Nombre:', info["nombre"])
print('Oculto:', info["email"]["oculto"])
import json
datos = '''
[ json2.py
{ "id" : "001",
"x" : "2",
"nombre" : "Chuck"
} ,
{ "id" : "009",
"x" : "7", JSON representa datos
"nombre" : "Brent" como “listas” anidadas y
}
]'''
“diccionarios”

info = json.loads(datos)
print('Total de usuarios:', len(info))

for elemento in info:


print('Nombre', elemento['nombre'])
print('Id', elemento['id'])
print('Atributo', elemento['x'])
Diseño Orientado a Servicios

http://es.wikipedia.org/wiki/Arquitectura_orientada_a_servicios
Diseño Orientado a Servicios
La mayoría de aplicaciones web no triviales
usan servicios Aplicación

Usan servicios de otras aplicaciones


APIs
- Cambio de Tarjeta de Crédito

- Sistemas de Reservación de Hotel

Los servicios publican las “reglas” que las Servicio


Servicio
aplicaciones deben seguir para hacer uso
del servicio (API)
Múltiples Sistemas
Inicialmente - dos sistemas cooperan
y dividen el problema

Conforme los datos/servicios se


vuelven útiles - múltiples
aplicaciones quieren utilizar la
información

http://www.youtube.com/watch?v=mj-kCFzF0ME 5:15
Servicios Web

http://es.wikipedia.org/wiki/Servicio_web
Interface de Programación de
Aplicaciones
Una API (Application Programming interface, por sus siglas
en inglés) por sí misma es suficientemente abstracta en el
hecho de que especifica una interface y controla el
comportamiento de los objetos especificados en esa
interface. El software que provee funcionalidad descrita por
una API se conoce como “implementación” de la API. Una
API es típicamente definida en los términos del lenguaje de
programación usado para construir una aplicación.
http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones
https://developers.google.com/maps/documentation/geocoding/
{
"status": "OK",
"results": [
{
"geometry": {
"location_type": "APPROXIMATE",
"location": {
"lat": 42.2808256,
"lng": -83.7430378 http://maps.googleapis.com/maps/api/geocode/json?a
} ddress=Ann+Arbor%2C+MI
},
"address_components": [
{
"long_name": "Ann Arbor",
"types": [
"locality",
"political"
],
"short_name": "Ann Arbor"
}
],
"formatted_address": "Ann Arbor, MI, USA",
"types": [
"locality",
"political"
] geojson.py
}
]
}
import urllib.request, urllib.parse, urllib.error
import json
import ssl

clave_api = False
if clave_api is False:
clave_api = 42
url_de_servicio = 'http://py4e-data.dr-chuck.net/json?'
else :
url_de_servicio = 'https://maps.googleapis.com/maps/api/geocode/json?'
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
while True:
direccion = input('Ingresa una ubicación: ')
if len(direccion) < 1: break Ingresa una ubicación: Ann Arbor, MI
parms = dict()
parms['address'] = direccion Recuperando http://maps.googleapis.com/...
if clave_api is not False: parms['key'] = clave_api
url = url_de_servicio + urllib.parse.urlencode(parms) Recuperados 1669 characters
print('Recuperando', url)
uh = urllib.request.urlopen(url, context=ctx)
lat 42.2808256 lng -83.7430378
datos = uh.read().decode()
print('Recuperados', len(datos), 'caracteres')
Ann Arbor, MI, USA
try:
js = json.loads(datos)
Ingresa una ubicación:
except:
js = None
if not js or 'status' not in js or js['status'] != 'OK':
print('==== Error al Recuperar ====')
print(datos)
continue
print(json.dumps(js, indent=4))

lat = js['results'][0]['geometry']['location']['lat']
lng = js['results'][0]['geometry']['location']['lng'] geojson.py
print('lat', lat, 'lng', lng)
location = js['results'][0]['formatted_address']
print(location)
Seguridad de una API y límite
de datos
Los recursos computacionales para correr esas APIs no son
“gratuitos”

Los datos provistos por esas APIs son usualmente valuables

Los proveedores de datos deben limitar el número de solicitudes


por día, pedir una “clave” API, o incluso cobrar por su uso

Puede que las reglas cambien conforme la aplicación cambia...


import urllib.request, urllib.parse, urllib.error
import twurl
import json
import ssl
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json' twitter2.py
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

while True:
print('')
cuenta = input('Ingresa una cuenta de Twitter:')
if (len(cuenta) < 1): break
url = twurl.aumentar(TWITTER_URL,
{'screen_name': cuenta, 'count': '5'})
print('Recuperando', url)
conexion = urllib.request.urlopen(url, context=ctx)
data = conexion.read().decode()

js = json.loads(data)
print(json.dumps(js, indent=2))

cabeceras = dict(conexion.getheaders())
print('Restantes', cabeceras['x-rate-limit-remaining'])

for u in js['users']:
print(u['screen_name'])
if 'status' not in u:
print(' * Estado no encontrado')
continue
s = u['status']['text']
print(' ', s[:50])
Ingresa una cuenta de Twitter:drchuck
Recuperando https://api.twitter.com/1.1/friends ...
Restantes 14 twitter2.py
{
"users": [
{
"status": {
"text": "@jazzychad I just bought one .__.",
"created_at": "Fri Sep 20 08:36:34 +0000 2013",
},
"location": "San Francisco, California",
"screen_name": "leahculver",
"name": "Leah Culver",
},
{
"status": {
"text": "RT @WSJ: Big employers like Google ...",
"created_at": "Sat Sep 28 19:36:37 +0000 2013",
},
"location": "Victoria Canada",
"screen_name": "_valeriei",
"name": "Valerie Irvine",
],
}
Leahculver
@jazzychad I just bought one .__._
Valeriei
RT @WSJ: Big employers like Google, AT&amp;T are h
Ericbollens
RT @lukew: sneak peek: my LONG take on the good &a
halherzog
Learning Objects is 10. We had a cake with the LO,
hidden.py
def oauth():
return {"consumer_key": "h7Lu...Ng",
"consumer_secret": "dNKenAC3New...mmn7Q",
"token_key": "10185562-eibxCp9n2...P4GEQQOSGI",
"token_secret": "H0ycCFemmC4wyf1...qoIpBo"}
import urllib.request, urllib.parse, urllib.error
import oauth
import hidden twurl.py
def aumentar(url, parametros):
credenciales = hidden.oauth()
consumidor = oauth.OAuthConsumer(credenciales['consumer_key'],
credenciales['consumer_secret'])
token = oauth.OAuthToken(credenciales['token_key'], credenciales['token_secret'])

oauth_solicitud = oauth.OAuthRequest.from_consumer_and_token(consumidor,
token=token, http_method='GET', http_url=url,
parameters=parametros)
oauth_solicitud.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(),
consumidor, token)
return oauth_solicitud.to_url()

https://api.twitter.com/1.1/statuses/user_timeline.json?count=2
&oauth_version=1.0&oauth_token=101...SGI&screen_name=drchuck&oa
uth_nonce=09239679&oauth_timestamp=1380395644&oauth_signature=r
LK...BoD&oauth_consumer_key=h7Lu...GNg&oauth_signature_method=H
MAC-SHA1
Resumen
Arquitectura Orientada a Servicios - permite que una aplicación se
divida en partes distribuidas a través de una red

Una API (Application Program Interface) es un contrato para una


interacción

Los Servicios Web proveen infraestructura para que las


aplicaciones cooperen (una API) a través de una red - SOAP y
REST son dos estilos de servicios web

XML y JSON son formatos de serialización


Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-11-02


Objetos en Python
Charles Severance

Capítulo 14

Python para Todos


es.py4e.com
Advertencia
Esta lección es mucho acerca de definiciones y funciones de
objetos
Esta lección es mucho más acerca del “cómo funciona” y menos
del “cómo se usa”
No lo entenderás por completo hasta lo utilices en el contexto de
un problema real
Así que por favor suspende la técnica de practicar y aprender
durante las siguientes 40 diapositivas…
https://docs.python.org/3/tutorial/datastructures.html
https://docs.python.org/3/library/sqlite3.html
Comencemos con
Programas
Piso en Europa? 0
inp = input('Piso en Europa?’) Piso en EUA 1
euaf = int(inp) + 1
print('Piso en EUA', euaf)

Entrada Procesamiento Salida


Orientado a Objetos
• Un programa se hace de muchos objetos que cooperan
entre sí
• En vez de ser un “programa entero” – cada objeto es una
pequeña “isla” dentro de un programa que coopera con
otros objetos para trabajar
• Un programa está hecho de uno o más objetos trabajando
juntos - objetos que hacen uso de las capacidades de los
demás
Objeto
Un Objeto es una parte de Código auto-contenido y Datos
Un aspecto principal del método orientado a objetos es dividir el
problema en partes más pequeñas y comprensibles (divide y
vencerás)
Los objetos tienen límites que nos permiten ignorar detalles
innecesarios
Hemos estado utilizando objetos todo este tiempo: Objetos de
Cadenas, Objetos Enteros, Objetos de Diccionarios, Objetos de
Listas...
Entrada
Diccionario
Objeto

Objeto
Cadena
Los Objetos
se crean y se
utilizan Salida
Entrada
Código/Datos
Código/Datos

Código/Datos
Código/Datos
Los Objetos
son partes
de código y
datos Salida
Entrada
Código/Datos
Código/Datos

Código/Datos
Código/Datos
Los Objetos
ocultan detalles –
nos permiten
ignorar los detalles
Salida
del “resto del
programa”.
Entrada
Código/Datos
Código/Datos

Código/Datos
Código/Datos
Los Objetos ocultan
detalles – nos
permiten ignorar los
detalles del “resto Salida
del programa”.
Definiciones
Clase - Una plantilla
Método o Mensaje - Una capacidad definida en una clase
Campo o atributo - Una parte de datos en una clase
Objeto o Instancia - Una instancia particular de una clase
Terminología: Clase
Define las características abstractas de una cosa (objeto), incluyendo
las características de las cosas (sus atributos, campos o
propiedades) y el comportamiento de las cosas (las cosas que puede
hacer, o métodos, operaciones o características). Podría decirse que
una clase es un arquetipo o fábrica que describe la naturaleza de
algo. Por ejemplo, la clase Perro podría consistir de rasgos
compartidos por todos los perros, como la raza y el color de pelo
(características) y la habilidad de ladrar y sentarse
(comportamientos).
http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
Terminología: Instancia
Es posible tener una instancia de una clase o un objeto
particular. La instancia es el objeto creado en tiempo de
ejecución. En jerga de programación, el objeto Lassie es
una instancia de la clase Perro. El conjunto de valores de los
atributos de un objeto particular es llamado su estado. El
objeto consiste de un estado y un comportamiento definido
en la clase del objeto.
Objeto e Instancia son términos con frecuencia utilizados de forma intercambiable.

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
Terminología: Método
Una habilidad de un objeto. En un idioma, los métodos son verbos.
Lassie, siendo un Perro, tiene la habilidad de ladrar. Así que ladrar()
es uno de los métodos de Lassie. Ella puede tener otros métodos
también, por ejemplo sentarse() o comer() o caminar() o
salvar_a_timmy(). Dentro del programa, utilizar un método
usualmente afecta solo a un objeto en particular; todos los Perros
pueden ladrar, pero necesitas solamente un perro en particular para
hacer el ladrado
Método y mensaje son términos con frecuencia utilizados de forma intercambiable.

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
Algunos Objetos de Python
>>> dir(x)
>>> x = 'abc' [ … 'capitalize', 'casefold', 'center', 'count',
>>> type(x) 'encode', 'endswith', 'expandtabs', 'find',
<class 'str'> 'format', … 'lower', 'lstrip', 'maketrans',
>>> type(2.5) 'partition', 'replace', 'rfind', 'rindex', 'rjust',
<class 'float'> 'rpartition', 'rsplit', 'rstrip', 'split',
>>> type(2) 'splitlines', 'startswith', 'strip', 'swapcase',
<class 'int'> 'title', 'translate', 'upper', 'zfill']
>>> y = list() >>> dir(y)
>>> type(y) [… 'append', 'clear', 'copy', 'count', 'extend',
<class 'list'> 'index', 'insert', 'pop', 'remove', 'reverse',
>>> z = dict() 'sort']
>>> type(z) >>> dir(z)
<class 'dict'> […, 'clear', 'copy', 'fromkeys', 'get', 'items',
'keys', 'pop', 'popitem', 'setdefault', 'update',
'values']
Una Clase
Ejemplo
Esta es la plantilla
clase es una palabra
class GrupoAnimal: para crear objetos
reservada
x=0 GrupoAnimal

def grupo(self) : Cada objeto


Cada objeto
self.x = self.x + 1 GrupoAnimal tiene un
GrupoAnimal tiene un
print("Hasta ahora",self.x) poco de datos
poco de código
Construir un objeto
an = PartyAnimal() GrupoAnimal y
almacenarlo en an
Indicar al objeto an.grupo()
an.grupo() GrupoAnimal.grupo(an)
an que ejecute el
código dentro de an.grupo()
grupo()
class GrupoAnimal: $ python party1.py
x=0

def grupo(self) :
self.x = self.x + 1
print("Hasta ahora",self.x)

an = GrupoAnimal()

an.grupo()
an.grupo()
an.grupo()
class GrupoAnimal:
$ python party1.py
x=0

def grupo(self) :
self.x = self.x + 1
print("Hasta ahora",self.x)
an
an = GrupoAnimal()
x 0
grupo()
an.grupo()
an.grupo()
an.grupo()
class GrupoAnimal: $ python party1.py
x=0 Hasta ahora 1
Hasta ahora 2
def grupo(self) : Hasta ahora 3
self.x = self.x + 1
print("Hasta ahora",self.x)
an
self x
an = GrupoAnimal()
grupo()
an.grupo()
an.grupo()
an.grupo() GrupoAnimal.grupo(an)
Utilizando dir() y type()
Una Forma Nerd de Encontrar Capacidades
>>> y = list()
El comando dir() lista las capacidades >>> type(y)
<class 'list'>
Ignora las que comienzan con guiones >>> dir(x)
bajos - esas son utilizados por ['__add__', '__class__',
Python '__contains__', '__delattr__',
'__delitem__', '__delslice__',
'__doc__', … '__setitem__',
El resto son operaciones reales que el '__setslice__', '__str__',
objeto puede realizar 'append', 'clear', 'copy',
'count', 'extend', 'index',
Es como type() - nos dice detalles 'insert', 'pop', 'remove',
'reverse', 'sort']
*acerca* de una variable >>>
Podemos usar dir()
class GrupoAnimal:
x = 0 para encontrar las
“capacidades” de
def grupo(self) : nuestra clase
self.x = self.x + 1 recientemente creada.
print("Hasta ahora",self.x)

an = GrupoAnimal()
$ python party3.py
print("Tipo", type(an)) Type <class '__main__.GrupoAnimal'>
print("Dir ", dir(an)) Dir ['__class__', ... 'grupo', 'x']
Prueba dir() con una Cadena
>>> x = 'Que tal'
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__',
'__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__getnewargs__', '__getslice__', '__gt__',
'__hash__', '__init__', '__le__', '__len__', '__lt__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__',
'capitalize', 'center', 'count', 'decode', 'encode', 'endswith',
'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit',
'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',
'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex',
'rjust', 'rpartition', 'rsplit', 'rstrip', 'split',
'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']
Ciclo de Vida de un Objeto
http://es.wikipedia.org/wiki/Constructor_(inform%C3%A1tica)
Ciclo de Vida de un Objeto
Los Objetos son creados, usados, y descartados
Tenemos bloques especiales de código (métodos) que son
llamados
- Al momento de la creación (constructor)
- Al momento de la destrucción (destructor)
Los constructores son muy utilizados
Los destructores son raramente utilizados
Constructor
El propósito principal de un constructor es configurar algunas
variables de instancia para tener los valores iniciales
apropiados cuando el objeto es creado
class GrupoAnimal:
x = 0
$ python party4.py
def __init__(self):
Estoy construido
print('Estoy construido')
Hasta ahora 1
def grupo(self) : Hasta ahora 2
self.x = self.x + 1 Estoy destruido 2
print('Hasta ahora',self.x) an contiene 42

def __del__(self):
print('Estoy destruido', self.x)
El constructor y el destructor son
an = GrupoAnimal() opcionales. El constructor es
an.grupo()
an.grupo()
típicamente utilizado para
an = 42 configurar variables. El destructor
print('an contiene',an) es rara vez utilizado.
Constructor
En programación orientada a objetos, un constructor en una
clase es un bloque especial de sentencias llamado cuando un
objeto es creado

http://es.wikipedia.org/wiki/Constructor_(inform%C3%A1tica)
Muchas Instancias
Podemos crear muchos objetos - la clase es la plantilla para el
objeto
Podemos almacenar cada objeto distinto en su propia variable
Llamamos a esto tener multiples instancias de la misma clase
Cada instancia tiene su propia copia de las variables de instancia
Los constructores pueden
class GrupoAnimal: tener parametros
x = 0 adicionales. Estos se
nombre = ""
def __init__(self, z): pueden utilizar para
self.nombre = z configurar variables de
print(self.nombre,"construido") instancia para la instancia
en particular de la clase (i.e.,
def grupo(self) :
self.x = self.x + 1 para un objeto en particular).
print(self.nombre,"recuento grupal",self.x)

s = GrupoAnimal("Sally")
j = GrupoAnimal("Jim")

s.grupo()
j.grupo()
s.grupo() party5.py
class GrupoAnimal:
x = 0
nombre = ""
def __init__(self, z):
self.nombre = z
print(self.nombre,"construido")

def grupo(self) :
self.x = self.x + 1
print(self.nombre,"recuento
grupal",self.x)

s = GrupoAnimal("Sally")
j = GrupoAnimal("Jim")

s.grupo()
j.grupo()
s.grupo()
class GrupoAnimal:
x = 0
nombre = ""
s
def __init__(self, z):
self.nombre = z x: 0
print(self.nombre,"construido")
nombre:
def grupo(self) :
self.x = self.x + 1
print(self.nombre,"recuento
grupal",self.x)

s = GrupoAnimal("Sally")
j = GrupoAnimal("Jim")

s.grupo()
j.grupo()
s.grupo()
class GrupoAnimal:
x = 0
nombre = ""
s
def __init__(self, z):
self.nombre = z x: 0
print(self.nombre,"construido")
nombre: Sally
def grupo(self) :
self.x = self.x + 1
print(self.nombre,"recuento
grupal",self.x)
j
s = GrupoAnimal("Sally")
j = GrupoAnimal("Jim")
x: 0
Tenemos dos
s.grupo() instancias nombre: Jim
j.grupo() independientes
s.grupo()
class GrupoAnimal:
x = 0
nombre = ""
Sally construido
def __init__(self, z): Jim construido
self.nombre = z Sally recuento grupal 1
print(self.nombre,"construido") Jim recuento grupal 1
Sally recuento grupal 2
def grupo(self) :
self.x = self.x + 1
print(self.nombre,"recuento
grupal",self.x)

s = GrupoAnimal("Sally")
j = GrupoAnimal("Jim")

s.grupo()
j.grupo()
s.grupo()
Herencia
http://es.wikipedia.org/wiki/Herencia_(inform%C3%A1tica)
Herencia
Cuando hacemos una nueva clase - podemos reutilizar una clase
existente y heredar todas las capacidades de una clase
existente y además agregar nuestra parte para hacer nuestra
nueva clase
Otra forma de almacenar y reutilizar
Escribe una vez - reutiliza muchas veces
La nueva clase (hija) tiene todas las capacidades de la vieja clase
(padre) - y algo más
Terminología: Herencia

Las ‘Subclases’ son versiones más especializadas de una


clase, las cuales heredan atributos y comportamientos de sus
clases padre, y pueden además introducir los suyos.

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
class GrupoAnimal:
x = 0 s = GrupoAnimal("Sally")
nombre = '' s.grupo()
def __init__(self, nom):
self.nombre = nom j = FootballFan("Jim")
print(self.nombre,'construido') j.grupo()
j.touchdown()
def grupo(self) :
self.x = self.x + 1
print(self.nombre,'recuento grupal',self.x)

class FootballFan(GrupoAnimal): FootballFan es una clase que


puntos = 0 extiende GrupoAnimal. Tiene
def touchdown(self): todas las capacidades de
self.puntos = self.puntos + 7 GrupoAnimal y más.
self.grupo()
print(self.nombre, "puntos",self.puntos)
class GrupoAnimal:
x = 0 s = GrupoAnimal("Sally")
nombre = '' s.grupo()
def __init__(self, nom):
self.nombre = nom j = FootballFan("Jim")
print(self.nombre,'construido') j.grupo()
j.touchdown()
def grupo(self) :
self.x = self.x + 1
print(self.nombre,'recuento grupal',self.x)

class FootballFan(GrupoAnimal):
puntos = 0
s
def touchdown(self):
x:
self.puntos = self.puntos + 7
self.grupo() nombre: Sally
print(self.nombre, "puntos",self.puntos)
class GrupoAnimal:
x = 0 s = GrupoAnimal("Sally")
nombre = '' s.grupo()
def __init__(self, nom):
self.nombre = nom j = FootballFan("Jim")
print(self.nombre,'construido') j.grupo()
j.touchdown()
def grupo(self) :
self.x = self.x + 1
print(self.nombre,'recuento grupal',self.x)
j
class FootballFan(GrupoAnimal):
puntos = 0
x:
def touchdown(self):
self.puntos = self.puntos + 7 nombre: Jim
self.grupo()
print(self.nombre, "puntos",self.puntos)
puntos:
Definiciones
Clase - una plantilla
Atributo - Una variable dentro de una clase
Método - Una función dentro de una clase
Objeto - Una instancia de una clase
Constructor - Código que se ejecuta cuando un objeto es creado
Herencia - La habilidad de extender una clase para crear una nueva clase
Resumen
La Programación Orientada a Objetos es una forma muy
estructurada de reutilizar código

Podemos agrupar datos y funcionalidad juntos y crear muchas


instancias de una clase de forma independiente
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2020-11-14


Fuentes de Información Adicional
•“Snowman Cookie Cutter” por Didriks licenciado bajo CC BY
https://www.flickr.com/photos/dinnerseries/23570475099
•Foto del programa de televisión Lassie. Lassie mira como los trabajos de la bicicleta de Jeff (Tommy Rettig) son de
Dominio Público
https://en.wikipedia.org/wiki/Lassie#/media/File:Lassie_and_Tommy_Rettig_1956.JPG
Bases de Datos Relacionales
y SQLite
Charles Severance

Python para Todos


es.py4e.com
SQLite Browser

http://sqlitebrowser.org/
Ordenado Actualización Ordenado
VIEJO Secuencial NUEVO
Maestra
1970s

Combinar

Transacciones
Ordenadas
Sorted
https://es.wikipedia.org/wiki/IBM_729
Acceso Aleatorio

Cuando puedes acceder datos


de forma aleatoria...
¿Cómo puedes acomodar
datos de forma que sean
eficientes?
Por ordenamiento podría no
ser la mejor idea
https://es.wikipedia.org/wiki/Plato_(disco_duro)
Base de Datos Relacional
Las Bases de Datos Relacionales modelan datos
almacenando filas y columnas en tablas. El poder
de las bases de datos relacionales está en su
habilidad de recuperar datos de forma eficiente de
esas tablas, particularmente cuando hay múltiples
tablas y hay una relación entre las tablas
involucradas en una consulta.
http://es.wikipedia.org/wiki/Base_de_datos_relacional
Terminología
• Base de Datos - contiene muchas tablas

• Relación (o tabla) - contiene tuplas y atributos

• Tupla (o fila) - un conjunto de campos que generalmente


representan un “objeto”, como una persona o una canción
musical

• Atributo (también conocido como columna o campo) - uno de


posiblemente muchos elementos de datos correspondientes al
objeto representado en la fila
Una relación es definida como un conjunto de tuplas que tienen los mismos atributos. Una
tupla usualmente representa un objeto e información acerca de ese objeto. Los objetos son
usualmente físicos o conceptos. Una relación es usualmente descrita como una tabla, la cual
es organizada en filas y columnas. Todos los datos referenciados por un atributo están en el
mismo dominio y se apegan a las mismas reglas. (Wikipedia)
Columns / Attributes
Rows /
Tuples

Tables /
Relations
SQL
Lenguaje de Consultas Estructurado (SQL, por sus siglas en
Inglés) es el lenguaje que utilizamos para enviar comandos a la
base de datos

- Crear datos (conocido como Insert)

- Recuperar datos

- Actualizar datos

- Eliminar datos http://es.wikipedia.org/wiki/SQL


Archivos
de
Entrada Programas de SQL
Archivo de
Python Base de Datos
R SQL
Archivos
de Salida
Excel Files SQLite
Tu Browser
D3.js
Aplicaciones Web y Base de
Datos
• Desarrollador de Aplicaciones (Developer) - Construye la
lógica, la vista y el manejo de la aplicación - monitorea la
aplicación por problemas
• Administrador de la Base de Datos (DBA) - Monitorea y ajusta
la base de datos conforme el programa corre en producción

• Normalmente ambas personas participan en el diseño del


“Modelo de datos”
Software de la
Usuario Servidor de la
Aplicación SQL
final Base de Datos
Software

SQL

Desarrollador
Herramientas
de la base de
DBA
datos
Administrador de la Base de
El administradorDatos (DBA)
de la base de datos (DBA, por sus siglas en
ingles) es una persona responsible por el diseño,
implementación, mantenimiento, y reparación de una base de
datos en una organización. Su rol incluye el desarrollo y diseño
de estrategias de la base de datos, monitoreo y mejoramiento del
rendimiento y capacidad de la base de datos, y planeación para
futuros requerimientos de expansión. Tambien puede planear,
coordinar, e implementar medidas de seguridad para proteger la
base de datos.

https://es.wikipedia.org/wiki/Administrador_de_base_de_datos
Modelo de la Base de Datos
Un modelo de base de datos o esquema de base de
datos es la estructura o formato de una base de datos,
descrito en un lenguaje formal soportado por el sistema
de manejo de la base de datos. En otras palabras, un
"modelo de base de datos" es la aplicación de un
modelo de datos usado en conjunto con un sistema de
manejo de base de datos.

https://es.wikipedia.org/wiki/Modelo_de_base_de_datos
Sistemas Comunes de Manejo
de bases de datos
• Los tres Sistemas de manejo de bases de datos más grandes
- Oracle - Grande, comercial, nivel empresarial, muy muy
configurable
- MySql - Más sencilla pero muy rápida y escalable - código abierto
comercial
- SqlServer - Muy buena - de Microsoft (incluyendo Access)
• Muchos otros proyectos más pequeños, libres y de código abierto
- HSQL, SQLite, Postgres, ...
SQLite se encuentra en cientos de
Programas...

http://www.sqlite.org/famous.html
SQLite Browser
• SQLite es una base de datos muy popular - es gratis y es
rápida y pequeña
• SQLite Browser nos permite manipular directamente archivos
SQLite
• http://sqlitebrowser.org/
• SQLite está embebido en Python y en un número de otros
lenguajes
http://sqlitebrowser.org/
Vamos a crear una base de datos

https://es.py4e.com/lectures3/Pythonlearn-15-Database-Handout.txt
Comienzo sencillo - Una sola tabla
CREATE TABLE Users(
name VARCHAR(128),
email VARCHAR(128)
)
Our table with four rows
SQL
Lenguaje de consultas estructurado (SQL, por sus siglas en
inglés) es el lenguaje que usamos para mandar comandos a la
base de datos

- Crear datos (conocido como Insert)

- Recuperar datos

- Actualizar datos

- Borrar datos
https://es.wikipedia.org/wiki/SQL
SQL: Insert
La sentencia Insert inserta una fila en una tabla

INSERT INTO Users (name, email) VALUES ('Kristin', 'kf@umich.edu')


SQL: Delete
Elimina una fila en una tabla basado en un criterio de selección

DELETE FROM Users WHERE email='ted@umich.edu'


SQL: Update
Permite modificar un campo existente con una cláusula
"where" (donde)

UPDATE Users SET name='Charles' WHERE


email='csev@umich.edu'
Recuperando Registros: Select
La sentencia select recupera un grupo de registros - puedes
recuperar todos los registros o un subconjunto de ellos con
una cláusula WHERE

SELECT * FROM Users

SELECT * FROM Users WHERE email='csev@umich.edu'


Ordenando con ORDER BY
Puedes agregar una cláusula ORDER BY (ordenar por)
después de un SELECT para obtener los resultados ordenados
en orden ascendente o descendente

SELECT * FROM Users ORDER BY email

SELECT * FROM Users ORDER BY name DESC


Resumen de SQL
INSERT INTO Users (name, email) VALUES ('Kristin', 'kf@umich.edu')

DELETE FROM Users WHERE email='ted@umich.edu'

UPDATE Users SET name="Charles" WHERE email='csev@umich.edu'

SELECT * FROM Users

SELECT * FROM Users WHERE email='csev@umich.edu'

SELECT * FROM Users ORDER BY email


Esto no es tan emocionante
(hasta ahora)
• Las Tablas se parecen mucho a hojas de datos gigantes
programables con filas, columnas, y comandos

• El poder viene cuando tenemos más de una tabla y podemos


utilizar las relaciones entre tablas
Modelos Complejos de Datos y
Relaciones
https://es.wikipedia.org/wiki/Modelo_relacional
Diseño de la Base de Datos
• El diseño de una base de datos es una forma de arte en sí
mismo con conocimientos y experiencia en particular

• Nuestra meta es evitar los errores, hacer un diseño claro y


entender fácilmente las bases de datos

• Otros podrían hacer ajustes de desempeño después

• El diseño de una base de datos comienza con un dibujo...


Construyendo un Modelo de
Datos
• Hacer un dibujo de los objetos de los datos para nuestra
aplicación y después encontrar cómo representar los
objetos y sus relaciones

• Regla básica: No pongas la misma cadena de datos dos


veces - usa una relación en vez de eso

• Cuando hay una sola cosa en el "mundo real" debería haber


una copia de esa cosa en la base de datos
Track Len Artist Album Genre Rating Count
Para cada “pieza de
información”... Album
• ¿La columna es un objeto o un atributo Len
de otro objeto? Genre
Artist Rating
• Una vez que definimos objetos,
necesitamos definir las relaciones entre Track
ellos Count
Track (cancion)
Album (album)
Artist (artista)
Genre (género)
Rating (calificación)
Len (duración)
Count (cuenta)
Artist Track
Track
Album Pertenece a Rating
Artist Len
Album Count
Genre Pertenece a
Rating
Len Pertenece a
Genre
Count
Artist Track

Pertenece a Rating
Len
Album Count
Pertenece a

Genre Pertenece a
Representando Relaciones
en una Base de Datos
Normalización de una Base de
Datos (3NF)
Hay *toneladas* de teoría de bases de datos - mucho más para
entenderlo sin cálculos excesivos
No replicar datos - datos de referencia - apuntar a los datos
Usar enteros para las claves y las referencias
Usar una columna “clave” especial para cada tabla a la cual
vamos a hacer referencias. Por convención, muchos
programadores llaman a esta columna “id”

https://es.wikipedia.org/wiki/Normalizaci%C3%B3n_de_bases_de_datos
Queremos llevar registro de cuál banda es la “creadora” de cada canción...

¿A qué album “pertenece” esta canción??

¿Con cuál album está relacionada la canción?


Patrón de Referencia de Enteros
Artist
Usamos enteros para
referenciar filas en otras
tablas

Album
Tres Tipos de Claves
• Clave primaria - generalmente un entero
que se auto incrementa Album
id
• Clave lógica - lo que el mundo exterior
usa para buscar title
artist_id
• Clave foránea - generalmente un entero ...
que apunta a una fila en otra tabla
Reglas Clave
Prácticas recomendadas User
id
• Nunca usar la clave lógica como la clave
login
primaria
password
name
• Las claves lógicas podrían cambiar (y de
email
hecho lo hacen)
created_at
modified_at
• Relaciones basadas en coincidir campos
login_at
de texto o cadenas son menos eficientes
que con enteros
Claves Foráneas
• Una clave foránea es cuando una Album
tabla tiene una columna que Artist
id
contiene una clave que apunta a una id
title
clave primaria de otra tabla name
artist_id
...
...
• Cuando todas las claves primarias
son enteros, todas las claves
foráneas son enteros - esto es
bueno - muy bueno
Construyendo Relaciones (en
tablas)
Artist Track
Rating
Pertenece a Len
Count
Album Pertenece a

Pertenece a
Genre
Pertenece a Track
Album Title
Rating
Len Track
Count id
title
Album
Tabla rating
id
Clave Primaria len
Clave Lógica title
Clave Foránea
count
album_id
Artist Track
id Album id
name id title
title rating
Tabla artist_id len
Clave Primaria
Clave Lógica count
Clave Foránea album_id
Genre
genre_id
id
Nombrar CF como artist_id
es una convención name
CREATE TABLE Genre (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT
)
CREATE TABLE Album (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
artist_id INTEGER,
title TEXT
)

CREATE TABLE Track (


id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
title TEXT,
album_id INTEGER,
genre_id INTEGER,
len INTEGER, rating INTEGER, count INTEGER
)
insert into Artist (name) values ('Led Zepplin')
insert into Artist (name) values ('AC/DC')
insert into Artist (name) values ('Led Zepplin')
insert into Artist (name) values ('AC/DC')
insert into Genre (name) values ('Rock')
insert into Genre (name) values ('Metal')
insert into Album (title, artist_id) values ('Who Made Who', 2)
insert into Album (title, artist_id) values ('IV', 1)
insert into Track (title, rating, len, count, album_id, genre_id)
values ('Black Dog', 5, 297, 0, 2, 1)
insert into Track (title, rating, len, count, album_id, genre_id)
values ('Stairway', 5, 482, 0, 2, 1)
insert into Track (title, rating, len, count, album_id, genre_id)
values ('About to Rock', 5, 313, 0, 1, 2)
insert into Track (title, rating, len, count, album_id, genre_id)
values ('Who Made Who', 5, 207, 0, 1, 2)
Track

Album

Genre

Artist
Usando Join Entre Tablas

https://es.wikipedia.org/wiki/Sentencia_JOIN_en_SQL
Poder Relacional
• Al remover datos replicados y reemplazarlo con referencias a
una copia de cada parte de los datos construimos una “web”
de información que la base de datos relacional puede leer
muy rápido - incluso para grandes cantidades de datos

• Frecuentemente cuando quieres obtener datos éstos vienen


de un cierto número de tablas ligadas por sus claves foráneas
La Operación JOIN
• La operación JOIN liga a través de varias tablas como parte
de una operación de selección (select)

• Debes decirle al JOIN cómo utilizar las claves que hacen la


conexión entre tablas usando una cláusula ON
Album

Artist

select Album.title, Artist.name from Album join Artist on Album.artist_id = Artist.id


Cómo las
Lo que Las tablas que
tablas son
queremos ver tienen los datos
enlazadas
select Album.title, Album.artist_id, Artist.id,Artist.name
from Album join Artist on Album.artist_id = Artist.id
SELECT Track.title,
Track.genre_id,
Genre.id, Genre.name
FROM Track JOIN Genre

Uniendo dos tablas sin una


cláusula ON produce todas
las posibles combinaciones
de filas
select Track.title, Genre.name from Track join Genre on Track.genre_id = Genre.id

Cómo las
Lo que Las tablas que
tablas son
queremos ver tienen los datos
enlazadas
select Track.title, Artist.name, Album.title,
Genre.name from Track join Genre join Album join
Artist on Track.genre_id = Genre.id and
Track.album_id = Album.id and Album.artist_id =
Artist.id
Lo que queremos
ver
Las tablas que tienen
los datos

Cómo las tablas son


enlazadas
Relaciones Muchos-A-Muchos

https://en.wikipedia.org/wiki/Many-to-many_(data_model)
Revisar:
Pertenece a Track Uno a
Album Title Muchos
Uno Muchos Rating
Len Track
Count
id
Tabla
Clave Primaria title
Album
Clave Lógica Uno rating
Clave Foránea id
len
title Muchos
count
album_id
https://en.wikipedia.org/wiki/One-to-many_(data_model)
Madre
Hijos
Biológica

Uno Uno Muchos

Muchos

https://en.wikipedia.org/wiki/One-to-many_(data_model)
Muchos a Muchos
• Algunas veces necesitamos Libros Autores
modelar una relación que es
muchos-a-muchos
Tabla Autores-
• Necesitamos agregar una tabla Libros

de "conexión" con dos claves Libros Autores


foráneas Libros Autores
• Usualmente no hay una clave
primaria separada
https://en.wikipedia.org/wiki/Many-to-many_(data_model)
Miembro-de
User
Course
name
title Muchos Muchos
email

User
Course Member
Muchos id
id user_id
Muchos Uno name
title Uno course_id
email

https://en.wikipedia.org/wiki/Many-to-many_(data_model)
CREATE TABLE User (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE,
email TEXT
)

CREATE TABLE Course (


id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
title TEXT UNIQUE
)

CREATE TABLE Member ( Comenzar con


user_id INTEGER, una base de
course_id INTEGER, datos vacía
role INTEGER,
PRIMARY KEY (user_id, course_id)
)
Insertar Users y Courses
INSERT INTO User (name, email) VALUES ('Jane', 'jane@tsugi.org');
INSERT INTO User (name, email) VALUES ('Ed', 'ed@tsugi.org');
INSERT INTO User (name, email) VALUES ('Sue', 'sue@tsugi.org');

INSERT INTO Course (title) VALUES ('Python');


INSERT INTO Course (title) VALUES ('SQL');
INSERT INTO Course (title) VALUES ('PHP');
INSERT INTO Member (user_id, course_id, role) VALUES (1, 1, 1);
INSERT INTO Member (user_id, course_id, role) VALUES (2, 1, 0);
INSERT INTO Member (user_id, course_id, role) VALUES (3, 1, 0);

INSERT INTO Member (user_id, course_id, role) VALUES (1, 2, 0);


INSERT INTO Member (user_id, course_id, role) VALUES (2, 2, 1);

INSERT INTO Member (user_id, course_id, role) VALUES (2, 3, 1);


INSERT INTO Member (user_id, course_id, role) VALUES (3, 3, 0);
SELECT User.name, Member.role, Course.title
FROM User JOIN Member JOIN Course
ON Member.user_id = User.id AND
Member.course_id = Course.id
ORDER BY Course.title, Member.role DESC, User.name
www.tsugi.org
Complejidad Permite Velocidad
• La complejidad hace que la velocidad sea mejor y permite
obtener resultados más rápido conforme los datos crecen

• Al normalizar los datos y enlazarlos con claves enteras, la


cantidad total de datos que la base de datos relacional debe
escanear es mucho menor que si los datos fueran agregados
simplemente como son

• Podría parecer una desventaja - gastar algo de tiempo diseñando


una base de datos de modo que siga siendo rápida cuando tu
aplicación es buena
Tópicos de SQL Adicionales
• Indexes (índices) mejoran el desempeño del acceso para
cosas como campos de texto

• Reglas en los datos - (no puede ser NULL, etc..)

• Transacciones - permiten operaciones SQL ser agrupadas


como una unidad
Resumen
• Las bases de datos relacionales nos permiten escalar a
cantidades grandes de datos

• La clave es tener una copia de cualquier dato y usar relaciones


para enlazar los datos a múltiples lugares

• Esto reduce en gran parte la cantidad de datos que tienen que


ser escaneados cuando se hacen operaciones complejas en
grandes cantidades de datos

• El diseño de SQL y Bases de Datos es una forma de arte


Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2021-01-23


Recuperación y Visualización de
Datos
Charles Severance

Python para Todos


es.py4e.com
Análisis de Datos Múltiples-Pasos
Fuente
de Recolección
Datos

Visualización
Limpieza/Procesamiento

(5, 1.0, 0.985, 3, u'http://www.dr..')


(3, 1.0, 2.135, 4, u'http://www.dr..')
Análisis (1, 1.0, 0.659, 2, u'http://www.dr..')
(1, 1.0, 0.659, 5, u'http://www.dr..')
....
Tecnologías de Minería de Datos

https://hadoop.apache.org/

http://spark.apache.org/

https://aws.amazon.com/redshift/

http://community.pentaho.com/

....
"Minería de Datos Personal"
Nuestra meta es volverte un mejor programador - no hacerte un experto
en la minería de datos (data mining)
GeoData
Hace un Mapa de Google con datos
del usuario

Utiliza la API de Google Geodata

Almacena datos en una base de datos


para evitar límite de solicitudes y
permitir reinicio

Visto en un navegador utilizando la


API de Google Maps http://es.py4e.com/code3/geodata.zip
where.html
where.data

Geodatos
geoload.py geodata.sqlite
de Google
where.js
geodump.py

Northeastern University, ... Boston, MA 02115, USA 42.3396998 -71.08975


Bradley University, 1501 ... Peoria, IL 61625, USA 40.6963857 -89.6160811
...
Technion, Viazman 87, Kesalsaba, 32000, Israel 32.7775 35.0216667
Monash University Clayton ... VIC 3800, Australia -37.9152113 145.134682
Kokshetau, Kazakhstan 53.2833333 69.3833333
...
12 records written to where.js http://es.py4e.com/code3/geodata.zip
Open where.html to view the data in a browser
Clasificación de
Páginas
Escribir un simple rastreador web

Calcular una versión simple del


algoritmo de clasificación de
páginas de Google

Visualizar la red resultante

http://es.py4e.com/code3/pagerank.zip
Arquitectura de un Motor de
Búsquedas
Rastreo Web
Construcción de un Índice
Búsqueda

http://infolab.stanford.edu/~backrub/google.html
Rastreador Web
Un Rastreador Web (Web crawler) es un programa que
navega el internet en un modo metódico automatizado. Los
rastreadores web son principalmente utilizados para crear
una copia de las páginas visitadas para procesarlas
después por un motor de búsqueda que va a indexar las
páginas descargadas para proveer búsquedas más
rápidas.

https://es.wikipedia.org/wiki/Ara%C3%B1a_web
Rastreador Web
Recupera una página

Revisa la página y sus enlaces

Agrega los enlaces a una lista de


sitios “por ser recuperados”

Repetir...
https://es.wikipedia.org/wiki/Ara%C3%B1a_web
Política de rastreo web
una política de elección que define qué paginas descargar,

una política de re-visita que define cuándo checar por cambios en las
páginas,

una política de cortesía que define cómo evitar sobrecargar los sitios web, y

una política de paralelismo que define cómo coordinar rastreadores web


distribuidos
robots.txt
Una forma en que un sitio web se
comunica con los rastreadores web User-agent: *
Disallow: /cgi-bin/
Un estándar informal y voluntario Disallow: /images/
Disallow: /tmp/
Algunas veces las personas hacen una Disallow: /private/
"Trampa de Araña" para atrabar arañas
"malas"

https://es.wikipedia.org/wiki/Est%C3%A1ndar_de_exclusi%C3%B3n_de_robots
http://en.wikipedia.org/wiki/Spider_trap
Arquitectura Google
Rastreo Web

Construcción de un Índice

Búsqueda

http://infolab.stanford.edu/~backrub/google.html
Indexado de Búsquedas
El indexado de una motor de búsquedas colecta,
analiza, y almacena datos para facilitar una
recuperación de la información más rápida y precisa. El
propósito de almacenar un índice es para mejorar la
velocidad y el desempeño al buscar documentos
relevantes para una consulta de búsqueda. Sin un
índice, el motor de búsquedas escanearía cada
documento existente, lo cual requeriría un tiempo y
capacidad de procesamiento considerables.
http://en.wikipedia.org/wiki/Index_(search_engine)
spreset.py sprank.py
force.html
d3.js

La spider.py spider.sqlite
Web
spjson.py

spdump.py
force.js

(5, None, 1.0, 3, u'http://www.dr-chuck.com/csev-blog')


(3, None, 1.0, 4, u'http://www.dr-chuck.com/dr-chuck/resume/speaking.htm')
(1, None, 1.0, 2, u'http://www.dr-chuck.com/csev-blog/')
(1, None, 1.0, 5, u'http://www.dr-chuck.com/dr-chuck/resume/index.htm')
4 rows.
http://es.py4e.com/code3/pagerank.zip
Listas de Direcciones Email - Gmane

Rastrear un archivo de una lista de


direcciones

Hacer un poco de análisis / limpieza

Visualizar los datos como una nube de


palabras y líneas

http://es.py4e.com/code3/gmane.zip
Advertencia: Este set de datos es > 1GB
No apuntes esta aplicación a gmane.org y la dejes corriendo
No hay limite de transacciones – ellos son personas geniales

Usa esto para tus pruebas:

http://mbox.dr-chuck.net/sakai.devel/4/5
gword.htm
mbox.dr-chuck.net gmane.py content.sqlite d3.js

gmodel.py gword.js
mapping.sqlite
gword.py
content.sqlite
gbasic.py
gline.py
How many to dump? 5
Loaded messages= 51330 subjects= 25033 senders= 1584
Top 5 Email list participants
steve.swinsburg@gmail.com 2657
gline.js
azeckoski@unicon.net 1742
ieb@tfd.co.uk 1591
csev@umich.edu 1304
david.horwitz@uct.ac.za 1184 gline.htm
... http://es.py4e.com/code3/gmane.zip d3.js
Agradecimientos / Contribuciones
Las diapositivas están bajo el Copyright 2010- Charles R. Severance ...
(www.dr-chuck.com) de la Escuela de Informática de la Universidad de
Michigan y open.umich.edu, y están disponibles públicamente bajo una
Licencia Creative Commons Attribution 4.0. Favor de mantener esta última
diapositiva en todas las copias del documento para cumplir con los
requerimientos de atribución de la licencia. Si haces un cambio, siéntete
libre de agregar tu nombre y organización a la lista de contribuidores en
esta página conforme sean republicados los materiales.

Desarrollo inicial: Charles Severance, Escuela de Informática de la


Universidad de Michigan.

Traducción al Español por Juan Carlos Pérez Castellanos - 2021-01-23

También podría gustarte