Matemáticas con los módulos math, operators y cmath - Python avanzado - Capítulo 8


En este capitulo vamos a hacer unos cuantos cálculos con los modulos math, cmath y operators.

Observa estas sencillas operaciones:

Código

def operaciones1():
    a, b, c, d, e, f, g = 5, 10, 15, 20, 25, 30, 35
    a = a + 10
    b = b - 10
    c = c * 10
    d = d / 10
    e = e // 10
    f = f % 10
    g = g ** 10
    print(a,b,c,d,e,f,g)

operaciones1()

A las variables anteriores, las podemos declarar de otra forma más corta:

Código

def operaciones2():
    a, b, c, d, e, f, g = 5, 10, 15, 20, 25, 30, 35
    a += 10
    b -= 10
    c *= 10
    d /= 10
    e //= 10
    f %= 10
    g **= 10
    print(a,b,c,d,e,f,g)

operaciones2()

Resultado

En ambos casos, la llamada a las funciones devuelve lo mismo:

15 0 150 2.0 2 0 2758547353515625
15 0 150 2.0 2 0 2758547353515625

Adicción (suma)

Veamos algunas formas de adición.
Dadas estas dos variables numéricas, las podemos sumar así sin problemas:

Código

a, b = 10, 15
c = a + b

print(c)

Resultado

25

No obstante, podemos hacer este pequeño cálculo de forma más optima:

Código

a, b = 10, 15
a += b

print(a)

Resultado

Sencillamente, lo que hace esto es que la variable "a" añade el valor de "b" a su propio valor, de esa forma, no necesitamos una tercera variable para almacenar el valor si no la necesitamos.

25

El módulo operator

Ya que estamos con las sumas, te muestro como puedes sumar de otra forma con el módulo operator.

Código

import operator

a, b = 10, 15

print(operator.add(a, b))

Resultado

25

Hay más formas de hacer esto, por ejemplo, así:

Código

import operator

a, b = 10, 15

a = operator.iadd(a,b)

print(a)

Utilizando operator.add es el equivalente a realizar la operación como a = a + b y con operator.iadd equivalente a a += b.

Resultado

25

Para la sustracción o resta lo podemos hacer de las mismas formas que la suma, evidentemente cambiando el operador "+" por el operador "-". Para add e iadd, lo sustituimos por sub e isub.

Código

import operator

a, b = 10, 15

print(operator.sub(a, b))

Resultado

-5

Código

import operator

a, b = 10, 15

print(operator.isub(a, b))

Resultado

-5

En la multiplicación utilizaremos para lo mismo mul e imul

Código

import operator

a, b = 10, 15

print(operator.mul(a, b))

Resultado

150

Código

import operator

a, b = 10, 15

print(operator.imul(a, b))

Resultado

150

Con la división podemos hacer lo mismo con truediv e i truediv

Código

import operator

a, b = 10, 15

print(operator.truediv(a, b))

Resultado

0.6666666666666666

Código

import operator

a, b = 10, 15

print(operator.itruediv(a, b))

Resultado

0.6666666666666666

Forzar el tipo de dato

Si dividimos dos números integer pueden ocasionar como en este caso, un float.
Si quieres evitar que el resultado te devuelva un float y en lugar de ello, nos devuelva un integer, puedes utilizar la doble barra:

Código

a, b = 100, 30

c = a/b

print(type(c),c)

c= a//b

print(type(c),c)

Resultado

class 'float' 3.3333333333333335
class 'int' 3

Cálculo de divisiones y restos

Seguramente ya sabes que para obtener el resto de una división debes utilizar el operador módulo. Sin embargo, te voy a enseñar a obtenerlo con el módulo operator.

Código

import operator
print(operator.mod(10, 3))

Resultado

1

Podemos hacer uso de divmod, que es muy útil a la hora de sacar el cociente y el resto de una sola vez con muy poco código.

Código

a = cociente, resto = divmod(10, 3)
print(a)

Resultado

(3, 1)

Exponenciación

Podemos calcular exponentes con el símbolo de doble multiplicación:

Código

a, b = 2, 10

print(a ** b)

Resultado

(3, 1)

El propio lenguaje de Python trae la función pow() sin importar ningún módulo y conseguimos el mismo resultado.

Código

a, b = 2, 10
c = pow(a, b)

print(c)

Resultado

1024

pow() devuelve un tipo int. Puedes hacer esto mismo con el módulo math utilizando su función pow() y devolver un float en lugar de un int.

Código

import math

a, b = 2, 10
c = math.pow(a, b)

print(type(c), c)

Resultado

class 'float' 1024.0

Código

import operator

a, b = 2, 10
c = operator.pow(a, b)

print(type(c), c)

Resultado

class 'int' 1024

No obstante, con la transformación de datos puedes copnvertir la salida en el tipo de dato que necesites, sea cual sea la versión que utilices de la función pow().

Tanto math.pow() y operator.pow, solo admiten dos argumentos, valor numérico 1 y valor numérico 2, en este caso a y b. Si intentas poner un tercero te va a dar error.

Sin embargo, la función pow() propia de Python tiene la posibilidad de utilizar un tercer argumento opcional.

Código

a, b, d = 2, 10, 20
c = pow(a, b, d)

print(type(c), c)

Resultado

¿Qué hace este argumento opcional?
Lo que hace, es utilizar el operador módulo, que por si no lo recuerdas, se encarga de ofrecer el resto de una división entre dos números. En este caso 1024 dividido entre 20 nos da cómo resultado de la división 51,20 y de resto 4, qué es lo que está devolviendo en la consola.

class 'int' 4

Por si no te queda del todo claro, lo que está ocurriendo aquí de fondo es esto:

Código

a, b, d = 2, 10, 20
c = (a ** b % d)

print(type(c), c)

Podemos calcular potencias con el método exp() mediante la constante E que equivale aproximadamente a 2.71828.
Si le introducimos por ejemplo un 1, el resultado es el que se usa para calcular la potencia de E, es decir, E elevado a otro número. En este caso en la variable a, 1.

Código

import math

a = 1
b = math.exp(a)
print(b)

a = 5
b = math.exp(a)
print(b)

Resultado

2.718281828459045
148.4131591025766

¿Por qué estos números?
Cuando a vale 1, vale 2.718281828459045, entonces, cuando vale 5 es lo mismo que multiplicar 2.718281828459045 * 2.718281828459045 * 2.718281828459045 * 2.718281828459045 * 2.718281828459045 = 148.4131591025766

Por si aún no te queda claro, hagamos esto mismo sin utilizar el método exp() para que veas lo que hace.

Código

E = 2.71828
a = 5
b = E ** a
print(b)

Raíces cuadradas

Podemos obtener la raíz cuadrada de un número con sqrt.

Código

import math

a = math.sqrt(10)

print(type(a))

Esto devuelve siempre un tipo de dato float, a no ser claro, que lo transformes en int para truncar los decimales. Si queremos trabajar con datos complex, podemos importar el modulo cmath y utilizar su propio sqrt.

Código

import cmath

a = cmath.sqrt(10)

print(type(a))

Resultado

class complex

Podemos hacer otros muchos cálculos más, hay muchas cosas con el módulo math, por desgracia, no se puede hacer todo en un capítulo que ya se ha alargado mucho. No obstante seguiré haciendo más capítulos con cosas del módulo math más adelante.


Suscríbete a mi canal de YouTube para apoyarme

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.