Números y operaciones aritméticas
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 pasó algo. Python te da operadores aritméticos que funcionan como las matemáticas en 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 suma tres más que usarás constantemente: división entera, residuo y exponenciació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 |
% | Residuo | 5 % 3 | 2 |
** | Exponenciación | 5 ** 3 | 125 |
+, -, *, / se comportan como las matemáticas en papel. Los tres extras valen la pena aprender desde temprano: // divide hacia un número entero, % te da el residuo, y ** eleva a una potencia. Uso % mucho más de lo que esperaba. División: / vs //
/ siempre te da el resultado decimal exacto, incluso si la respuesta es un número entero. // suelta la parte fraccionaria y redondea hacia el infinito negativo. Para números positivos significa cortar el decimal, pero para negativos da un paso más lejos de cero:
10 / 2 # 5.0 (siempre float, incluso cuando divide exactamente)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (redondea hacia infinito negativo, no hacia cero)Usarás // principalmente con números positivos. Ten presente el comportamiento con negativos para cuando aparezcan.
/ siempre devuelve un decimal, incluso cuando divide exactamente: 4 / 2 es 2.0. // suelta la parte fraccionaria, pero cuida los negativos: -7 // 2 es -4, no -3, porque redondea en lugar de cortar. Me atrapó la primera vez que lo hice. El operador residuo %
% te da lo que queda después de la división entera. Si 10 // 3 es 3 (porque 3 cabe en 10 tres veces), entonces 10 % 3 es 1 (porque 3 × 3 = 9, y 10 - 9 = 1). El uso más común es verificar si un número es par o impar.
10 % 3 # 1
10 % 2 # 0 (divide exactamente)
10 % 7 # 3
6 % 2 # 0 (par)
7 % 2 # 1 (impar)% es lo que queda después de la división entera. 10 % 3 es 1 porque 3 cabe en 10 tres veces con 1 para sobra. Principalmente lo encontrarás como la verificación par/impar: n % 2 es 0 para par, 1 para impar. Exponenciación **
** eleva un número a una potencia. Usa dos asteriscos, no el símbolo ^ (que significa otra cosa en Python):
2 ** 10 # 1024
3 ** 3 # 27
9 ** 0.5 # 3.0 (raíz cuadrada: eleva a la potencia de 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 hace algo no relacionado en Python. Precedencia de operadores
Python sigue el orden matemático estándar: exponenciación primero, luego multiplicación y división, luego suma y resta. Cuando no estés seguro, usa paréntesis. Hacen la intención clara 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 lugar y obtienes un decimal. Cuando necesitas un número entero, alcanza // o envuélvelo en int(). Precisión de float
Hay una trampa que sorprende a casi todos en algún momento:
0.1 + 0.2 # 0.30000000000000004Ese error minúsculo no es un error de Python. Las computadoras almacenan números decimales en binario, y algunos valores como 0.1 no pueden representarse exactamente. Es similar a cómo 1/3 no puede escribirse exactamente en decimal. Para la mayoría de los cálculos cotidianos no importa. Para mostrar dinero, round() o el especificador de formato :.2f mantendrá el resultado ordenado.
0.1 no tienen forma binaria exacta, así que 0.1 + 0.2 sale como 0.30000000000000004. No es un error de Python, cada lenguaje hace esto. Para salida cotidiana, round() o :.2f lo mantiene ordenado. Literales numéricos legibles
Python te permite poner guiones bajos en literales numéricos para hacer números grandes más legibles. Python los ignora completamente; están ahí 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 completamente, 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. Úsalo cuando te importe a qué distancia 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. Alcanza cuando te importe a qué distancia está un número de cero, no en qué dirección se inclina. round()
round() redondea al entero más cercano por defecto. Pasa un segundo argumento para mantener un número específico de lugares decimales:
round(3.7) # 4
round(3.2) # 3
round(3.14159, 2) # 3.14Una cosa 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 mitad de camino entre dos opciones.
round(x) va al número entero más cercano, round(x, n) mantiene n lugares decimales. La sorpresa: un valor sentado exactamente a mitad de camino redondea al número par más cercano, así que round(2.5) es 2, no 3. divmod()
divmod() te da tanto el cociente como el residuo en una sola llamada. Devuelve un par de valores, una tupla (cubierta en el capítulo Tuplas y conjuntos), que puedes asignar a dos nombres a la vez:
divmod(10, 3) # (3, 1): cociente 3, residuo 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 residuo juntos: divmod(10, 3) es (3, 1). Puedes desempacar 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"Bill: ${bill}")
print(f"Tip: ${tip}")
print(f"Total: ${total}")round() mantiene la salida pareciendo dinero en lugar de una larga corrida de lugares decimales.

