LA FUNCIÓN TYPE()

PLAYA DE ALMÁCIGA. MACIZO DE ANAGA. NORTE DE TENERIFE.
     Vamos a comenzar con nuestra primera función, Y vamos a hacerlo probablemente por la más simple de todas, de facto, una metafunción: la función type().
Fijémonos en cómo la hemos representado: con un paréntesis a la derecha del nombre. En Python, como en otros muchos lenguajes de programación, todas la funciones muestran siempre esta estructura básica: su nombre, en nuestro caso, type, y un paréntesis, (), en cuyo interior vamos a colocar el dato o los datos que la función necesita para devolver un resultado. A este dato o conjunto de datos se le denomina en Python ARGUMENTO DE LA FUNCIÓN. Lo veremos en ocasiones en su forma contraída como ARG, de "argument", en inglés.
¿Y qué es una "función", por cierto? Pues un constructo semántico-sintáctico propio del lenguaje por el cuál Python "sabe" que tiene que hacer algo y proporcionar un resultado. Dicho de manera más simple y con menos boberías: una "función" es aquéllo que ponemos en nuestros programas para que éste haga cosas y "funcione". Mejor así, ¿verdad?
De lo que acabamos de exponer deducimos que cuando "llamamos" o "invocamos" a la función type() que, como su nombre sugiere, y no hay que romperse mucho la cabeza para caer en la cuenta, se nos muestra el TIPO del dato que le "pasamos como argumento", recordemos, entre los paréntesis.
Veamos un ejemplo:

C6



La función type() nos dice que el dato numérico '4' que le pasamos como argumento es un dato de tipo INT, un 'integer', un número entero.
Aportamos nuevos ejemplos:

C7



En el primer caso, la función type() nos dice que el número negativo'-17' es un número entero, del tipo INT. para el segundo nos dice que es un dato del tipo FLOAT, esto es, un número decimal. Para el último hemos introducido un texto. Observemos que en el código de colores predeterminado en el IDLE de Python, las funciones aparecen en malva, los datos numéricos en negro y los textos en verde, lo que nos ayuda a distinguirlos mejor sobre el SHELL de un simple vistazo.
Hablaremos de los textos casi de inmediato. Pero por ahora sólo nos interesa saber que la función type() nos dice que el argumento "HOLA"  es una STR, la contracción de STRING. En Python una STRING es una "cadena" o "cuerda" (comúnmente, en castellano, se emplea la traducción "cadena" antes que "cuerda") de caracteres literarios, literales o de texto. Así pues, podemos comprobar cómo la función type() es capaz de identificarla naturaleza, la "clase" (CLASS) de cualquier objeto que le pasemos como argumento.
Veamos estos ejemplos introduciendo, en esta ocasión, como argumentos las CLASS que nos ha devuelto la función hasta el momento.


C8

  

    
Notemos que en los tres casos, la función  nos devuelve el mismo resultado: < CLASS 'TYPE'>. Esto significa que  que INTFLOAT y STR son tipos de datos, es decir, '4' es de tipo INT, como '-0.542' es de tipo FLOAT, "¿Qué tal estás hoy?" es de tipo STR, como recurriendo de nuevo a la analogía, esta vez, con nuestra gramática castellana, "Ana" es de tipo NOMBRE, "verde" es de tipo ADJETIVO. "cantar" es de tipo VERBO o "ayer" es de tipo ADVERBIO.  ¿Verdad que parece sencillo? Pues continuamos...                                                                              

Vayamos por el siguiente ejemplo:


C9

¡Nada! ¡Nada! Respiremos con calma. Este nombre tan largo y tan raro que nos acaba de devolver la función cuando le hemos pasado como argumento el nombre de una función (fijémonos en su color malva delator y que no hemos añadido los parétesis pertinentes), nos indica que puede tener dos clases: bien puede ser una BUILTIN FUNCTION, esto es, una FUNCIÓN PRECONSTRUIDA de Python, y ya veremos en su momento qué es eso, o un METHOD, un MÉTODO, que también veremos en su momento lo que es. De momento, con respecto a este último término, tan sólo diremos que viene a ser algo así como"las cosas que podemos hacer con un objeto", ya sea una string, una lista, una tupla, un diccionario, etcétera. Si el objeto fuera un palo, por ejemplo, ¿qué cosas podríamos hacer con un palo? Pues golpear una piedra, apuntalar una mesa a la que le falta una pata, hacer un agujero en el suelo, agitar las ramas de un olivo para que caigan aceitunas, etc... Pues eso: golpear una piedra, apuntalar una mesa, hacer un agujero y agitar una rama, en Python, son MÉTODOS.
Ya los estudiaremos con la profundidad necesaria para comprenderlos y saberlos utilizar.


     Ahora, lo que importa, es que nos hayamos familiarizado, no sólo con los tipos de números, recordemos una vez más: INT (INTEGER, "ENTERO"), tanto positivo (4) como negativo (-4) y FLOAT ("DECIMAL"), tanto positivo (9.08) como negativo (-9.08); sino también con nuestra primera función type() que, recordemos igualmente, nos devuelve el tipado del objeto que le pasamos como argumento, incrustándolo entre los paréntesis.
