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 una puntuación. Un script cuenta cuántas veces sucedió 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 inicio.
Los operadores
Los cuatro operadores de las matemáticas (+, -, *, /) funcionan exactamente como esperarías. Python agrega 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 de papel. Los tres extras valen la pena aprender pronto: // divide hacia un número entero, % te da el residuo, y ** eleva a una potencia. Uso % 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 se divide evenly)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (redondea hacia el infinito negativo, no hacia cero)Usarás principalmente // con números positivos. Mantén el comportamiento negativo en mente para cuando aparezcan.
/ siempre devuelve un decimal, incluso cuando se divide evenly: 4 / 2 es 2.0. // suelta la parte fraccionaria, pero vigila los negativos: -7 // 2 es -4, no -3, porque redondea en lugar de cortar. Me atrapó la primera vez que lo hice. El operador de 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 (se divide evenly)
10 % 7 # 3
6 % 2 # 0 (par)
7 % 2 # 1 (impar)% es el sobrante después de la división entera. 10 % 3 es 1 porque 3 cabe en 10 tres veces con 1 restante. La mayoría de las veces lo encuentras 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: elevar 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 estándar de matemáticas: 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 necesites 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 pequeño error no es un bug de Python. Las computadoras almacenan números decimales en binario, y algunos valores como 0.1 no pueden ser representados exactamente. Es similar a cómo 1/3 no puede ser escrito 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á 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, cada lenguaje hace esto. Para salida cotidiana, round() o :.2f lo mantiene ordenado. Literales numéricos legibles
Python te deja 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, independientemente del signo de la entrada. Úsalo cuando te importe qué tan lejos un número está de cero, no qué dirección.
abs(-5) # 5
abs(3.7) # 3.7
abs(-0.5) # 0.5abs() elimina el signo y devuelve el tamaño positivo: abs(-5) es 5, abs(3.7) es 3.7. Alcánzalo cuando te importe qué tan lejos un número está de cero, no 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 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 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 carrera de decimales.

