bclose

Imports en Python

Mas sobre variables y tipos en Python

Imports en Python

 

 

    • ¿Qué tiene de especial Python?
    • Más sobre variables y tipos.
    • La instrucción import.
    • Fracciones, números complejos y matrices.
 

 

Material requerido.

Vista lateral Una Raspberry Pi 3, aunque valen la 2 y la 1

 

 

Python es ampliable

 

Para quienes ya conocéis C++ o cualquier otro lenguaje de alto nivel, probablemente la sesión anterior sobre variables y tipos no os habrá impresionado especialmente.

Vale. Python tiene enteros y números en coma flotante además de Strings. Nada nuevo. Si, lo de la precisión de enteros casi ilimitada es curioso, pero ¿Eso es todo? En absoluto. Aún no hemos comenzado más que a arañar la superficie.

No quiero dejar pasar la ocasión para deciros que Python es un lenguaje diseñado desde el principio para ser ampliable mediante módulos y librerías externos, y antes de empezar con las instrucciones propiamente dichas y su sintaxis, me parece de lo más interesante seguir insistiendo, con los tipos por una parte, y con las ampliaciones por otra, porque son claves para comprender su potencia.

Y es que, es precisamente esa capacidad de ampliación, la que hace que Python sea tan especial y que en estos momentos, sea el lenguaje principal de la investigación en ciencia y tecnología. Muchas de esas librerías se han ido convirtiendo ene standard y muchas de ellas se han instalado de forma rutinaria en tu Raspberry Pi con Python.

Vamos a dedicar esta sesión a acostumbrarnos a la idea de las ampliaciones de Python, mucho antes de lo que suele ser habitual en los cursos al uso (Raritos que somos) porque es clave para comprender Python y para usar la Raspberry como controlador externo de electrónica o robots.

Y nada mejor para ello que seguir hablando de los tipos de variables disponibles en Python, porque nos servirán de ejemplo de estas posibilidades.

 

Más sobre los tipos de variables

 

Normalmente todos los lenguajes de programación modernos soportan números enteros y en coma flotante, pero si os acordáis de vuestros lejanos (y olvidados) días de colegio o hasta de universidad, recordareis que los tipos de números con los que nos torturaban nuestros amados profesores de matemáticas eran mucho más amplios que eso.

Por ejemplo los números quebrados siempre han sido unos de los favoritos de los estudiantes de primaria, en los que usábamos los números expresados como el cociente de dos enteros y con los que había que operar larga y horriblemente durante horas.

Si hubieses dispuesto de Python en aquellos lejanos días podrías haber hecho algo así:

>>> from fractions import *

Esta orden pide a Python que importe la librería fractions que viene instalada por defecto en tu Raspberry Pi, para que podamos operar con números en forma de fracciones, y hacer cosas como esta:

>>> F1 = Fraction(2,3)
>>> F2 = Fraction(3,4)
>>> print(F1, F2)
2/3 3/4

Ya empezáis a sospechar lo que viene a continuación:

>>> print (F1 + F2)
17/12
>>> print (F1 * F2)
1/2
>>> print (F1 / F2)
8/9

Es decir Python dispone de un tipo Fraction, que podemos usar para operar con los famosos quebrados que tantas alegrías nos dieron en nuestros años mozos, y que por cierto si os fijáis en la multiplicación de quebrados os daréis cuenta de que resuelve por las buenas los divertidos y entrañables problemas de mínimo común denominador con los que tan buenos ratos disfrutamos en primaria.

Siguiendo con los olvidados placeres de las matemáticas, recuerdo con añoranza aquellos días, en que nos explicaban que la raíz cuadrada de un número negativo era un imposible metafísico, ya que cualquier número multiplicado por sí mismo produce siempre un resultado positivo.

Pero los matemáticos, un tipo de gente propicia a amargarnos la vida sin piedad, se empezaron a plantear si podían existir números negativos cuya raíz cuadrada pudiera servir para algo, y se les ocurrió desarrollar una rama de la matemática (Pero a qué persona normal puede ocurrírsele algo así) basada en la raíz cuadrada de -1, a la que en español solemos referirnos como i, y en los países anglosajones como j (Por aquello de dar la nota)

