Skip to content

Latest commit

 

History

History
215 lines (167 loc) · 9.39 KB

03.datos.md

File metadata and controls

215 lines (167 loc) · 9.39 KB

Tipos de datos básicos y cómo trabajar con ellos

Los tipos simples, para simplificar, son de dos tipos solamente: o números o palabras. Nada es simple, y todo se puede complicar eventualmente (y lo hará), pero por lo pronto quedémonos ahí.

Arrancamos gore u otro REPL desde nuestra línea de órdenes, y vamos a ver cómo trabajar con estos datos. Ábrelo y empieza a teclear números y palabras por separado

gore> 3
gore> "cosas"

Las palabras llevarán comillas alrededor. Incluso aunque se trate de una sola letra. El intérprete se acuerda de lo último que has tecleado, y puedes acceder a él usando ↑. Repitiendo y editando podemos pasar el día, así que vamos a empezar a hacer algo con estos números. Por ejemplo...

un poco de aritmética básica

Los ordenadores, en realidad, son calculadoras con complicaciones. Lo más básico que se puede hacer es operaciones aritméticas. Go no tiene nada inesperado en este área. Suma, resta, multiplicación y división

gore> 3*8+5.2/8

que debe dar 24.65, un número real o float en el argot del lenguaje.

Adicionalmente, el operador % te permite hacer división entera

gore> 17 % 3
3

La mayoría de los lenguajes con un intérprete tal como gore se comportan de una forma similar, aunque algunos pueden tener otros operadores o llamar a los operadores no estándar de otra forma. Por ejemplo, si abres la consola de desarrollo en tu navegador (con mayúsculas-control-k en Firefox, por ejemplo), tendrás el mismo resultado, aunque estaremos trabajando en JavaScript.

Resultado en la consola de desarrollo de JavaScript

Y aunque inicialmente hayamos metido a todos los números en el mismo saco, no todos son iguales. Los enteros o naturales y los números reales (los que tienen coma decimal) se comportarán de forma diferente, aunque no habrá que preocuparse (demasiado) por ello ahora mismo.

Los números que Go entiende son los números arábigos, vamos, los de toda la vida. Si usamos números romanos como Ⅴ no los entenderá como tal, sino como un carácter y nos dará un error de variable no definida. No en todos los lenguajes es así. Perl 6 trabaja de forma nativa con este tipo de números, y Ⅴ+5 resultará en el número 10, y 5**Ⅴ en 3125. Los lenguajes de programación, poco a poco, van empezando a usar el potencial completo de Unicode, pero algunos lenguajes, como Python, JavaScript o Go todavía no han llegado a hacerlo.

Sin embargo, todos estos lenguajes suelen incluir el operador módulo y llamarlo %, este operador devuelve el resto de dividir el numerador, a la izquierda del mismo, del denominador, a la derecha:

gore> 17 % 11
6

Como buen lenguaje de programación, también podemos

Trabajar con cualquier tipo de carácter

Pero vamos a dar un paso hacia atrás, o hacia un lado, para reconocer que existen letras más allá de nuestro alfabeto latino. Empezando por los emojis, tales como este, ⌣, y terminando con los caracteres de alfabetos vivos o muertos como este . Un lenguaje de programación moderno, y un ordenador moderno, debe ser capaz de trabajar con todos ellos.

"þor el poderoso ✌"

Como hemos visto más arriba, las cadenas o strings están rodeadas por comillas, dobles " o backticks `. Las primeras no pueden contener saltos de línea y permiten la utilización de secuencias de escape, es decir, caracteres que permiten escribir cosas que no son exactamente caracteres, como retornos de línea, tabuladores o incluso colores.

Hemos elegido þ como carácter raro porque es uno de los pocos de este tipo que se pueden teclear fácilmente desde el teclado castellano. þ sale con AltGr + p. Otros caracteres son ß, que sale con AltGr + s u ø, que se obtiene con AltGr + o.

Cualquier tipo de cadena está compuesta por un número de caracteres determinado, que se halla con len:

gore> var cadena = "micadena"
gore> len(cadena)
8

Las cadenas están hechas de bytes individuales. Normalmente, cada caracter ocupa un solo byte aunque puede darse el caso que caracteres de otros idiomas por ejemplo, el ruso, ocupen más de un byte.

