Números y aritmética
Los números aparecen en casi todos los programas que escribes. Un carrito de compras suma un precio. Un juego actualiza un puntaje. Un script cuenta cuántas veces ocurrió algo. Python te da operadores aritméticos que funcionan como las matemáticas de papel, más algunos otros que vale la pena conocer desde el principio.
Los operadores
Los cuatro operadores de las matemáticas (+, -, *, /) funcionan exactamente como esperarías. Python agrega tres más que vas a usar constantemente: división entera, resto y potenciación.
price = 12.99
quantity = 3
print(price * quantity) # 38.97
print(price + 2) # 14.99
print(price - 1.00) # 11.99| Operador | Nombre | Ejemplo | Resultado |
|---|---|---|---|
+ | Suma | 5 + 3 | 8 |
- | Resta | 5 - 3 | 2 |
* | Multiplicación | 5 * 3 | 15 |
/ | División | 5 / 3 | 1.6666... |
// | División entera | 5 // 3 | 1 |
% | Resto | 5 % 3 | 2 |
** | Potenciación | 5 ** 3 | 125 |
+, -, *, / se comportan como las matemáticas de papel. Los tres extras vale la pena aprenderlos temprano: // divide hasta llegar a un número entero, % te da el resto, y ** eleva a una potencia. Termino usando % más de lo que jamás imaginé. División: / vs //
/ siempre te da el resultado decimal exacto, incluso si la respuesta es un número entero. // descarta la parte fraccionaria y redondea hacia el infinito negativo. Para números positivos eso significa cortar el decimal, pero para negativos avanza un paso más allá de cero:
10 / 2 # 5.0 (siempre float, aunque la división sea exacta)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (redondea hacia el infinito negativo, no hacia cero)En general vas a usar // con números positivos. Ten presente el comportamiento con negativos para cuando aparezcan.
/ siempre te devuelve un decimal, incluso cuando la división es exacta: 4 / 2 es 2.0. // descarta la parte fraccionaria, pero cuidado con los negativos: -7 // 2 es -4, no -3, porque redondea hacia abajo en lugar de truncar. A mí me agarró desprevenido la primera vez. El operador de resto %
% te da lo que queda después de una división entera. Si 10 // 3 es 3 (porque 3 entra en 10 tres veces), entonces 10 % 3 es 1 (porque 3 × 3 = 9, y 10 - 9 = 1). El uso más común es comprobar si un número es par o impar.
10 % 3 # 1
10 % 2 # 0 (división exacta)
10 % 7 # 3
6 % 2 # 0 (par)
7 % 2 # 1 (impar)% es lo que sobra después de una división entera. 10 % 3 es 1 porque 3 entra en 10 tres veces y sobra 1. Lo vas a encontrar sobre todo como la comprobación de par/impar: n % 2 es 0 para par, 1 para impar. Potenciación **
** eleva un número a una potencia. Usa dos asteriscos, no el símbolo ^ (que en Python significa otra cosa):
2 ** 10 # 1024
3 ** 3 # 27
9 ** 0.5 # 3.0 (raíz cuadrada: elevar a la potencia 0.5)** eleva un número a una potencia, así que 2 ** 10 es 1024. Una potencia fraccionaria te da una raíz: 9 ** 0.5 es 3.0. La única trampa es el símbolo: usa **, no ^, que en Python hace algo completamente distinto. Precedencia de operadores
Python sigue el orden matemático estándar: primero potenciación, luego multiplicación y división, y después suma y resta. Cuando tengas dudas, usa paréntesis. Dejan clara la intención y no cuestan nada:
2 + 3 * 4 # 14, no 20
2 ** 3 + 1 # 9, no 512
10 - 4 / 2 # 8.0, no 3.0
(2 + 3) * 4 # 20
10 / (2 + 3) # 2.0Cómo interactúan int y float
Python tiene una regla consistente: / siempre devuelve un decimal, incluso 4 / 2 da 2.0. Cualquier operación que mezcle un entero y un decimal también da un decimal. Cuando necesites un número entero, usa // o convierte con int().
4 / 2 # 2.0 (float, siempre)
4 // 2 # 2 (int)
4 + 2 # 6 (int)
4 + 2.0 # 6.0 (float)
4 * 0.5 # 2.0 (float)/ siempre da un decimal, así que 4 / 2 es 2.0, no 2. Mezcla un número entero con un decimal en cualquier operación y obtienes un decimal como resultado. Cuando necesites un número entero, usa // o envuélvelo con int(). Precisión de los floats
Hay un detalle que sorprende a casi todo el mundo en algún momento:
0.1 + 0.2 # 0.30000000000000004Ese pequeño error no es un bug de Python. Las computadoras almacenan los números decimales en binario, y algunos valores como 0.1 no se pueden representar exactamente. Es similar a cómo 1/3 no se puede escribir exactamente en decimal. Para la mayoría de los cálculos cotidianos no importa. Para mostrar cantidades de dinero, round() o el especificador de formato :.2f mantienen la salida ordenada.
0.1 no tienen forma binaria exacta, así que 0.1 + 0.2 sale como 0.30000000000000004. No es un bug de Python, todos los lenguajes hacen esto. Para la salida cotidiana, round() o :.2f lo mantienen ordenado. Literales numéricos legibles
Python te permite poner guiones bajos en los literales numéricos para hacer más legibles los números grandes. Python los ignora por completo; están ahí solo para ti:
population = 8_100_000_000
distance_km = 384_400
pi_approx = 3.141_592_6538_100_000_000 es el mismo valor que 8100000000. Python los ignora por completo, están ahí para tus ojos, no para el intérprete. Funciones integradas útiles
abs()
abs() devuelve el valor absoluto: siempre positivo, sin importar el signo de la entrada. Úsala cuando te importa qué tan lejos está un número de cero, no en qué dirección.
abs(-5) # 5
abs(3.7) # 3.7
abs(-0.5) # 0.5abs() quita el signo y devuelve el tamaño positivo: abs(-5) es 5, abs(3.7) es 3.7. Úsala cuando te importa qué tan lejos está un número de cero, no hacia qué lado se inclina. round()
round() redondea al entero más cercano por defecto. Pásale un segundo argumento para conservar una cantidad específica de decimales:
round(3.7) # 4
round(3.2) # 3
round(3.14159, 2) # 3.14Algo que vale la pena saber: round(2.5) da 2, no 3. Python redondea al número par más cercano cuando un valor está exactamente a la mitad entre dos opciones.
round(x) va al número entero más cercano, round(x, n) conserva n decimales. La sorpresa: un valor que cae exactamente a la mitad redondea al número par más cercano, así que round(2.5) es 2, no 3. divmod()
divmod() te da el cociente y el resto en una sola llamada. Devuelve un par de valores, una tupla (cubierta en el capítulo de Tuplas y conjuntos), que puedes asignar a dos nombres a la vez:
divmod(10, 3) # (3, 1): cociente 3, resto 1
divmod(7, 2) # (3, 1)
divmod(9, 3) # (3, 0)
quotient, remainder = divmod(10, 3)
print(quotient) # 3
print(remainder) # 1divmod(a, b) devuelve el cociente y el resto juntos: divmod(10, 3) es (3, 1). Puedes desempaquetar ambos a la vez con quotient, remainder = divmod(10, 3). En la práctica
Una calculadora de propina:
bill = 45.50
tip_rate = 0.18
tip = round(bill * tip_rate, 2)
total = round(bill + tip, 2)
print(f"Cuenta: ${bill}")
print(f"Propina: ${tip}")
print(f"Total: ${total}")round() hace que la salida se vea como dinero en lugar de una larga tira de decimales.

