Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aprendiendo Python
Aprendiendo Python
Capítulo 1
Computadora
Programador
Hardware + Software
• 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...
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
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
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)
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)
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)
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.
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)
• 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.
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!
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
¿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)
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
3
Orden de Evaluación
• Cuando introducimos una cadena de operadores,
Python debe saber cuál tiene que hacer primero
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
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'
# 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
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.
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: )
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
sí
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
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')
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
sí
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
sí
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
sí
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
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
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.
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)
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
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
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.
...
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?
Sí
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”
• 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
• 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
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
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
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
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)
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)
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 >>>
if x < 3:
print
Memoria From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
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
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: 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
de Archivo
if linea.startswith('Subject:') :
contador = contador + 1
print('Había', contador, 'líneas de subject en', 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)
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”
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
palabras = linea.split()
email = palabras[1]
print(piezas[1])
El Patrón Doble División
palabras = linea.split()
email = palabras[1] stephen.marquard@uct.ac.za
print(piezas[1])
El Patrón Doble División
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
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
• Diccionario
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
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
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
>>> 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
lst = list()
for clave, val in contadores.items():
nuevatup = (val, clave)
lst.append(nuevatup)
Capítulo 11
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”
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)
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
>>> 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 :']
\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
>>> 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
['uct.ac.za']
'@([^ ]*)'
['uct.ac.za']
'@([^ ]*)'
['uct.ac.za']
'@([^ ]*)'
['uct.ac.za']
'^From .*@([^ ]*)'
['uct.ac.za']
'^From .*@([^ ]*)'
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 .*@([^ ]+)'
['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.]+
Capítulo 12
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)
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.”
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
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
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.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())
(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
>>>
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
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
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())
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())
fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for linea in fhand:
print(linea.decode().strip())
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.
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?
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
...
urllinks.py
import urllib.request, urllib.parse,
urllib.error
from bs4 import BeautifulSoup
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
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
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
- http://es.wikipedia.org/wiki/SGML
- 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)
<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))
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))
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
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”
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&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
Capítulo 14
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) :
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
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):
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
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
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
- Recuperar datos
- Actualizar datos
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
- Recuperar datos
- Actualizar datos
- Borrar datos
https://es.wikipedia.org/wiki/SQL
SQL: Insert
La sentencia Insert inserta una fila en una tabla
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...
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
)
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
Artist
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
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
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
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
)
Visualización
Limpieza/Procesamiento
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
Geodatos
geoload.py geodata.sqlite
de Google
where.js
geodump.py
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
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
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
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
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.