Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase 17
>>> "chao" in d
True
estructura fundamental en la ciencia de la computación
Más sobre diccionarios
>>> for p in d: print p #recorrer
identificadores
chao
hola
Nota. Se muestran en orden arbitrario (pero no aleatorio)
ejemplo:
la casa esta en la zona de la casa rosada
resultados:
la 3
casa 2
esta 1
en 1
zona 1
de 1
rosada 1
¿ Como lo haríamos a mano ?
Solución con diccionario
D=dict()
for linea in open(raw_input("archivo?")):
#recorrer palabras de linea
for palabra in linea.split():
#si palabra existe, incrementar frecuencia
if palabra in D:
D[palabra]+=1
#si no existe, agregarla con frecuencia 1
else:
D[palabra]=1
Para una lista Python de enteros positivos, podemos definir una permutación
de ellos.
Proceso de depuración: cuando hay
error
P1. ¿Por qué el programa ha producido este resultado?
(y no: ¿Por qué el programa no ha dado el resultado esperado?)
P2. ¿Será este error parte de una familia de errores?
(supuesto erróneo seguramente conduce a varios errores en el programa)
P3. ¿Cómo localizar y corregir el error?
Método científico para depurar
Hipótesis H: resultado a obtener es un resultado X.
Basta una sola oportunidad en que no se obtenga el resultado esperado para
que la hipótesis sea falsa!
Reproducibilidad de los resultados: - ¿qué pasa con los números al azar? (¡no
son realmente al azar!: son pseudo-aleatorios)
- Interacciones con usuarios.
Reducir espacio de búsqueda:
- Encontrar entrada más pequeña que conduzca a error…
- Encontrar parte del programa que es la más probable de ser “culpable”
Otra mirada a los strings
Los strings de Python también son estructuras indexadas.
Son inmutables.
str = “CC1002”
for c in str:
print c
genera:
C
C
1
0
0
2
Operaciones básicas sobre strings
>>> len(“abc”)
3
>>> “abc”+”def”
“abcdef”
>>> “la”*4
“lalalala”
>>> profesion = “ingeniero”
>>> “g” in profesion
True
>>> “f” in profesion
False
>>> “spam” in “abcspamdef”
True
Indexación y slicing de strings
>>> s[1]
“L”
>>> s[:3]
“SLI”
>>> s[:-1]
“SLICEOFSPA”
>>> s[-3:]
“PAM”
Ordenamiento y comparación
¿comparación?
Ejemplo:
palabra(o fin)?gabriela
palabra(o fin)?jose
palabra(o fin)?rosa
palabra(o fin)?matias
palabra(o fin)?fin
mayor=rosa
más larga=gabriela
Programa para palabras
# leer una lista de palabras(que termina con “fin”) y
# escribir la mayor (alfabeticamente) y la más larga
# inicializar strings vacíos (de largo 0)
mayor = ""; masLarga = ""
# leer palabras hasta “fin”
while True:
palabra = raw_input("palabra(o fin)?") #lee string
if palabra == "fin": break
# mantener la palabra mayor
if palabra > mayor:
mayor=palabra
# mantener la palabra más larga
if len(palabra) > len(masLarga):
masLarga=palabra
#escribir resultados
print "mayor=", mayor
print "mas larga=", masLarga
Contar apariciones de un
carácter en un string
Ejemplo:
>>>cuenta(“a”,“abracadabra”)
>>>5
Una opción:
def cuenta(x,y):
n=0
for c in y:
if c==x:
n=n+1
return n
Solución recursiva
Ejemplo:
>>>cuenta(“a”,“abracadabra”)
>>>5
Solución recursiva
def cuenta(x,y):
if len(y)==0:
return 0
elif y[0]==x:
return 1+cuenta(x,y[1:])
else:
return cuenta(x,y[1:])
Funciones adicionales para strings
ejemplos: para s=’abracadabra’
x.find(y) busca y en x. Entrega índice s.find(“abra”) 0
de 1ª aparición (-1 si no está) s.find(“Abra”) -1
x.count(y) cuenta apariciones de y en x s.count(“abra”) 2
x.isalpha() True si x es alfabético s.isalpha() True
x.isdigit() True si x es numérico s.isdigit() False
x.islower() True si x en minúsculas s.islower() True
x.isupper() True si x en mayúsculas s.isupper() False
x.upper() reemplaza minúsculas por “casa”.upper() ‘CASA’
mayúsculas
x.lower() reemplaza mayúsculas por “Casa”.lower() ‘casa’
minúsculas
x.strip() elimina espacios al comienzo “ a b “.strip() ‘a b’
y fin
x.replace(y,z) reemplaza todos los y por z s.replace(‘abra’,’*’) ‘*cad*’
Sintaxis: string.nombre(parámetros)
Lista completa se obtiene con help(str)
Juego: obtener respuesta
si o no
Ejemplo de diálogo
if siOno(“me quieres?”)==“si”:
print “yo no”
else:
print “adios mundo cruel”
Solución iterativa
# siOno: str -> str
# lee string de respuesta y detecta si es si o no
# devolviendolo. En caso contrario, vuelve a leer
def siOno(x):
while True:
resp=raw_input(x+" si o no?") #leer respuesta
resp=resp.strip() #eliminar espacios
resp=resp.lower() #traducir a minúsculas
if resp=="si" or resp=="no":
break
return resp
Solución recursiva
# siOno: str -> str
# lee string de respuesta y detecta si es si o no
# devolviendolo. En caso contrario, vuelve a leer
def siOno(x):
resp=raw_input(x+" si o no?").strip().lower()
if resp=="si" or resp=="no":
return resp
else:
return siOno(x)
Uso de funciones pre-definidas
Problema. Leer una línea que contiene “nombre apellido”
Ejemplo:
nombre apellido?Juan Perez
Perez,Juan
Solución
linea=raw_input(“nombre apellido?”)
print s
Conversiones de tipo
Conversión de números a String
>>> str(123)
'123'
>>> str(4.5)
'4.5'
>>> int("123")
123
>>> float("4.5")
4.5
Para la próxima clase
(jueves)