Tiza Paso a paso
Practicar →

Pensamiento Computacional · Unidad 2 — Datos, expresiones y funciones

Tipos de datos

Cada valor tiene un tipo, y el tipo decide qué se puede hacer con él. El mismo signo + suma números y pega textos.

Practicar este tema →8 ejercicios que te corrigen paso a paso · gratis, sin cuenta

La explicación

Los cuatro tipos simples

int     números enteros        42   -7   0
float   números con coma      3.14   -0.5   2.0
str     texto (entre comillas)  "hola"   "42"
bool    verdadero o falso     True   False

En Python el tipo no se declara: se deduce de lo que escribís. type(x) te lo dice.

2 y 2.0 no son lo mismo

2 es int y 2.0 es float. Valen lo mismo pero se comportan distinto, y eso se contagia: cualquier operación con un float da float.

5 // 2     → 2     (int)
5.0 // 2   → 2.0   (float)

"42" no es 42

Este es el error más frecuente de toda la materia. Un número entre comillas es texto. Se parece a un número, pero no se puede sumar con uno:
"3" + 4     → error
"3" + "4"   → "34"  (los pega)
3 + 4       → 7     (los suma)
Y viene siempre del mismo lado: input() devuelve texto, siempre, aunque la persona escriba un número.

Convertir de un tipo a otro

int("42")     → 42
float("3.5")   → 3.5
str(42)       → "42"
int(3.9)      → 3   (corta, no redondea)

Ojo con el último: int() sobre un float trunca hacia cero, no redondea. int(3.9) da 3 y int(-3.9) da -3. Si querés redondear, es round(). Y int("hola") tira error: sólo convierte lo que parece número.

Leer del teclado

edad = input("¿Cuántos años tenés? ")   # esto es texto
edad = int(edad)                     # ahora sí es número

edad = int(input("¿Cuántos años tenés? "))   # las dos cosas de una
La conversión que falla más seguido. int("42.5") no da 42: tira ValueError: invalid literal for int() with base 10: '42.5'. int() sobre un texto exige que el texto sea un entero entero, sin punto. Si el usuario puede escribir decimales hay que pasar por float primero: int(float("42.5")) sí da 42. Es la diferencia entre convertir texto a número y recortar un número que ya tenés.

Preguntarle a Python de qué tipo es algo

type(42)       → int
type(3.14)     → float
type("hola")   → str
type(True)     → bool

No hace falta memorizar nada: cuando un programa se comporta raro, intercalar un print(type(x), x) antes de la línea que falla resuelve la mitad de los casos. Casi siempre la respuesta es que algo que creías número es str, porque vino de un input.

Cualquier valor sirve como condición

Aunque bool tenga solo dos valores, Python sabe leer cualquier dato como verdadero o falso, y esto se usa muchísimo en la unidad 3:

Falso:  0  ·  0.0  ·  ""  ·  []  ·  {}  ·  None
Verdadero:  todo lo demás (incluido -3, y también [0])
Fijate el detalle que se toma: [0] es verdadero aunque adentro tenga un cero, porque lo que se mira es si la lista está vacía, no qué contiene. Por eso if lista: se lee «si la lista tiene algo», y es la forma idiomática de preguntarlo — mejor que if len(lista) > 0:, que dice lo mismo más largo.
Un ejercicio resuelto, paso a paso

Un programa pide dos números con input() y muestra la suma, pero con 3 y 4 imprime 34. ¿Por qué, y cómo se arregla?

El programa que falla:

a = input("Primero: ")
b = input("Segundo: ")
print("La suma es", a + b)

Por qué. input() siempre devuelve str. Entonces a vale "3" y b vale "4", y entre dos strings el + no suma: concatena.

El arreglo es convertir apenas entra el dato:

a = int(input("Primero: "))
b = int(input("Segundo: "))
print("La suma es", a + b)

Ahora imprime La suma es 7.