Recordemos también que el IDLE de Python utiliza un código de colores para enseñarnos a reconocer las diferentes estructuras de lenguaje que utiliza. Hemos visto que emplea el negro para los números y el azul para los resultados. De refilón (insistimos en que lo vamos a tratar en breve) ya sabemos que las STRING  se mostrarán en verde. Y ahora sabemos que las funciones se tintarán en magenta


 
Pongamos ahora nuestra atención en el CUADRO DE INFORMACIÓN que se nos abre de forma automática  en el momento de escribir el paréntesis de apertura. ¿Y por qué sucede esto? Porque Python quiere ser nuestro amigo. Dicho de otro modo, nos ofrece una interfaz, una GUI amigable. No perdamos de vista que con respecto al IDLE, éste no sólo cumple una función de soporte para el desarrollo de programas sino que nunca pierde de vista su funcionalidad pedagógica. Aprovechémoslo en nuestro propio beneficio.
El CUADRO DE INFORMACIÓN se abrirá por defecto cada vez que escribamos el paréntesis de apertura de cualquier función. Y su razón de ser en la de orientarnos sobre lo que la función es capaz de hacer, sus caraterísticas principales y los objetos que soporta como argumentos (parámetros), el orden de ubicación entre los paréntesis, etc.
Veámoslo para la función type():

C10


La primera línea nos señala qué parámetro podemos pasar como argumentos de la función. En la segunda, fijémonos en la flecha pues ésta apunta a las devoluciones, nos informa sobre lo que nos va a mostrar en el caso de que le pasemos un objeto como argumento, en este caso y como ya hemos visto en los ejemplos, el tipo del objeto. Y la tercera nos informa sobre lo que nos va a devolver cuando le pasamos un 'name', 'bases' o 'dict', en este caso, un tipo nuevo.
Concluimos señalando que la función type() es una (meta)función que resulta útil para realizar pruebas o testeos por parte del programador ("¿De qué clase o tipo será la devolución de este script?") y ulteriores depuraciones del código. No es necesario recurrir a ella cuando ya codificamos de una manera definitiva, por así decirlo, "en serio", en tanto que Python nos proporciona una alternativa mejor que ya estudiaremos en su momento.
Por cierto, DEPURAR (debugging, en inglés) un código o programa determina el proceso a través del cual es posible localizar, identificar y subsecuentemente, corregir faltas u omisiones y/o errores de programación en función del lenguaje en el que estamos codificando.

VERODES BAJO LA FRONDA

EL TIPADO DINÁMICO


     Vamos a aprovechar la oportunidad para  conocer un poquito mejor una de las particularidades más notables de Python; EL TIPADO DINÁMICO. En otros lenguajes en programación, como C++ y sus derivados o JAVA, por ejemplo, deberíamos definir cada variable (este concepto lo trabajamos en el capítulo siguiente) denominando su tipo (type) concreto, es decir, si es de tipo 'literal' (string); de tipo 'numérico' (int o float); de tipo 'lista' (list); etc.
En Python, sin embargo, y para gran alivio nuestro, no es necesario hacerlo: no se indica tipo alguno en el momento de declarar una variable, dado que éste (string, int, float, list, dict, ...) le será asignado automáticamente a la variable en el tiempo de ejecución. Esto es lo que llamamos TIPADO DINÁMICO.
A continuación, comprueba si existe la variable a la que, en teoría, debería asignarse dicho valor: si no existe, crea una referencia que enlaza la nueva variable en el objeto; si existe, se cambia la referencia hacia el objeto creado.
Conviene subrayar que tanto las variables como los objetos se almacenan en diferentes zonas de la memoria.
Las variables se guardan o almacenan con una especie de "tabla" donde se indica a qué objeto referencia cada uno de ellos.

E2


Los objetos o datos (en la tabla superior, datos numéricos de tipo INT) son trocitos de memoria que albergan el valor que representan (1, 2, 3 y 4): Finalmente, las referencias son como flechas, como punteros, que enlazan objetos con variables (A, B, C y D). De este modo, una variable (A) referencia a un objeto (INT) que contiene un valor específico (1) en un momento del tiempo.
Por esta razón, los tipos (int, float, str, list,...) están asociados a objetos y no a variables: los objetos conocen de qué tipo son(el objeto 1 "sabe" que es de tipo INT) pero no así las variables(el objeto 1 no "sabe" que está asociado a la variable A hasta el momento mágico en que pulsamos la tecla ENTER). Por eso Python consigue implementar el tipado dinámico.
El intérprete de Python, y ya veremos qué debemos entender por "intérprete", utiliza un "contador" de las referencias que se van asignando entre variables y objetos. Cuan do esta referencias van modificándose y quedan obsoletas, inservibles, aparece el RECOLECTOR DE BASURA (sí, tal y como suena), que se encarga de ir colocando cartelitos de "disponible", metafóricamente hablando, en el espacio de memoria que ocupaba un objeto que ha dejado de ser referenciado.

   


      ¿Y qué conseguimos con el dichoso TIPADO DINÁMICO? Ya os lo digo yo: que en un mismo bloque de código podamos asignar diferentes tipos de datos a una misma variable, donde el intérprete, en tiempo de ejecución, irá creando los objetos y referencias que fueran necesarios. 
  
E3
HONGO DE LEÑA EN LA LAURISILVA HÚMEDA

No hay comentarios:

Publicar un comentario