"""
IPython Notebook v4.0 para python 3.0
Librerías adicionales: 
Contenido bajo licencia CC-BY 4.0. Código bajo licencia MIT. 
(c) Sebastian Flores, Christopher Cooper, Alberto Rubio, Pablo Bunout.
"""
# Configuración para recargar módulos y librerías dinámicamente
%reload_ext autoreload
%autoreload 2

# Configuración para graficos en línea
%matplotlib inline

# Configuración de estilo
from IPython.core.display import HTML
HTML(open("./style/style.css", "r").read())

"""
Explanation: <img src="images/utfsm.png" alt="" width="100px" align="right"/>
USM Numérica
Licencia y configuración del laboratorio
Ejecutar la siguiente celda mediante Ctr-S.
End of explanation
"""


cadena_1 = "aprender haciendo"

print cadena_1.title()

"""
Explanation: Introducción a STRING
En Python podemos definir distintos tipos de variables, en este caso un objeto definido como un string tiene una serie de cualidades que nos permiten realizar ciertas operaciones que definiremos en este tutorial.
En particular el nombre string refiere a una secuencia de caracteres que puede ser utilizada como variable para representar otro objeto de distinta naturaleza como un número, también puede construirse un algoritmo que nos permita dar acceso a algún archivo o directorio a partir de una contraseña, entre otras posibilidades. A continuación presentamos una serie de operaciones comunes que nos permitirán tener un manejo básico de un string.
Objetivos

Operaciones básicas para crear un formato
Operaciones de búsqueda
Operaciones lógicas de formato
Sentencias de condicionamiento
Ejercicio de práctica

1. Operaciones básicas para asignar un formato
En ocasiones se vuelve útil poder controlar a partir de ciertos comandos el formato de un string, pudiendo cambiar letras mayúsculas y minúsculas, centrar o mover la variable a un extremo de la pantalla y/o darle un formato en específico a nuestra secuencia.
Por ejemplo un string que definiremos como variable podemos hacer que represente un pequeño texto, una vez definido nuestro string le daremos un formato de título mediante el siguiente comando.
End of explanation
"""


print cadena_1.upper()

"""
Explanation: Otra posibilidad es que imprima nuestra variable asignada únicamente con letras mayúsculas.
End of explanation
"""


cadena_2 = "lo maravilloso de programar"

print cadena_2.center(50,"=")

"""
Explanation: Centrar o alinear un texto a la izquierda o derecha de la pantalla son otras opciones de formato posibles de realizar con comandos de python definidos para un string.
End of explanation
"""


cadena_1 = "aprender haciendo".title()

print cadena_1.rjust(40, " ")

"""
Explanation: Podemos redefinir una variable con cierto formato y luego convinar con otra opción de formato como sigue.
End of explanation
"""


print cadena_1.ljust(40, "*")

"""
Explanation: Se puede observar que el comando anterior ajusta el texto a la derecha, además de que se puede introducir cualquier símbolo incluso espacio, su homólogo a la izquierda es el siguiente.
End of explanation
"""


cadena_3 = "buscando a wally".title()

cadena_3.find("Wally")

"""
Explanation: 2. Operaciones de busqueda en un string
Realizar operaciones de búsqueda de un caracter o subcadena dentro de una cadena, pudiendo contabilizar cuantas veces se repite este carácter o determinar la posición en la cual se encuentra la subcadena dentro de la cadena es posible mediante los siguientes comandos.
```Python
```
End of explanation
"""


cadena_3.find("Wally",0,10)

cadena_3.find("Wally",2,20)

"""
Explanation: EL comando find nos arroja un número que nos indica la posición que antecede al primer caracter de Wally, es decir encontramos a Wally luego del carácter que se ubica luego de la posición 11 dentro de la cadena 3. Otra opción es realizar una búsqueda de un subtexto en un tramo definido de la variable, mencionando además que cuando no se encuentra el carácter en el tramo definido, por defecto nos arroja el valor -1.
End of explanation
"""


cadena_4 = "que fácil de encontrar"

cadena_4.count("e")


cadena_4.count("e",0,13)

"""
Explanation: Podemos también contabilizar cuantas veces se encuentra un caracter o subcadena dentro de una cadena con el comando count. Y de igual modo que antes la contabilización es posible de realizar en un tramo definido del texto.
End of explanation
"""


cadena_5 = "construyendo un detector de mentiras"
print cadena_5.startswith("construyendo un")

print cadena_5.endswith("detector")

"""
Explanation: 3. Operaciones lógicas de formato
Veremos que podemos realizar sentencias lógicas en relación a características de un string, esto puede ser de mucha ayuda a la hora de definir ciertos formatos para variables que el programador o usuario deben manipular.
Comenzamos con sentencias que refieren al formato de un string, por ejemplo saber si comienza o termina con determinados caracteres, utilizando los comandos startswith() y endswith() respectivamente, a lo que Python respondera con verdadero o falso.
End of explanation
"""


cadena_6 = "ano"
print cadena_6.isdigit()

cadena_7 = "1987"
print cadena_7.isalpha()

cadena_8 = cadena_6 + cadena_7
print cadena_8
print cadena_8.isalnum()

"""
Explanation: Además podemos verificar si el string contiene caracteres sólo numéricos, alfabéticos o alfanuméricos, usando los comandos isdigit(), isalpha() y isalnum() respectivamente.
End of explanation
"""


nombre = "isaac"
print nombre.isupper()

apellido = "asimov".upper()
print apellido.islower()
respuesta = apellido.islower()
print respuesta

nombre_completo = nombre.title() + apellido.title()

print nombre_completo

"""
Explanation: Luego podemos intentar con otras características de formato, como por ejemplo saber si la cadena contiene caracteres sólo mayúsculas, sólo minúsculas o inclusive algún formato especifico como de título, usando los comandos isupper(), islower() y por último istitle()
End of explanation
"""


nombre_completo = "isaac asimov".title()
print nombre_completo.isspace()

"""
Explanation: La última característica de formato aplicada desde una operación lógica será si la cadena contiene sólo espacios en blanco, para lo que utilizaremos el comando isspace() como sigue a continuación.
End of explanation
"""


contrasena_1 = "abcd1234"

if len(contrasena_1)<10:
    print "la contrasena contiene menos de 10 caracteres"
else:
    print "contrasena válida"

contrasena_2 = "abcd1234ab"
respuesta = contrasena_2.islower()

if len(contrasena_2)<10:
    print "la contrasena contiene menos de 10 caracteres"
elif respuesta == True:
    print "la contrasena debe contener al menos 1 caracter mayúscula"
else:
    print "contrasena válida"

"""
Explanation: 4. Sentencias de condicionamiento
Por último en este tutorial introduciremos una sentencia de condicionamiento que nos permitirá ampliar el espectro de aplicación de operaciones lógicas a partir de elementos básicos.
End of explanation
"""


>>> desarrollo ejercicio

"""
Explanation: 5. Ejercicio de práctica
Para aplicar lo aprendido en este tutorial, se deja el ejercicio de crear una pequeña rutina que verifique si los datos referente a las variables nombre_usuario y contrasena cumplen con las siguientes condiciones:

El nombre de usuario debe encontrarse en formato de título
El nombre de usuario sólo debe contener caracteres alfabéticos
Para la contraseña se debe especificar que si tiene menor a 5 caracteres no es válida
Si la contraseña tiene menos de 8 caracteres es riesgosa y mayor o igual a 10 es segura
La contraseña debe ser de tipo alfanumérica y no debe tener espacios en blanco
Por último la contrasena debe contener mayúsculas y minúsculas
End of explanation
"""