A esa rama de la matemática se la conoce como teoría de los números complejos o imaginarios y por increíble que parezca tiene enormes aplicaciones que van desde la relatividad especial al cálculo de la corriente alterna que llega a tus enchufes de corriente.

Python, como no, soporta los números complejos que suelen representar por pares de números donde la primera  cantidad representa la parte real y la segunda la parte imaginaria, del tipo de (3+2i) y que en Python podemos hacer de la siguiente manera:

>>> n1 = complex(3,2)
>>> n2 = complex (-2,7)
>>> print (n1-n2)
(5-5j)
>>> print(n1+n2)
(1+9j)

La de tiempo que nos hubiéramos ahorrado en secundaria de haber tenido Python a mano, para operar con números complejos, porque ni se arruga ante operaciones como esta:

>>> print (n1 * n2)
(-20+17j)
>>> n3 = complex(11,3)
>>> n = n1 *n2 / n3
>>> print(n)
(-1.3+1.9j)

 

Subiendo el nivel

 

Python es un lenguaje pensado para ser ampliado con lo necesario y hace tiempo que se ha convertido en el pilar de la investigación en numerosos campos de ciencia y tecnología, y además lleva suficiente tiempo en el mercado como para que grupos de todo el mundo hayan ido contribuyendo librerías y módulos fácilmente instalables, que nos ahorran mucho trabajo en cantidad de cosas.

Para aquellos que no os van mucho las matemáticas o física, lo que viene a continuación puede ser considerado ofensivo o hasta obsceno, pero aunque parezca mentira, las universidades están llenas de gente a quienes estos temas les quitan trabajo (Y que por razones difíciles de comprender, acaben leyendo este humilde introducción)

Pero vamos a subir un poquito el nivel y sobre todo la exigencia, hablando de temas un poco más allá de la educación básica en los que Python brilla.

Por ejemplo, tenemos disponible la librería math que nos proporciona acceso a todas las funciones matemáticas que se os ocurran (Y muchas más) que normalmente Python no carga, por aquello de ahorrar memoria, pero que tenemos a tiro con unas pocas instrucciones:

import math

Lo que nos pone a tiro funciones imprescindibles para universitarios, como logaritmos (Decimales y Neperianos) trigonometría, directa e inversa y hasta funciones hiperbólicas (No sigo para no asustar), pero por ejemplo y como muestra incluye factoriales de números enteros:

El factorial de un numero consiste en multiplicarlo por la serie descendente de todos los números enteros que le preceden hasta el 1, así por ejemplo el factorial de 4 consiste en 4 * 3 * 2 * 1

>>> math.factorial(4)
24
>>> math.factorial(8)
40320
>>> math.factorial(432)
4272460196051823417128660566122021110719856138835742526125934398602478
1439640586805675777105935927062626067872569110249240179201732469759216
9701315159782368786436213705791294421512530975201857469036430205024104
0960592174135207191462273562405327834518631072582903256359153094434681
9885646818787176786626699745359217577851441041532491496154365676053909
7274894799856908839306539816054610310734781679778037776054775460468453
3484541447972393045238089549799894663120694773671448962299306634448510
8714265346947734645131779682293481411378766919295761947887231458236443
2969035974597378321921955933935933355838644302804204675326233340736576
3138295576434435807073249907655663436959947637984880455801975135852139
0859247168010109667035879462453613853230268353461574295455471133267639
1885711043268247322512270060378678748124390266719528868007908823579697
4534656000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000
 
  • Fíjate aquí que ya vamos viendo el familiar modo de llamar a funciones de una librería u objeto, que nos recuerda al C++ que aprendimos en Arduino.
  • Se usa el nombre del objeto, luego un punto y después el nombre del método o función correspondiente. En ambos lenguajes resulta muy similar.  

Podéis multiplicar a mano si no me creéis. No quiero ponerme pesado poniendo ejemplos varios pero creo que con esto os haréis una idea básica de las capacidades de Python.

Además, existen muchos problemas en ingenierías que requieren cálculos aún más duros como matrices y similares y para eso hay una librería que es la reina del cálculo en Python y que se llama NumPy.

