Operadores y aritmética
En resumen: Los operadores aritméticos +, -, *, / y % hacen cálculos con números: / da un número decimal, // hace la división entera y da la parte entera, y % da el resto.
Problema
La cuenta en la mesa
Has pedido tres cafés a 2,50 € y dos cruasanes a 1,50 €. Pagas con un billete de 20 €. ¿Cuánto es la cuenta y cuánto cambio te tienen que dar?
Lo puedes calcular de cabeza. Pero la caja de la cafetería hace esta cuenta cientos de veces al día, con precios y cantidades distintos. El programa tiene que calcular por sí solo.
La idea
Los operadores aritméticos
Calculas igual que en papel: + suma, - resta, * multiplica, / divide. Estos signos se llaman operadores.
coffee = 2.5croissant = 1.5total = 3 * coffee + 2 * croissantchange = 20 - totalprint(f"Total: {total} €")print(f"Cambio: {change} €")Total: 10.5 €Cambio: 9.5 €El orden es el mismo que en matemáticas: primero * y /, después + y -. Por eso 3 * coffee + 2 * croissant es 7,5 + 3. Si quieres otro orden, pones paréntesis: (2 + 3) * 4 es 20.
Hay también un quinto operador, %. De él trata la siguiente idea.
Más precisamente, para curiosos
- Los operadores con la misma prioridad se calculan de izquierda a derecha:
20 - 5 - 3es 12, no 18. -delante de un número lo hace negativo:-total.
- Con texto,
+no suma, sino que pega, pero solo texto con texto. Texto + un número detiene el programa. Esa es la trampa de la siguiente tarjeta.
Pruébalo
Entradas para el concierto
Tres entradas a 8 € y 5 € de gastos de gestión del pedido.
¿Qué imprimirá el programa?
tickets = 3fee = 5print("Total: " + tickets * 8 + fee)* se calcula primero: tickets * 8 es 24. Después, de izquierda a derecha: "Total: " + 24 es texto + un número, y Python se detiene: TypeError: can only concatenate str (not "int") to str. Con un f-string el cálculo va dentro de las llaves y sale 29: f"Total: {tickets * 8 + fee}".Problema
2,25 horas en lugar de 2 h 15 min
La película dura 135 minutos. Quieres mostrarla en horas y minutos: 2 h 15 min. El primer intento:
minutes = 135hours = minutes / 60print(f"{hours} h")2.25 hEn Python, / siempre da un resultado decimal, aunque los dos números sean enteros: 6 / 3 es 2.0, y 17 / 3 es 5.666666666666667. Pero aquí necesitas dos horas enteras y los minutos que sobran. ¿Cómo se obtiene solo la parte entera?
La idea
División entera: // y %
// divide y se queda solo con la parte entera: 135 // 60 es 2, y 17 // 3 es 5. La parte decimal se corta. Esto se llama división entera.
Aquí la tienes paso a paso, con la suma de tres notas:
math = 5physics = 6english = 6whole = (math + physics + english) // 3print(f"Parte entera: {whole}")Paso a paso, en palabras
- Tres notas, cada una en un int: 5, 6, 6.
- Primero los paréntesis: 5 + 6 + 6 = 17. La suma también es un int.
- 17 // 3: ¿cuántos grupos enteros de 3 caben en 17? 5.
- El resto 2 (es decir, 17 % 3) se descarta. El resultado es el número entero 5.
- 5 se guarda en whole. El resultado de // con números enteros es un int, sin .0.
- Se imprime «Parte entera: 5». La parte decimal (5.67) no está en el resultado: para eso está /.
Lo que se corta no se pierde del todo. El operador % da el resto de la división: 17 % 3 es 2, porque 17 = 5 · 3 + 2.
Juntos, los dos dividen una cantidad en partes enteras y un resto. La película dura 135 minutos:
minutes = 135hours = minutes // 60rest = minutes % 60print(f"{hours} h {rest} min")2 h 15 minVas a necesitar % a menudo. Un número es par si n % 2 es 0. La última cifra de un número es n % 10.
Más precisamente, para curiosos
- Con números negativos
//redondea hacia abajo, hacia el número menor:-7 // 2es -4, no -3 como en Java y C#. El resto tiene el signo del divisor.%también funciona con números decimales:
print(-7 // 2)print(-7 % 2)print(7.5 % 2)-411.5- Dividir entre 0 detiene el programa:
ZeroDivisionError: division by zero. En Python esto vale también para los números decimales:5.0 / 0también se detiene.
Pruébalo
Botellas en cajas
En una caja caben 6 botellas. Tienes 17.
¿Qué imprimirá el programa?
bottles = 17per_case = 6print(f"{bottles // per_case} cajas")print(f"{bottles % per_case} de sobra")17 // 6 son 2 cajas enteras (12 botellas), y 17 % 6 es el resto: 5 botellas que no llenan una caja.
La idea
Conversión entre tipos
En Python / ya da un resultado decimal, y la nota media sale bien a la primera. Necesitas una conversión en el otro sentido: de decimal a entero.
total = 5 + 6 + 6average = total / 3print(average)print(f"{average:.2f}")whole = int(9.99)print(whole)5.6666666666666675.679Conviertes un tipo escribiendo el nombre del tipo: int(9.99) crea un int, y float(17) crea 17.0. Esto se llama cast (conversión explícita). int(...) corta la parte decimal: int(9.99) es 9, no 10.
De int a float no se pierde nada, y la conversión se hace sola: 10 + 0.5 es un float, 10.5. Si uno de los lados es un float, // también da un float: 17 // 3.0 es 5.0.
Más precisamente, para curiosos
int("25")de la lección sobre la entrada es la misma función: convierte en número entero tanto un texto como un número decimal.- Cada carácter tiene un código, un número en la tabla de caracteres.
ordda el código, ychrcrea un carácter a partir de un código:
print(ord("A"))print(chr(66))max_int = 2147483647print(max_int + 1)65B2147483648- En Java y C#,
intllega hasta 2 147 483 647, y uno más «da la vuelta» hasta un número negativo. En Pythonintno tiene límite, así que la tercera línea da 2147483648 sin más.
Pruébalo
Encuentra el error
La factura de la luz es de 125 € y se reparte entre tres compañeros de piso. El programa dice que cada uno paga 41,00 €, pero deberían ser 41,67 €. ¿En qué línea está el error?
Elige la línea con el error.
// es la división entera: 125 // 3 es 41, y la parte decimal se corta. Después el formato .2f muestra 41 como 41.00. Para la división decimal se usa /: share = bill / people.La idea
Formas abreviadas: += y -=
A menudo cambias un valor a partir de sí mismo: el saldo de la tarjeta baja con cada compra, un contador sube de uno en uno. Hay una forma corta de escribirlo:
balance = 20purchases = 0balance -= 4.5purchases += 1balance -= 3.5purchases += 1print(f"{purchases} compras, quedan {balance} €")2 compras, quedan 12.0 €| Escribes | Significa |
|---|---|
balance -= 4.5 |
balance = balance - 4.5 |
total += price |
total = total + price |
x *= 2, x /= 2, x //= 2, x %= 2 |
lo mismo con *, /, // y % |
purchases += 1 |
purchases = purchases + 1 |
seats -= 1 |
seats = seats - 1 |
Python no tiene ++ ni --. Un contador sube con += 1.
+= también funciona con texto: message += "!" pega un signo de exclamación al final.
Más precisamente, para curiosos
a++ en Python es SyntaxError: invalid syntax. ++a es más traicionero: no es un error, sino dos signos más delante del número, +(+a). El valor no cambia:
a = 5++aprint(a)5Si vienes de otro lenguaje, ten cuidado: el contador se queda igual, y Python no dice nada.
La idea
math: raíces, potencias, redondeo
Una pizzería vende una pizza de 30 cm al mismo precio que dos pizzas de 20 cm. ¿Qué es más? El área de un círculo es π · r². Para las potencias Python tiene un operador: **. 15 ** 2 es 225. Para π y para la raíz cuadrada hay algo ya hecho en el módulo math: la línea import math al principio lo carga, y después escribes math., el nombre y los números entre paréntesis. Son funciones, trozos de código ya hechos. Escribirás las tuyas en el módulo «Funciones».
import math
big = math.pi * 15 ** 2small = 2 * math.pi * 10 ** 2print(f"Una de 30 cm: {big:.1f} cm²")print(f"Dos de 20 cm: {small:.1f} cm²")print(math.sqrt(144))print(abs(-7.5))Una de 30 cm: 706.9 cm²Dos de 20 cm: 628.3 cm²12.07.5Una pizza grande es más que dos pequeñas.
| Escribes | Qué da |
|---|---|
math.sqrt(x) |
la raíz cuadrada |
x ** n o math.pow(x, n) |
x elevado a n |
abs(x) |
el valor absoluto (sin el signo), sin math. |
round(x) |
redondeo a un número entero, sin math. |
math.pi |
el número π, 3,14159… |
math.sqrt y math.pow devuelven un float, aunque el resultado sea un número entero (por eso ves 12.0). ** con números enteros da un int: 15 ** 2 es 225. Si necesitas un int, conviértelo: int(math.sqrt(144)).
Más precisamente, para curiosos
- Redondear 2,5: los lenguajes dan resultados distintos.
print(round(2.5))print(round(3.5))print(round(5.678, 2))245.68roundredondea «la mitad» hacia el número par: 2,5 pasa a ser 2, y 3,5 pasa a ser 4. Así lo hacen los bancos (de ahí el nombre «redondeo bancario»), y también C#. Con un segundo argumento redondeas a ese número de cifras decimales:round(5.678, 2)es 5,68.
- Los f-strings no siguen la configuración de idioma de la computadora: el punto sigue siendo un punto en todas partes.
Ejercicio
Que calcule el programa
Resuelve las tareas en tu editor. Cada número de la entrada va en una línea aparte.
1. Media de tres números. Lee tres números enteros e imprime su media con dos cifras decimales. Aquí necesitas la división decimal.
566Media: 5.672. Segundos en horas. Lee un número de segundos y divídelo en horas, minutos y segundos. Pista: una hora tiene 3600 segundos, y % da lo que sobra.
37251 h 2 min 5 s3. Volumen de una esfera. Lee el radio e imprime el volumen: V = 4/3 · π · r³. Aquí 4 / 3 es 1,333…, como debe ser. Pero ¿cuánto sería 4 // 3?
10Volumen: 4188.79 cm³4. Celsius a Fahrenheit. F = C · 9 / 5 + 32. Lee la temperatura en grados Celsius.
3737.0 °C = 98.6 °FMás tareas
- Pulgadas a centímetros. Una pulgada son 2,54 cm. Para 12 pulgadas:
30.48 cm. - Área de un rectángulo. Lee el largo y el ancho, e imprime el área (largo · ancho).
- Área de un cuadrado. Lee el lado e imprime el área. Hazlo una vez con
*y otra con**. - Radianes a grados. Grados = radianes · 180 / π. Para 3.14159:
180.00°. - Horas a segundos. Lee un número de horas e imprime cuántos segundos son. Para 2 horas: 7200.
- El código de un carácter. Lee un carácter e imprime su código. Para
A: 65. El primer carácter del texto leído lo obtienes coninput()[0]. Qué significa esto lo verás en la lección sobre el texto.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Tu primer programa · Variables y tipos · Entrada y salida
- Continúa en: Condiciones · Bucles · Listas · Arrays bidimensionales
- Ejercicios sobre el tema: Fundamentos del lenguaje