Las cadenas están divididas en los caracteres que lo componen, y podemos acceder a ellos indicando su índice, que comienza por 0: "þor el poderoso ✌"[16] devolverá el valor en byte de ✌. También podemos acceder a grupos de caracteres, usando el rango x:y. cadena[0:3] nos devolverá los 4 primeros caracteres de la cadena. Otra opción válida sería cadena[:3]. Como al acceder a un caracter de una cadena obtenemos su valor en byte y este es un valor numérico, podemos aplicarle los operadores aritméticos.

Para la concatenación de cadenas, utilizaremos el caracter +:

gore>> "Nos vamos "+"a la feria"
"Nos vamos a la feria"

Ojo: a partir de aquí es de Python

¿Y qué ocurre cuando tratamos de mezclarlas con los números? Pues que resulta en un error. Aparte de tener tipado pato, Python usa también comprobación dinámica de tipos para saber si se puede aplicar o no una operación a sus operandos. En este caso no encuentra ninguna forma sensata de sumar una cadena a un número, así que simplemente expresa su disconformidad con el asunto, diciendo que se trata de una operación inválida.

Hablemos de los problemas de entendimiento.

En el caso anterior, el intérprete nos ha dicho: TypeError: must be str, not int. Pero es leer la palabra error y uno empieza a sentirse culpable. Es culpa mía, todo lo hago mal, voy a empezar de nuevo hasta que lo consiga.

Pero no hay por qué tomárselo así. Error es simplemente la forma en la que los ordenadores nos dicen "No te he entendido bien". Los ordenadores, y los intérpretes de lenguajes, son muy literales y todo lo interpretan tal y como se ha tecleado. Miran, y si no te entienden te lo dicen. Pero también te dan a entender que es un problema de expectativas. Esperaban una cosa, y ha sido otra: must be str, not int. Debe ser un str, no un int. Si fueran capaces de saber de qué cadena se trata, ellos mismos lo harían. De hecho, algunos otros lenguajes se comportarán de forma diferente. JavaScript, por ejemplo, dirá que "3.4"+7 es, naturalmente, 3.47 haciendo una conversión implícita de un número a una cadena. Otro lenguaje, R, te dirá: Error in "3.4" + 7 : argumento no-numérico para operador binario. No le gusta la cadena y no tiene reparos en decirlo, porque R es un lenguaje estadístico, y por tanto (casi) matemático. Perl, sin embargo, llevará el tipado pato hasta las últimas consecuencias, dando como resultado 10.4.

Lo que viene a querer decir que lenguajes diferentes van a entender esa expresión, forzosamente ambigua, de forma diferente. Pero si no la entienden, te van a dar alguna pista de por qué no lo han hecho.

Volvamos a Python: TypeError: must be str, not int te dice que hay un problema con el tipo de uno de los operandos, que debe ser una cadena (str), no un entero. Como sólo hay un entero, el número 7, eso quiere decir que ahí es donde está el error, al menos según Python. De hecho, si lo hacemos al revés, 7+"3.4", Python nos dirá:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

que es algo más informativo. Ya no te está diciendo que el entero es un error, sino que alguno de los dos está equivocado. En las líneas anteriores, además, te indica dónde ha ocurrido, aunque File "<stdin>", line 1, in <module>no sea demasiado amigable.

En todo caso, estos mensajes te ayudan a entender dónde ha producido el malentendido y de qué se trata. Aunque estén en inglés (en la mayoría de los casos), conviene leerlos tranquilamente y comprender qué es lo que dicen, porque te da la pista de por qué el ordenador no ha sido capaz de entender lo que se le quería decir. En este caso, porque Python no sabe como sumar dos cosas que tienen un tipo diferente. Simplemente, a la siguiente, se le suministran cosas a los dos lados del signo + que sean compatibles y listos.

Y si todo falla, siempre puedes buscarlo en Internet. Eliminando lo que sea específico de tu código, como nombres de variable y demás, puedes buscar el resto y llegará, en la mayor parte de los casos, a StackOverflow donde verás contextos similares y una solución al problema. En este caso, te viene a decir que hay que hacer una conversión explícita: 7+float("3.4"), lo que está totalmente de acuerdo con el zen de Python:

>Explícito antes que implícito

Y, por supuesto, toda esta sección se corresponde al de

>Los errores no deben suceder en silencio

Como conclusión a esta sección: si el ordenador no te entiende y te lo dice cortésmente, lee, comprende, trata de adaptarte a lo que requiere, pero si todo falla, Google es tu amigo.

Concluyendo

No es malo equivocarse. Sucede en las mejores familias, incluso en las operaciones más básicas. Para las cuales puedes usar Go como si fuera una calculadora un poco más complicada y que usara, además, cadenas de caracteres. Vale, una calculadora complicada y rara.