Introducción a Python.
Material requerido.
Una Raspberry Pi 3, aunque valen la 2 y la 1
|
|
Tranquilidad y un cafecito.
|
¿Porqué Python?
Hemos dedicado ya unas cuantas sesiones a mostrar una pequeña introducción a Raspberry Pi, en las que hemos ido viendo como configurar las opciones básicas imprescindibles, como el teclado en español o la conexión a la red entre otras muchas cosas.
Podríamos pasarnos mucho tiempo hablando de como configurar tal o cual función en Linux y aún no hemos hablado de cosas como el sistema de ficheros, los usuarios, los permisos o las tareas y tenemos pendiente hacer un pequeño resumen del tipo… ¡Todo lo que debería usted saber sobre la línea de comandos! Cosas como las órdenes básicas, sus opciones y la gestión de los ficheros y demás desde el Shell.
Pero como ya dijimos en la introducción, pretender una guía ordenada de acceso a Linux y Raspberry es una tarea imposible que renunciábamos a pretender, nos parece más importante evitar aburrir al respetable, que estoy convencido es el peor pecado que un profesor puede cometer, e ir saltando entre temas más o menos dispersos esperando que las pinceladas que vamos dando vayan ayudando a percibir el paisaje mejor que si nos empeñamos en un imposible esfuerzo de ser exhaustivos.
En ese espíritu ha llegado el momento de empezar a hablar del lenguaje oficial de la Raspberry Pi, Python, Un lenguaje que resulta muy difícil no apreciar porque es una solución brillante a muchos de los defectos habituales de los lenguajes de programación, y que además es ideal para quienes quieren aprender un primer lenguaje, en especial si hablamos de jóvenes.
Empezaremos diciendo que Python es un lenguaje interpretado. Para quienes vengáis de Arduino, ya os parecerá de lo más normal escribir tu programa en C, llamar al compilador con la flechita amarilla, y si no hay problemas, enseguida vemos como el IDE va cargado el programa en la placa.
Esto significa que el compilador lee lo que has escrito en una primera pasada y después compila, es decir traduce a un lenguaje propio del micro de Arduino que es lo que se vuelca y ejecuta la placa que usemos.
No es un mal sistema y es típico de los lenguajes de alto nivel simbólico. Lenguajes que quizás te suenen como Fortran, Pascal, C y muchos otros son compilados, lo que permite que se genere un código ejecutable muy eficiente por lo pequeño y por la velocidad con que se ejecuta, pero que tiene un inconveniente: Necesitas el código fuente que generó el ejecutable para poder entenderlo y modificarlo, ya que el ejecutables es lo que llamamos código máquina, las instrucciones que el ordenador entiende y que a nosotros se nos funde el cerebro cuando intentamos leerlo.
Además el proceso de edición / compilación / linker, exige el manejo de varios programas diferentes que no se presta mucho a usuarios inexpertos y suelen dar lugar a la fama de pirados que los programadores tienen por ahí.
Por eso hace tiempo que se desarrollaron algunos lenguajes que se llaman interpretados, y Basic fue uno de los de mayor éxito en otros tiempos y que quizás incluso alguno hayáis llegado a manejar en la época de los ZX Spectrum de Sinclair o Comodores y otras antiguallas, que hoy causarían sonrisas.
La virtud de los lenguajes interpretados es que no requiere ese proceso de escribir / compilar / volcar. Simplemente escribes la instrucción y listo el ordenador la “interpreta” o sea ejecuta sobre la marcha sin más complicación.
Esto hace que los lenguajes interpretados sean más fáciles de aprender porque nos parecen más naturales, y aunque el programa corre más lento que en los compilados, pero con la potencia actual bien puede merecer la pena pagar este peaje.
Python 2 vs Python 3
Una de las cosas que más alarma provoca a los que se acercan a Python por primera vez es saber que hay en marcha dos versiones simultaneas, la 2 y la 3, y que encima son incompatibles entre sí.
Algunas páginas alertan seriamente del problema de elegir bien a cuál de las dos versiones te vas a orientar y te conminan a hacerlo con el máximo cuidado para evitar los males del infierno.
Bueno, tenemos buenas noticias, en realidad no importa mucho. Es verdad que se mantienen dos líneas diferentes. Básicamente porque algunos cambios importantes que se añadieron y modificaron en la versión 3 hacen incompatibles ambas versiones, pero y aquí esta lo bueno… las diferencias son mínimas.
Para cualquiera que vengáis de nuevos no hay duda posible: Python 3. Es el futuro y poco menos que cualquier libro que busquéis os hablará de la versión 3 porque es todo ventajas respecto a la versión 2.
El inconveniente es que hay librerías a las que les pesan los años que aún se mantienen en Python 2 y si tú eres uno de esas personas que llevas 20 años con Python probablemente despotricarás contra los cambios introducidos. Nada nuevo en esto, la resistencia al cambio forma parte de la naturaleza humana.
Pero si te acercas por primera vez, coge Python 3 y déjate de tonterías, olvida la versión 2. Y si a pesar de todo en algún momento necesitamos usar una librería que solo existe para la versión 2, pues nos pasamos al dos y trabajamos tranquilamente porque las diferencias son mínimas en lo que a sintaxis se refiere y enseguida te acostumbraras.
En esta humilde casa, seguiremos la política de correr todo en Python 3 y cuando necesitemos pasar a Python 2, lo indicaremos con claridad, vereis que no es para tanto.
Mucha gente piensa que esto de las dos líneas es un problema, pero en realidad no lo es y es sencillo conmutar de una a otra versión sin más cuentos.
Arrancando Python en Raspberry Pi
Es bastante fácil, porque vienen instaladas las dos versiones de fábrica, en el menú de programación:
Pero si vamos a arrancar habitualmente Python 3, es más práctico tener un acceso directo en el escritorio. Para ello pulsa el botón derecho del ratón cuando estés encima de Python 3 (O cualquier icono que te interese)
Al hacer click en “Añadir al escritorio” se añadirá el icono a tu desktop:
Puedes arrastrarlo con el ratón y posicionarlo donde quieras. Haz doble click en el icono de Python 3.Se abrirá lo que en Python se llama el IDLE (Sospechosa semejanza con el IDE de Arduino)
Veras algo así, donde se abre la ventana de trabajo de Python 3:
Ya verás como enseguida estarás cómodo en eta ventana pero antes, si te pasa como a mí, que corro la Raspberry en una sesión de VNC puede que veas la letra muy minúscula para trabajar a gusto (Me voy hacienda mayor… dita sea) y por eso si prefieres aumentarla, Puedes hacer:
Puedes elegir el tamaño de letra que mejor se ajuste a tus circunstancias y bastantes otras opciones que por ahora no conviene que enredes demasiado.
Ya podemos empezar a jugar un poco para ir haciendo boca.
Familiarizándonos con el IDLE de Python 3
Lo primero que sorprende a los profesionales que están acostumbrados a lenguajes de programación serios como C, es que el Shell de Python te permite interactuar directamente.
Por ejemplo escribe 4 + 5 y pulsa intro (No hacen falta los espacios):
Los lenguajes interpretados te permiten escribir instrucciones directamente y devuelven los resultados computados. Con esta primera línea ya vemos que Python acepta operaciones con enteros sin haber declarado la variable (Una característica muy típica de los lenguajes interpretados)
¿Y qué pasa con los números en coma flotante? ¿Los va a reconocer igual de fácil? Escribe por ejemplo: 1.7 * 3.2
Parece que no tiene mucho problema siempre y cuando uses el punto como separador de decimales y no la coma más familiar para los latinos. ¿Y si mezclo ambos que pasa?
>>> 3.8 + 7
10.8
>>>
No parece tener mayor problema. Es astuto y reconoce que el resultado es un float y hace la conversión en automático. ¿Podría combinar operaciones y usar paréntesis para garantizar la precedencia de las operaciones?
>>> 2 * (3+5) / 4
4.0
Curioso. Calcula correctamente el resultado, pero esta es una operación entre enteros, ¿Por qué nos devuelve un valor en float? Pues sencillamente porque en cuanto metas una división Python se pone la venda antes de la herida por si acaso.
Naturalmente también disponemos de Stting en Python. Basta con escribirlas entrecomilladas como en C:
>>>“Hola.”
Hola.
Veréis que Python evalúa el resultado y devuelve su valor como norma. Las String son muy evolucionadas en Python y ya iremos hablando de ellas, pero lo quería ver ahora es que Python permite definir variables sobre la marcha, sin necesidad de declararlas:
Prueba a escribir:
>>> x=3 >>> H="Buenos dias" >>>
¿Qué ocurre? ¿Por qué no pasa nada? Sencillamente porque Python ha creado un par de variables llamadas x y H y las ha almacenado en memoria. Ahora podríamos hacer que mostrase el valor de esas variables con la instrucción print:
>>> print(x)
3
Veras que refleja el valor que definimos. Prueba con
>>>print(h)
Recibirás un ladrido instantáneo:
>>> print(h) Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> print(h) NameError: name 'h' is not defined >>>
Python distingue mayúsculas de minúsculas igual que C, así que ojito con este tipo de error, la instrucción correcta es:
>>> print(H)
Buenos días
Y claro podríamos hacer también
>>>print(x,H)
3 Buenos días
Una última curiosidad de Python que no puedo resistirme a mencionar en esta primera sesión, es referente a los enteros y su tamaño. Los lenguajes compilados como C, disponen de unos tipos muy estrictos que además limitan el tamaño de los enteros que podemos manejar.
Por ejemplo en Arduino, el tipo int es de 16 bits y el long de 32 bits permitiendo el mayor número entero sea de 216 y 232 , respectivamente.
¿Y cómo esta Python en este tema? Aquí, el niño ya empieza a dar muestras de que es un tanto particular. Veamos, escribe en el IDLE algo así:
>>>29 * 234
6786
Bueno este era un número pequeño después de todo, pero fíjate que es un entero porque no tiene el .0 al final Vamos a ver hasta dónde llega antes de forzarle a pasar el formato a float. Problemas con otras operaciones.
>>> 29*234 6786 >>> 4569*2356 10764564 >>> 45692987*5654654645 258378061183474615 >>> 541685413654364 * 68514685416841641654 37113405711420485423051157101278056 >>>
Parece que aguanta y aún no sabemos dónde está el límite, paro vamos a pedirle algo especialmente grande como por ejemplo un una potencia insensata. Para elevar a un exponente se usa **
>>>4**16
4294267296
Probemos ahora una potencia medianamente absurda que haría temblar a cualquier calculadora:
>>>123 ** 123
11437436793461719009988029522806627674621807845185022977588797505236950478566689644
66065683652015421696499747277306288423453431965811348959199428208744498372120994766
48958359023796078549041949007807220625356526926729664064846685758382803707100766740
220839267
Y ni siquiera se ha esforzado, Pues vamos a darle caña esta vez:
>>> 123 ** 1234 87681408214164476970365205228763109219898888878881068771208558661744652944973794097 99586337111330480364897482554146742793983952637771005986343147630914376481392492756 26408941199485015804180299865007209983887878133705254311668488745161986533130252392 28397155448068660083441510113309297213377130812540882569036330888360587252320502710 66823891792481925617708554715162845295657562020939641042580252827417342323719878885 03171193871835976393402718270094464798142126364284335089053935025701430507330043413 65267464673083511407846749856768559082044756465557382458441298173247590732260532362 83778126127304479073296457247290602878673576906800290833495062952923849422938877363 15095873462764214519348595110901852016879358201793487450781147604983263530809225458 42429714078866368666174811436292368322013344004655977058760977542054124836643126063 11476369554854577613040721082078089432424169091400987492084112025900022444338131323 24327733231981800412839076916421960839132534411761649731897247293193131919102705235 04758501858336459076757618992839333332511497597480067748947646390153654975397979573 56224666376150947071922970302427419091077744070985101695405349601676095217972180613 59637746660541156172717061892462582651159430672370164903995636354434428467390148502 82195618521120535565188025906868874107944865094967772873343090181992187951403546897 72502153694768097209103168846702073860507645727479650097199966172879830303097285318 97435527995796848448284914443084845265182672182579212416254990524366092546990107274 63618576326919716488239497546381103193111733548334284388280545773071212732103370578 21730206063223419630599200405340168156611222711481269181708558794658310465927192192 35628742231009009593358022129447020051642430398664166494405644288142693132034718556 69910522511335546803534892285510883626302419238150232750213370699115557243071043712 09458378109765728487363399261111614919928741964089604143112193552141232230570609497 16108215672798565211121094864510311192378448391496477880962342402686630465281723077 44046671563379062495488515946010782381404515931631412299705016057392361243778777836 76593704714543924847052582125418711127560165865184852662139768071490951107031240305 57108244266388370203466104356675469532361258660257577952637624368645026722944046920 55020881153207578385898388026761498803446534437001436910282915105450240960086694231 78658879708073368353436652696104976490122637150706104341111705866803716978835761045 86836417143055195889013162593358688824610936141111741122667770647250005995195342208 24847284140314691213633043592112726822825400146132529759565779050658199333210486870 286809
Parece que ni se despeina, tened cuidado. A medida que vayáis haciendo crecer los números porque Python puede con ello mientras le quede memoria RAM, pero tu Raspberry puede quedarse un tanto bloqueada mientras calcula.
El resumen es que Python tiene una precisión ilimitadamente grande en los enteros mientras tenga recursos disponibles, un detalle sorprendente para cualquiera que este acostumbrado a programar en otros lenguajes, y una de las razones por las que Python se ha convertido en lenguaje de facto para la ciencia y especialmente para la investigaciones numéricas.
No puedo por menos que comentar que si por cualquier razón no tienes una Raspberry, pero te interesa Python, no hay problema.
Python está disponible para los 3 sistemas operativos principales, Windows MAC OSX y Linux y podéis descargarlo desde aquí. Una de las ventajas de ser un lenguaje mantenido por la comunicad Open Source es que lo que desarrolles en una plataforma correrá sin modificación en cualquiera de las otras.
Resumen de la sesión