Ir al contenido
wannacode

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.5
croissant = 1.5
total = 3 * coffee + 2 * croissant
change = 20 - total
print(f"Total: {total} €")
print(f"Cambio: {change} €")
Salida
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 - 3 es 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 = 3
fee = 5
print("Total: " + tickets * 8 + fee)
Respuesta

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 = 135
hours = minutes / 60
print(f"{hours} h")
Salida
2.25 h

En 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 = 5
physics = 6
english = 6
whole = (math + physics + english) // 3
print(f"Parte entera: {whole}")
Paso a paso, en palabras
  1. Tres notas, cada una en un int: 5, 6, 6.
  2. Primero los paréntesis: 5 + 6 + 6 = 17. La suma también es un int.
  3. 17 // 3: ¿cuántos grupos enteros de 3 caben en 17? 5.
  4. El resto 2 (es decir, 17 % 3) se descarta. El resultado es el número entero 5.
  5. 5 se guarda en whole. El resultado de // con números enteros es un int, sin .0.
  6. 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 = 135
hours = minutes // 60
rest = minutes % 60
print(f"{hours} h {rest} min")
Salida
2 h 15 min

Vas 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 // 2 es -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)
Salida
-4
1
1.5
  • Dividir entre 0 detiene el programa: ZeroDivisionError: division by zero. En Python esto vale también para los números decimales: 5.0 / 0 también se detiene.

Pruébalo

Botellas en cajas

En una caja caben 6 botellas. Tienes 17.

¿Qué imprimirá el programa?

bottles = 17
per_case = 6
print(f"{bottles // per_case} cajas")
print(f"{bottles % per_case} de sobra")
Respuesta

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 + 6
average = total / 3
print(average)
print(f"{average:.2f}")
whole = int(9.99)
print(whole)
Salida
5.666666666666667
5.67
9

Conviertes 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. ord da el código, y chr crea un carácter a partir de un código:
print(ord("A"))
print(chr(66))
max_int = 2147483647
print(max_int + 1)
Salida
65
B
2147483648
  • En Java y C#, int llega hasta 2 147 483 647, y uno más «da la vuelta» hasta un número negativo. En Python int no 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.

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 = 20
purchases = 0
balance -= 4.5
purchases += 1
balance -= 3.5
purchases += 1
print(f"{purchases} compras, quedan {balance} €")
Salida
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
++a
print(a)
Salida
5

Si 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 ** 2
small = 2 * math.pi * 10 ** 2
print(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))
Salida
Una de 30 cm: 706.9 cm²
Dos de 20 cm: 628.3 cm²
12.0
7.5

Una 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))
Salida
2
4
5.68
  • round redondea «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.

Entrada
5
6
6
Salida
Media: 5.67

2. 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.

Entrada
3725
Salida
1 h 2 min 5 s

3. 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?

Entrada
10
Salida
Volumen: 4188.79 cm³

4. Celsius a Fahrenheit. F = C · 9 / 5 + 32. Lee la temperatura en grados Celsius.

Entrada
37
Salida
37.0 °C = 98.6 °F

Má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 con input()[0]. Qué significa esto lo verás en la lección sobre el texto.

Test

Ponte a prueba

1. ¿Cuánto es 17 // 5?
2. ¿Cuánto es 17 % 5?
3. ¿Cuánto es 17 / 5 en Python?
4. ¿Qué da int(9.99)?
5. ¿Qué hace print("Suma: " + 2 + 3)?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·