Curso de programacion en python3 : 04 - Estructuras de control II

Esta entrada es parte de una serie, puedes ver la primera aquí

 

"Es prácticamente imposible enseñar buenos hábitos de programación a estudiantes que hayan sido previamente sometidos a una exposición de BASIC. Como desarrolladores en potencia, están mentalmente mutilados sin esperanza de regeneración" 
E. W. Dijkstra

Hoy después de terminar de ver un análisis de las conferencias del E3 creo que es un buen día para continuar estudiando python, la cita anterior no pretende más que ofender a algunos cuantos y al mismo tiempo es bastante verdadera en varios niveles, desgraciadamente nací como programador en java y eso se nota mucho cuando trabajo en python, mientras hago estas entradas olvido todo lo aprendido en java e intento pensar directamente en python, crean le a la cita, BASIC(y en ciertos aspectos java) es realmente malo para comprender como se debe programar, ya que simplifica cosas muy complejas, es imposible trabajar al revés, ya lo he intentado, es muy difícil obtener mejorías cuando se aprendió en un lenguaje simplificado y se desconoce del todo como funciona el hardware, creo que en tiempos modernos el único lenguaje que al menos intenta hacer una reflexión estructural a las bases de programación, es python, lenguajes como C son directamente de nivel medio y su propósito es funcionar ligados al hardware, justo por eso hago estas entradas, creo en lo que python representa y me siento agradecido por lo que me sigue enseñando.

Las estructuras de control están trabajadas al detalle, un for simple como el anterior no siempre deja claro la potencia que pueden tener las estructuras, entonces hagamos una prueba e intentemos iterar de formas un poco mas interesantes, no se si se va a entender pero los String o cadenas de caracteres, se llaman así ya que no son un tipo de dato real, sino una "cadena" de datos individuales.

Cada letra es un símbolo, identificado bajo una codificación, cada letra pesa 1 byte, compuesto por 8 bits, el bit es un valor binario y representa que hay electricidad pasando por un conducto (cable), para representar todo símbolo fueron necesarios 8bits, entonces creamos los bytes en donde cada byte es un símbolo o carácter (del inglés char), un String (String of char's) es justamente una cadena de varios caracteres, almacenados de forma consecutiva.

Ahora bien, un vector es una agrupación consecutiva de memoria ram, si pudiéramos ver un string representado en la ram, tendríamos letras consecutivas guardadas en un espacio cerrado, el mejor ejemplo es una estantería a la cual le ponemos separadores, solo hay un espacio de memoria reservado y en ese espacio están contenidas todas las letras que conforman el String de la forma:

a = "hola"
print(a[0])# h
print(a[1])# o
print(a[2])# l
print(a[3])# a
Este pequeño ejemplo si lo ejecutamos sobre python, nos dará como resultado el comentario que tiene a la par, esto nos indica que todo string es almacenado en memoria de la forma n-1, ya que inicia de cero, para obtener el tamaño de un vector, no necesariamente un string, se utiliza el método len() que significa "tamaño", abreviado y en inglés:

a = "hola"
for x in range(len(a)):#se inicia siempre en cero aunque no sea explicito, seria mejor poner (0, len(a))
    print(a[x])#donde x representa un numero dentro del rango

Ahora bien, es importante comprender lo que estamos usando, for es una palabra reservada que compara dos valores, ejecuta el código y  aumenta en 1 el valor introducido, entonces cada pasada a x se le suma uno.

La función range se comporta como un contador, pero en realidad lo único que hace es generar valores del tipo lista y al imprimir un range no obtendremos la lista de valores por asuntos del interprete, podemos contener y mostrar los valores de un range usando una lista, esto es una mera mención, pero se profundizará en el tema de las listas cuando lleguemos a las estructuras de datos.

print(range(0,5))#imprime el string "range(0,5)" por que YOLO(you only live once)
x = list(range(0,5))#guarda una lista a partir de los elementos de range
print(x)# imprime [0, 1, 2, 3, 4] tal cual, las listas se convierten en string, YOLO he dicho

Basándome en lo anterior, se imprime el string "range" por que el método nunca llegó a ejecutarse sino que el compilador asume que es un string ya que las listas se vuelven string por arte de Guido Van Rossum, sin mayor problema esto es comprensible, al convertir un range es una lista explícitamente, si se ejecuta el método y guarda los valores en la variable x, como la lista esta referenciada por x, se imprime el contenido de x, magia de python.

La palabra in es un comparador, su objetivo es buscar contenido dentro de un conjunto, lista, cadena o tupla, lo podemos ver claramente en la sentencia:

x = 'y' in "esto tiene la letra y"#itera entre los valores, compara y retorna un booleano
print(x)#sale true por que hay una "Y"

Recordemos dos cosas importantes, n-1 y el resultado de len para el string hola es 4 así que la función range empieza contando desde cero y al llegar a tres, ya ha pasado por cuatro elementos, no hay problema, todos vivimos felices, el problema viene cuando queremos hacer la gracia de obtener la ultima letra de un string, ya que len(a) devolverá 4, ¿será que la genialidad de nuestro benevolente dictador vitalicio nos ha abandonado?, ¡claro que no!, para estos casos considerando que las matemáticas son exactas, len()-1 será un resultado correcto, pero los números negativos deberían servir para algo, así que a[-1] significa que en vez de tomar el elemento uno, queremos el elemento ¿anterior?; inverso en realidad, si deseamos imprimir esa cuenta atrás automáticamente podemos hacer un while o for, todo es posible en el python de Van Rossum.

a = "hola"
x = -1
while(x >= -len(a)):
    print(a[x])
    x = x-1

Para el for es necesario usar el método reversed que como su nombre lo indica toma el range y lo convierte en su inverso, es mucho mas eficiente este código que el anterior por razones obvias, incluso se lee mas fácil, esto es lo que se conoce como código pythonico, aquel que no rompe leyes ni de la lógica, ni de la estética.

a = "hola"
for x in reversed(range(len(a))):
    print(a[x])

Ya hemos visto las implicaciones que puede tener la experimentación con cadenas, pues no, todavía falta mucho para terminar de comprender las, empecemos diciendo que las cadenas resulta que son multiplicables en python.

x = "esto es cadena\n"#el \n es equivalente a enter
print(3*x)#imprime tres veces la cadena

Si bien es cierto esto puede que no sirva de nada, también podría tener algunas aplicaciones para análisis sintáctico y otras tantas cosas menos propias de la informática pura, a fin de cuentas trabajamos para otros que normalmente no necesitan hacer tareas informáticas, mas bien quieren que la informática les resuelva un problema y claramente nuestro trabajo es hacer que lo haga.

Hasta aquí esta entrada, creo que voy a hacer la próxima ahora mismo, parece que hoy estoy bastante motivado.

Comentarios

Entradas populares de este blog

Hablemos de difamación, parafilias y denuncias bien hechas

Criticamos a pablito: "Atrapado en el cuerpo equivocado"

El fruto de una era: Antiintelectualismo moderno