Conviene convertir en la misma línea del input, no más abajo. Si dejás la conversión para después, hay un tramo del programa donde la variable es texto pero parece número, y ahí es donde aparecen los errores raros.

Control de razonabilidad: si una suma da un número con los dígitos de los dos sumandos pegados (3 y 4 → 34), no falló la cuenta: son strings.

Y si el usuario escribe 3.5. El programa se cae con ValueError: invalid literal for int() with base 10: '3.5', porque int() sobre texto no acepta el punto. Hay dos arreglos y son decisiones distintas, no una mejor que la otra: si el enunciado pide enteros, está bien que corte y lo que falta es avisarlo (eso se hace con try/except, en 5.2); si tiene sentido aceptar decimales, se cambia a float(input(...)) y listo. Lo que no hay que hacer es int(float(...)) sin pensarlo: eso acepta el 3.5 y en silencio lo convierte en 3.

Cómo verlo antes de que explote: poné print(type(a), a) justo después del input. Si dice <class 'str'> 3 falta el int; si dice <class 'int'> 3 está bien. Ese print de diagnóstico se borra después, y mientras tanto ahorra media hora de mirar el programa sin entender.

Y uno del nivel del parcial

Decir qué imprime cada una de estas líneas y explicar las dos que sorprenden: print(7 / 2) · print(7 // 2) · print(7 % 2) · print(-7 // 2) · print(-7 % 2) · print(type(7 / 1))

Las tres primeras son las esperables:

7 / 2   → 3.5    división común, siempre da float
7 // 2  →  3     división entera
7 % 2   →  1     el resto

Y acá empiezan las dos que sorprenden:

-7 // 2  → -4    (no -3)
-7 % 2   → 1     (no -1)

Por qué -7 // 2 da -4. La división entera de Python redondea hacia abajo, no hacia el cero. Y −3,5 redondeado hacia abajo es −4, porque −4 está más abajo que −3.

-7 / 2 = -3.5 → hacia abajo: -4 → hacia el cero sería: -3

Y el resto se acomoda para que la cuenta cierre. Python garantiza siempre este invariante:

(a // b) * b + (a % b) == a
(-4) * 2 + 1 = -8 + 1 = -7 ✓

Si el cociente fuera −3, el resto tendría que ser −1 para que diera −7, y Python prefiere que el resto tenga el signo del divisor. Las dos rarezas son en realidad una sola decisión, tomada para que el resto nunca sea negativo cuando se divide por un positivo.

Para qué sirve esa decisión. Es lo que hace que % funcione para los cálculos cíclicos sin corregir nada:

hoy es lunes (día 0). ¿Qué día era hace 10 días?
(0 - 10) % 7 = -10 % 7 = 4 → viernes ✓

En un lenguaje donde -10 % 7 diera −3 habría que sumarle 7 a mano cada vez que el resultado sale negativo.

La última línea, sobre los tipos:

type(7 / 1)  → <class 'float'>   ¡aunque el resultado sea 7.0!
type(7 // 1) → <class 'int'>

El operador / devuelve float siempre, aun cuando la división sea exacta. Eso importa cuando el resultado se usa como índice de una lista: lista[10/2] falla y lista[10//2] anda.

El resumen para llevarse al parcial:

/  → float siempre
// → int, redondeando hacia abajo (ojo con negativos)
%  → resto con el signo del divisor

Dónde se pierde el punto: contestar −3 y −1. Es lo que da la calculadora y lo que hacen otros lenguajes, y es justo por eso que el ejercicio lo pregunta.

Dónde se cae la mayoría

Hasta acá la explicación. La práctica es la otra mitad: 8 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Y uno para escribir el programa vos, que se prueba ejecutándolo en Python ahí mismo, en el navegador. Además trae una animación que muestra la idea en movimiento.

Practicar Tipos de datos →

Dónde entra este tema en el parcial

Los otros temas de la unidad 2

Datos, expresiones y funciones

Ver todos los temas de Pensamiento Computacional