Introducción a Python
Material requerido
Una Raspberry Pi 3, aunque valen la 2 y la 1
|
|
Tranquilidad y un cafecito.
|
Scripting Python
Si estás leyendo esto es que he conseguido picarte la curiosidad por Python, o quizás, mucho más probable, que ya lo conocías y querías empezar a jugar con él. Habías oído hablar de él y alguno de los comentarios había despertado tu curiosidad.
Si es así, se bienvenido porque procuraremos no defraudarte. Y para ello, como somos rolleros por naturaleza, nos parece que para aprender un lenguaje de programación, no basta con aprender las instrucciones y todo eso, sino que es importante, poder entender las ideas que hay tras el mismo.
¿Por qué aparece Python? ¿Qué tiene de malo C o Java? ¿Ya que estamos, porque hay tantos lenguajes de programación? ¿No serviría mejor uno solo?
Bueno la vida es complicada. Que os voy a contar. Lo que es eficaz para ciertas cosas no lo es tanto para otras. Un coche es rápido y eficiente pero no carga lo que un camión. Y una furgoneta es un intermedio pero es un mal coche y un mal camión y…. si quieres llevar gente mejor un autobús.
Con los lenguajes de programación pasa algo parecido. C++ es muy potente y rápido y probablemente es el lenguaje de mayor éxito de la historia, pero tiene una curva de aprendizaje complicada y una sintaxis propia de un torturador ruso. Ademas es relativamente fácil escribir código que parece egipcio antiguo, No hay quien lo entienda.
Java es muy mono y corre en varios miles de millones de máquinas pero su gran virtud, que corre bajo una máquina virtual es su mayor inconveniente para cambiar, y su sintaxis es tan loca como la de C++, de la que deriva.
Podríamos seguir así un rato, pero creo que habéis cogido la idea. Por eso creo que cualquiera que pretenda escribir una introducción a un lenguaje de programación debe empezar por describir porqué alguien se ha tomado la molestia de desarrollar un lenguaje nuevo.
¿Qué problemas pretende resolver que la miríada de otros lenguajes disponibles no resuelve adecuadamente?
Y en este punto da gusto hablar de los objetivos que llevaron a Mr. Guido Van Rossum a inventar un nuevo lenguaje que bautizo como Python en honor de los Monti Python ingleses. Esos objetivos eran.
Y sorprendentemente creo que lo ha conseguido.
Python lleva ya mucho tiempo disponible y se usa en Google, La Nasa, El CERN y muchos otros lugares de prestigio incluyendo todas las universidades de ciencias sensatas. Pero quizás ha llegado a oídos del gran público a raíz de Raspberry Pi.
Uno de las razones fundacionales de la Raspberry Pi es acercar la programación a los colegios, al mejor precio y de la forma más sencilla posible y en ese sentido Python encajaba como un guante.
No os llevéis a engaño. Python no es un lenguaje diseñado para ser fácil comprometiendo su potencia. Muy al contrario la potencia y capacidad de cálculo que muestra suelen sorprender a la gente acostumbrada a otros lenguajes.
Por ultimo en cuanto comentéis a los colegas que estáis aprendiendo Python, algún memo dirá algo así como ¿Python? Baaaaahhh es un lenguaje de scripting y por tanto un asco. Los hombres de verdad programan en lenguajes compilados y lo demás son cosas de nenazas.
Esta es una opinión bastante extendida por pura ignorancia, pero que se olvida de lo fundamental que el ser fácil de aprender no supone ser malo y espero demostrarlo poco a poco.
entorno de trabajo Python
Vamos a cumplir con el ritual habitual de imprimir “Hello World” en la pantalla y así con los deberes cumplidos ya podemos ir avanzado. Arranca el IDLE de Python 3.
En la sesión previa vimos que podemos escribir instrucciones directas en el IDLE pero naturalmente, si queremos repetir la tarea, tendremos que volver a teclear las mismas instrucciones cada vez y eso acaba resultando un asco.
En Python podemos crear un Script o lista de instrucciones, que es la forma oficial como se llaman a los programas aquí, para poder automatizar la ejecución de ordenes.
Sería bastante resbaladizo discutir la diferencia entre programa y Script y no sería yo la persona mas indicada, así que aquí vamos a manejar ambos términos indistintamente, a pesar de las ampollas que esto puede levantar a los puretas.
La idea de un programa es precisamente escribir unas instrucciones que puedan ser repetidas tantas veces como queramos y por eso vamos a arrancar el editor incluido de serie, para que podamos salvar nuestro trabajo luego.
Para ello pincha en File / New File y creamos un fichero en blanco:
En este editor podremos ir escribiendo nuestros programas y salvarlos, pero no se interpretará cada orden como hacíamos desde el IDLE. En su lugar se escribirá como texto que luego podremos ejecutar todo seguido.
Escribe
print (”Hello World”)
Y ahora vamos a pedirle que ejecute este programa con:
Si no le has dado un nombre te pedirá uno antes de ejecutar el programa. Llámale prueba o algo así y veras:
No ganaremos ningún premio por semejante programa, pero la idea es que veas que cuando quieres hacer un programa, lo editas con el editor del IDLE (Aunque puedes usar otros) y después puedes guardarlo, cargarlo y ejecutarlo desde el propio entorno.
Ya que estamos podemos comentar tranquilamente, que este programa podemos ejecutarlo también desde el Shell. Si abres una ventana de comandos, puedo ejecutar mi programa que he llamado uno.py (La extensión te la añade Python) del siguiente modo:
python3 uno.py
Pero siempre es más cómodo jugar en la zona de ventanitas porque nos da otras ventajas. Recordad que Python es un lenguaje de propósito general y ejecutará las instrucciones en el entorno gráfico o en el Shell, e incluso en Windows, Mac o Linux a poco que le dejéis hacerlo.
¿Que es un programa?
Bueno, por si acaso alguien se acerca a estas sesiones sin saber programar en absoluto, me repetiré un poco diciendo que un programa es algo parecido a una receta de cocina. Se van dando instrucciones en secuencia, y se supone que si las sigues fielmente se consigue el resultado previsto.
La diferencia es que una persona, es bastante capaz de rellenar los huecos que haya en las instrucciones (Los humanos son particularmente imprecisos e inexactos en sus descripciones ) y a pesar de todo conseguir que el bacalao a la vizcaína te quede comestible. Pero lamentablemente los ordenadores adolecen de una molesta falta de imaginación, lo que les lleva a fallar miserablemente en cuanto tienen ocasión.
Si transmitir una receta a una persona es bastante complicado, ya que mucha gente entiende lo que quiere por muy precisas que sean las instrucciones, en el caso de dar instrucciones a una maquina es bastante más complicado y exige ser muy cuidadoso a la hora de elegir esas instrucciones.
Programar algo consiste en descomponer el problema general en una secuencia de pequeñas instrucciones que se expresan de forma inequívoca mediante instrucciones al ordenador y que consigue el resultado final pretendido. Al procedimiento abstracto que lleva a la solución general del problema se le llama algoritmo.
La habilidad de programar es como la de conducir un coche. La parte difícil no son las señales de tráfico, como no lo es aprender las instrucciones de un lenguaje. Lo complicado es aprender a romper un problema dado en los trozos precisos que puedan ser transmitidos a un ordenador mediante un programa, o secuencia de instrucciones.
Esa capacidad solo se desarrolla peleando con problemas de programación y para los que ya conocéis otro lenguaje como C++ o similares, buenas noticias, si la desarrollas en un lenguaje de programación es exactamente igual en otro lenguaje, aunque las instrucciones cambien y las herramientas disponibles sean diferentes.
Lo digo, porque los que venís de Arduino y C++ (Y espero que seáis muchos porque llevamos dos años machacándoos) os encontrareis cómodos enseguida con Python, porque la parte mecánica de descomponer un problema en algoritmos la tenéis entrenada y basta con cambiar las instrucciones y la sintaxis, pero el programar es muy parecido.
Para los que seáis nuevos y tengáis la desgracia de encontraros con nosotros en vuestro primer lenguaje…animo. Os va a costar un poco, pero todos hemos empezado en algún momento y no es para tanto.
Requiere tiempo y esfuerzo. A unos más que a otros, pero no hay nadie que no pueda a prender os lo prometo. Y como todo, se aprende a conducir conduciendo, y a programar en Python… pues programando, claro.
Los primeros pasitos
Vamos a empezar introduciendo algunas instrucciones básicas para manejarte y para que puedas ir haciendo los pinitos iniciales. Y lo primero que vamos a ver son las variables.
Una variable es algo parecido a un contenedor o cajón con un nombre. Una cosa es el nombre del cajón y otra su contenido y conviene entender desde ya la diferencia.
Las variables pueden tomar distintos valores e ir cambiandolo en función del programa, de la misma manera que un cajón puede ir variando su contenido sin que se mueva de sitio.
En Python no es necesario definir las variables antes de usarlas, a diferencia de C y similares. Basta con que la declares asignándole un valor. Por ejemplo escribe directamente:
>>> base = 86
>>> iva = base * 0.21
>>> total = base + iva
>>> print (total)
104.06
>>>
Para quienes no hayáis programado nunca os puede parecer bastante normal. Parecen las operaciones que hacemos en una calculadora o en una hoja de cálculo. La diferencia es que Python ha memorizado las variables. Prueba con:
>>> print(base, iva, total)
86 18.06 104.06
Pero probablemente a los que vengáis de C, os sorprenderá que no hemos definido el tipo de las variables como int o float, y sin embargo Python ha aceptado graciosamente la entrada suponiendo nuestras intenciones, y los ha considerado enteros.
Sería más cómodo si pudiéramos pedir a Python que nos solicite un valor y luego calculásemos el IVA y el total. Disponemos de una instrucción para pedirle información al usuario:
base = input ("Dame el precio del artículo, por favor : ")
Python sacará el mensaje que le pasamos entre comillas y esperará a que le demos una respuesta que se la asignara a la variable base. Si ahora escribes
>>> base = input ("Dame el precio del artículo, por favor : ") Dame el precio del artículo, por favor : 99 >>> print(base) 99
Pero tienes que tener cuidado con input porque convierte en String lo que recibe, con resultados un tanto desconcertantes para los novicios. ¿Qué te parece esto?
>>> print (base * 3)
999999
Python considera a base una String y por eso al intentar multiplicar hace algo que para él es muy normal (Y para mi) entiende que multiplicar una String por 3 es copiarla 3 veces, y el resultado es ese.
[one-fourth] [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]
[three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]
- La sobrecarga de operadores que vimos con C++ y Arduino está integrado dese el principio en Python. [/fancy-ul] [/three-fourth]
Es bastante razonable, pero tienes que acostumbrarte porque si no, el intérprete te puede jugar una mala pasada. De hecho intenta esto:
>>>print (base +1) Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> print (base +1) TypeError: Can't convert 'int' object to str implicitly
Base es una String y no acepta la conversión implícita y rechaza la operación.
[one-fourth] [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]
[three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]
- El problema es que Python no está seguro de que conversión implícita queremos. ¿Queremos que el resultado sea un int y entonces el valor seria 99+1 = 100, O por el contrario queremos que sea una String y el resultado es “991”?.
- Y ante la duda, rechaza la operación. [/fancy-ul] [/three-fourth]
Si no me crees prueba esto:
>>> type(base)
<class 'str'>
Ya ves que él insiste en que base es una String y punto. Si quieres convertirlo en un número necesitas la función int():
>>> print (int(base) * 2)
198
Para calcular el IVA podemos hacer:
iva = base * 1.21 Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> iva = base * 1.21 TypeError: can't multiply sequence by non-int of type 'float'
Ya estamos otra vez. 1.21 es un float y no acepta que lo multipliquemos por un int sin más. Los tipos tiene que ser iguales y para eso necesitamos la función float()
>>> iva = float(base) * 0.21
>>> print(iva)
21.0
Los nuevos no os asustéis. He querido apretar un poco de más hoy, para demostrar que aunque no necesitemos definir los tipos, Python no va a pasarnos ni una en cuanto tenga dudas (A diferencia de C++ que haría conversiones implícitas sobre la marcha)
Vale, con todo esto ya estamos listos para escribir un programa en el editor, que nos pida un precio y después calculamos IVA y total a partir del precio base (Debidamente convertido a float o int)
Os propongo que lo intentéis sin mirar la solución que viene a continuación. Recuerda que se aprende pensando, no copiando.
La salida debería ser algo así:
>>> ========== RESTART: C:\Python35-32\dos.py ================ Dame el precio del artículo, por favor : 100 100.0 21.0 121.0 >>>
Aquí os dejo el primer programita:
# programa para calcular el IVA y total base = input ("Dame el precio del artículo, por favor : ") base = float( base) iva = base * 0.21 total = base + iva print (base, iva, total)
De paso a provecho para deciros que si empiezas una línea por el símbolo #, Python considerará toda esa línea como un comentario.
Comentarios finales
Para cerrar esta primera sesión de introducción a Python, me gustaría que comprendáis que Python tiene sus propias manías y sintaxis y que venir de C++ es una gran ventaja, pero no se comporta exactamente igual.
No hemos tenido que definir tipos ni declarar variables excepto para forzar un tipo a float, porque estábamos obligados al ser el IVA un float, pero fijaros que no ha sido necesario finalizar las líneas con un punto y coma “;”. ¡Sorpresa!.
La idea ha sido hacer un primer programa tipo hoja de cálculo completamente secuencial, a la que probablemente todos estéis acostumbrados. Espero que incluso los que os acercáis por primera vez no os hayáis asustado por el pequeño follón de tipos.
Os prometo que a partir de ahora iremos más despacito y controlando los programas, pero me pareció importante cortar de raíz cualquier tentación de creer que Python se comporta igual que C. No hagáis demasiadas suposiciones que puede haber sorpresas.
Vamos a ir avanzando poco y pronto veréis porque Python levanta pasiones.
Resumen de la sesión