Desarrollada y contribuida por la comunidad, es el sueño de cualquier ingeniero o calculista y la más horrible de las pesadillas de los estudiantes de letras, que recuerdan con terror las clases en las que te hablaban de los logaritmos y cositas así.

Para los que sois de ciencias, (Me imagino que los de letras ya huyeron despavoridos hace un par de páginas) probad con lo siguiente:

import numpy

Eso os importara la libería de cálculo numérico en Python y la dejara lista para su uso.

 
  • Tu Raspberry Pi, trae incluida de serie NumPy y la puedes importar sin más. Pero si estas intentando hacer esto en un PC con Windows, por ejemplo, tendrás que descargar e instalarla a mano, porque no viene por defecto 

Sin entrar en detalles, porque ni es el momento, ni lo que pretendemos hoy, podemos decir que NumPy incluye cálculo de matrices, a las que considera un nuevo tipo, y podemos definirlas de forma directa. Por ejemplo:

>>> a = numpy.array(([1,2,3],[4,5,6],[7,8,9]))
>>> print (a)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> print (a *3)
[[ 3  6  9]
[12 15 18]
[21 24 27]]
>>> print (a * a)
[[ 1  4  9]
[16 25 36]
[49 64 81]]

NumPy incluye cálculo matricial en N dimensiones sin problemas y efectúa tranquilamente las operaciones que necesitéis.

Para quienes no hayan sufrido las torturas del cálculo matricial, lo de arriba no os impresionara demasiado, pero para quienes hemos tenido que padecerlas, no podemos por menos que pensar en donde estaba Python cuando estudiamos.

 

Consideraciones finales

 

Bueno no quiero ponerme pesado con este tema (A buenas horas), pero no podía por menos que insistir en que hace tiempo que Python es el lenguaje de la ciencia y de la ingeniería, porque dispone de unas posibilidades y capacidades muy por encima de lo que suele ser habitual en los lenguajes de programación.

Su manejo de tipos incluye además de enteros y floating, los números complejos, fracciones, matrices y bastantes más tipos de los que iremos hablando, pero los que adelantamos como listas, tuples y diccionarios, que le dan una potencia sorprendente, y lo que es más una aproximación sencilla a todos ellos.

En las próximas sesiones iremos viendo la sintaxis básica y las instrucciones habituales, pero el manejo de los tipos es básico en todo este concepto y Python dispone de los tipos más sofisticados que he visto hasta la fecha, precisamente porque dispone de una aproximación modular a los problemas.

Esta aproximación modular, permite que asociaciones y empresas desarrollen módulos adicionales que se pueden integrar en el lenguaje como simples extensiones y pronto veremos que los hay por docenas y de todos los tipos imaginables.

Estos módulos externos que podemos descargar e importar a nuestros programas reciben en Python el nombre de packages (Todo el mundo tiene sus manías).

Iremos viendo que existen packages  que podemos importar,  más o menos estándar para lo que se te ocurra, como por ejemplo, gráficos, servidores web o de email, calculo numérico, desarrollo científico y un sin número de otras aplicaciones y aun más importante que crecen día a día.

Por si queréis echar una ojeada podéis revisar por encima la guía oficial de paquetes a importar en Python en la pagina PyPi, the Python package Index:  donde encontrareis no todo, sino los packages mas típicos.

Podéis empezar a comprender porque el cambio de Python 2 a Python 3 fue un drama para mucha gente, ya que había montones de packages que la nueva sintaxis, invalidó y por eso muchos programadores prefirieron mantener la versión sin dar el salto.

Antes o después, nos encontraremos con alguna y pasaremos a Python 2 si hace falta que la diferencia tampoco es para tanto, pero entre tanto aprovecharemos las ventajas de la versión 3.

Y ya que estamos, pronto hablaremos de uno de estos packages que nos permiten manejar los pines GPIO de la Raspberry, que es lo que nos interesa a la mayoría.

 

Resumen de la sesión

 

 

    • Hemos visto como usar import para añadir packages que aumentan la disponibilidad de tipos y funciones.
    • Vimos que tenemos disponibles tipos que no son frecuentes en los lenguajes de programacion estandard.
    • Usamos algunos ejemplosde todo esto como fracciones o complejos.