28. Un paseo con Python

Cuando se ejecuta el intérprete de Python sin indicar un programa, Python funciona de forma interactiva. Cada vez que se escribe una expresión Python escribe automáticamente su resultado. Por tanto Python puede usarse como simple calculadora interactiva.

50 - 5*6
20

Si pruebas este mismo fragmento en un módulo de IDLE no imprimirá nada, porque IDLE utiliza el intérprete de Python de forma no interactiva. Se edita el programa completo en la ventana del módulo y una vez completado se ejecuta. En este modo de funcionamiento aunque realiza los mismos cálculos no imprime el resultado de las expresiones a menos que se pida explícitamente.

Si quieres imprimir el resultado de la expresión anterior debes usar la función print (imprime). Esto también funciona en modo interactivo.

print(50 - 5*6)
20

Funciona como una calculadora algebraica normal, con los operadores aritméticos habituales, incluyendo paréntesis.

(50 - 5*6)/4
5

El doble asterisco es el operador de exponenciación. Los decimales se indican con un punto.

(2**16 + 2**8 + 2**4) / 1000.0
65.808

Python diferencia entre la división / que produce un número real y la división entera // que produce solo la parte entera de la división.

(2**16 + 2**8 + 2**4) // 1000
65

Las expresiones tienen un tipo asociado. Enteros, numeros reales o cadenas de texto son ejemplos de tipos. El resultado de la división es un real, y el resultado de la división entera es un entero.

De modo interactivo el último resultado se almacena en una variable con nombre _ que viene muy bien para ahorrar tiempo.

iva = 0.21
precio = 100.5
precio * iva
21.105
precio + _
121.605
round(_,2)
121.61

28.1. Álgebra matricial

Python puede usarse para cálculo vectorial y matricial de forma muy parecida a MATLAB utilizando la biblioteca NumPy.

from numpy import *

Se trabaja con vectores y matrices como si se tratara de números. Por ejemplo, la suma del cuadrado y el cubo de los primeros 20 números enteros positivos.

a = arange(20)
a**2 + a**3
array([   0,    2,   12,   36,   80,  150,  252,  392,  576,  810, 1100,
       1452, 1872, 2366, 2940, 3600, 4352, 5202, 6156, 7220])

Resolver la ecuación \(Ax = b\).

A = array([[1, 2, 1],
           [1, 0, 1],
           [2, 0, 1]])
b = array([[1],
           [3],
           [4]])
linalg.solve(A,b)
array([[ 1.],
       [-1.],
       [ 2.]])
N = 20
t = linspace(-2*pi, 2*pi, N)
seno = sin(sin(t))
ruido = random.normal(0, .1, N)
seno+ruido
array([-0.12492006,  0.67232257,  0.87420753,  0.71643189,  0.55123972,
       -0.29835434, -0.72767628, -0.89018729, -0.80328646, -0.33994442,
        0.22051145,  0.69409006,  0.80901399,  0.53790948,  0.27495212,
       -0.62804698, -0.9349357 , -0.70521792, -0.69355704, -0.10856833])
%matplotlib inline
from matplotlib.pyplot import *
plot(t, seno, 'k--', t, seno+ruido, 'ro')
show()
Paseo_files/Paseo_23_0.png

28.2. Cálculo simbólico

También existe una biblioteca sympy para hacer cálculo simbólico, similar a lo que puedes realizar con Mathematica.

from sympy import *
init_printing()
x,y,z = symbols('x y z')
integrate(sin(x)+log(y/z)+cos(x*y), x)
\[\begin{split}x \log{\left (\frac{y}{z} \right )} + \begin{cases} x & \text{for}\: y = 0 \\\frac{1}{y} \sin{\left (x y \right )} & \text{otherwise} \end{cases} - \cos{\left (x \right )}\end{split}\]
solve(x**2*y - 5*z, x)
\[\left [ - \sqrt{5} \sqrt{\frac{z}{y}}, \quad \sqrt{5} \sqrt{\frac{z}{y}}\right ]\]

28.3. Gráficos

Con la biblioteca matplotlib se pueden hacer gráficas muy decentes con suma facilidad. La interfaz se parece bastante a las gráficas de MATLAB.

%matplotlib inline
from numpy import *
from matplotlib.pyplot import *
def f(t):
    return exp(-t) * cos(2*pi*t)

t1 = arange(0.0, 5.0, 0.1)
t2 = arange(0.0, 5.0, 0.02)

figure(1)

subplot(211)
plot(t1, f(t1), 'bo', t2, f(t2), 'k')

subplot(212)
plot(t2, np.cos(2*np.pi*t2), 'r--')

show()
Paseo_files/Paseo_31_0.png
Next Section - 29. Permutaciones de n elementos