SkillGridAprende informática practicando

Valores y tipos: por qué 1 no es "1"

Un tipo es un conjunto de valores permitidos. Esa sola frase de logic:1 explica todos los errores raros que se encuentra un principiante.

13 min · 40 XP

Un programa es un montón de valores que se mueven de un lado a otro. Un número, un trozo de texto, un sí o un no, una lista de compras con puntuaciones. Todo lo demás de esta lección gira alrededor de una sola pregunta: qué clase de cosa es este valor, y qué se le permite que le pase.

En logic:1 un tipo era simplemente un conjunto. El conjunto booleano tiene exactamente dos miembros: true y false. El conjunto de los enteros contiene números sin decimales. El conjunto de las cadenas contiene texto de cualquier longitud, incluida la cadena vacía. Decir que un valor tiene un tipo es decir de qué conjunto viene. Cada operación que escribes es una afirmación sobre conjuntos: la suma quiere dos números, unir texto quiere dos cadenas.

bool   = { true, false }
int    = { ..., -2, -1, 0, 1, 2, ... }
string = any sequence of characters

age + 1   needs a value from int
"1" + 1   mixes a value from string with a value from intUn tipo es un conjunto de valores, y una operación es una afirmación sobre conjuntos.

Aquí tienes el mismo puñado de valores escrito en tres lenguajes. No intentes memorizarlo. Léelo como leerías la misma frase con tres acentos distintos: las palabras cambian, el significado no.

name = "Ada"
age = 36
tall = True
scores = [90, 85, 77]
prices = {"soup": 2.50, "juice": 1.90}Python: ningún tipo escrito a mano, el valor decide.
const name = "Ada";
const age = 36;
const tall = true;
const scores = [90, 85, 77];
const prices = { soup: 2.50, juice: 1.90 };JavaScript: const para un nombre al que no se le volverá a asignar nada.
var name string = "Ada"
var age int = 36
var tall bool = true
scores := []int{90, 85, 77}
prices := map[string]float64{"soup": 2.50, "juice": 1.90}Go: el tipo se escribe junto al nombre, y el compilador lo comprueba.

Ahora el desastre clásico de principiante. Un formulario de registro te pide la edad. El formulario envía texto, porque todo lo que envía un formulario es texto. Y tu código intenta sumarle uno.

form sends: age = "16"
8 + 1  = 9
"16" + 1 = ?Ocho más uno son nueve. ¿Cuánto es el texto "16" más uno?

La última idea es la mutabilidad, y les cuesta a las personas más horas de depuración que cualquier otra cosa de esta lección. Una lista es un solo objeto al que muchos nombres pueden apuntar. Cambia la lista a través de un nombre y todos los demás nombres ven el cambio, porque nunca hubo más que una sola lista.

scores = [90, 85]
same = scores
same.append(77)
print(scores)

[90, 85, 77]Dos nombres, una lista. El cambio se ve a través de los dos.
scoressame[90, 85]namesnamesone list, two namesappend 77[90, 85, 77][90, 85, 77]

Las colecciones también arrastran la idea de Big-O de logic:1. Elegir bien la colección suele valer más que reescribir tus bucles. Una lista sirve para el orden y para recorrerlo todo. Un map sirve para buscar cosas por clave. La tabla de costes de abajo es toda la justificación de que los map existan.

list.append(x)      O(1)
map[key]            O(1) average
x in list           O(n)
x in map            O(1) averageEl coste de una operación es el coste de la colección que guarda los valores.

Práctica

  1. Un formulario de registro envía la edad como texto: age = "16". Tu código ejecuta age + 1. ¿Cuál es la descripción honesta de lo que salió mal cuando esto falla?

    Pistas
    • El campo llega desde un formulario, y un formulario solo envía texto.
    • Pregúntate cuál de los dos valores vive en el conjunto de las cadenas y cuál vive en el conjunto de los números.
  2. Relaciona cada idea con la colección que está hecha para ella. Lo importante es la idea, no la sintaxis.

    Pistas
    • Python y Go escriben de forma distinta el mismo tipo de colección: una lista de nombres sigue siendo una lista de nombres.
    • Un map responde cuál es el valor de una clave dada sin recorrer antes toda la colección.
  3. Ordena los pasos de leer una edad desde un formulario. Esta es la forma de casi todos los programas que hablan con el mundo exterior.

    1. 1Comprobar que el texto realmente parece un número entero
    2. 2Convertir el texto en un número
    3. 3Volver a enviar el resultado fuera como texto
    4. 4Leer el texto en bruto exactamente tal como lo envió el formulario
    5. 5Hacer la aritmética con el número
    Pistas
    • Nada se puede tratar como número hasta que es un número.
    • La comprobación va antes de la aritmética: un programa nunca hace el paso tres si el paso dos no se pudo ejecutar.