0.1 Instalación de Thonny y Python


En este curso, vamos a trabajar con la versión de Python 3.6.6. En particular vamos a usar el entorno de desarrollo Thonny. Thonny es un entorno de desarrollo integrado pensado para principiantes. Entre sus ventajas se cuentan que es muy simple de usar, su interfaz es muy sencilla para evitar complicar las cosas. Además, se instala junto con el Python en un sólo paso, lo que lo hace muy sencillo.

Instalación:

1) Ir al sitio https://thonny.org/
2) En la caja de arriba a la izquierda ("Download version 3.1.2 for Windows - Mac - Linux"), cliquear sobre el Sistema Operativo deseado y ejecutar el archivo descargado.

Listo, el Thonny ya está listo para ejecutarse, desde el Menú principal de Windows, o desde el acceso directo si se eligió agregarlo.

 
Tutorial: Instalación de Thonny y Python.


0.2 Escribir programas en Python

Ahora vamos a ver cómo podemos escribir programas sencillos como los vistos en clase en Python, más específicamente en el Entorno de Desarrollo Integrado Thonny. En otros entornos puede ser un poco distinto, pero lo esencial es similar en todos.

Al abrir el Thonny, tenemos la siguente ventana:







La parte central (la que dice <untitled>) es donde escribiremos nuestros programas. En la parte inferior (shell) también podemos escribir instrucciones simples. Esta es el área donde el programa se comunicará con nosotros: podremos ingresar los datos y recibir los resultados a través de esa ventana.

En la parte central entonces, tipeamos las siguientes tres líneas, que serán nuestro primer programa:




No nos debemos preocupar por los diferentes colores que toma cada expresión a medida que la escribimos, esos colores varían según qué representa cada expresión en el programa. Ya iremos viendo qué significa cada color, lo que será de gran ayuda al programar.
Sí debemos tener la precaución de respetar la indentación, ya que es lo que le indica al python la estructura de nuestro programa.
En este ejemplo, la primera línea no tiene indentación y define una función llamada programa1() , mientras que la tercera línea (también sin indentación) indica dónde termina la función (nuestro programa). Entre estas dos líneas están, indentadas hacia la derecha, todas las instrucciones del programa. En nuestro caso hay una sola instrucción: print("¡Hola mundo!¨) Esta instrucción lo que hace es mostrar un mensaje en la pantalla.
Las instrucciones que se ejecutan al correr el programa son las que están contra el margen.

En este caso, la primera instrucción es la definición de la función programa1().
La segunda instrucción, es la tercera línea:

programa1()

y es la que le indica al Python que ejecute la función programa1(), creada en la instrucción anterior.


Para ejecutar el programa, hay varias formas, todas equivalentes:
 - Elegir el menú "Run" y dentro del mismo la opción "Run current script"
 - Presionar la tecla F5
 - Cliquear el botón verde con un triángulo blanco de la ventana.

Con cualquiera de las alternativas, el python nos pedirá que guardemos el programa en un archivo, antes de poder ejecutarlo.


Elegimos la carpeta y el nombre que le daremos al archivo. Ese archivo es el que guarda el código fuente del programa y es el que abriremos cada vez que querramos modificar el programa. Por default, el Python le agrega la extensión .py al archivo.





Una vez guardado el archivo con el código fuente, el Python lo compila, lo convierte en un archivo ejecutable, y ejecuta dicho archivo. El resultado lo muestra en la ventana inferior (shell). En este caso, un simpático saludo al universo.

Si queremos volver a ejecutar el programa, sólo tenemos que tipear nuevamente su nombre en el shell:






En este caso, como no hemos modificado el programa, no hace falta volverlo a compilar, sino que se ejecuta el programa ya compilado.









1.1 Instrucciones secuenciales básicas

Veamos el siguiente ejemplo:





# programa2: Calcular el área de un trángulo
def programa2():
    a = int(input("Ingrese la base del triángulo: "))
    b = int(input("Ingrese la altura del triángulo: "))
    c = a * b / 2
    print(" La superficie del triángulo es " , c)
programa2()



Este programa permite al usuario ingresar dos valores correspondientes a la base y la altura de un triángulo, y calcula y muestra la superficie de dicho triángulo.
Veamos las instrucciones del mismo una a una:

Como ya dijimos, el programa comienza en la definición del mismo:

def programa2():

y termina en la línea

programa2()
 

Todo lo que está entre estas dos líneas, serán las instrucciones de nuestro programa. En este caso, hemos definido que se llamará programa2

En este ejemplo, hay una línea más antes de la definición del programa:

# programa2: Calcular el área de un trángulo

Esta línea no hace nada, de hecho se puede eliminar del programa, y el resultado de ejecutar el mismo. De hecho, el compilador la ignora al ejecutar el programa. ¿para qué sirve, entonces?
Esta línea no está para el compilador, sino para los programadores que lean el código. Es un comentario, y su objetivo es colocar aclaraciones dentro del código del programa, que puedan ser útiles a quien lea el programa. Este ejemplo es sencillo y fácil de entender al leerlo, pero en programas más extensos, puede ser complicado entender lo que hacen leyendo el código. En esos casos nunca está de más colocar comentarios aclarando qué hace el programa o alguna parte del mismo.
Para colocar un comentario, sólo hay que colocar el símbolo de numeral (#) al principio de la línea. Todo lo que esté en una línea que empieza con # será interpretado por el compilador como un comentario e ingnorado al momento de ejecutar el programa. También podemos ver que las líneas de comentarios se ven de un color distinto (en este caso, gris más claro)

 Veamos ahora la primera instrucción del programa:


a = int(input("Ingrese la base del triángulo: "))


 Esta instrucción realiza en realidad varias cosas. En primer lugar, define una variable, que se llamará a.


a =


Una variable es una porción de memoria que contiene un dato y es identificada con un nombre. El programador no sabe en qué posición de la memoria se guardará dicho dato, de hecho puede guardarse en una posición diferente cada vez que corre el programa. Para acceder a leer o modificar dicho dato, se usará siempre su nombre (en nuestro ejemplo, a).
Lo que está a la derecha del signo = es lo que se guardará en dicha variable. Es necesario aclarar que este signo no representa una igualdad, sino una asignación: Primero se resuelve el valor de lo que está a la derecha del signo, y luego se guarda dicho resultado en la variable que está a la izquierda. 

Lo que está a la derecha del signo de asignación,



int(input("Ingrese la base del triángulo: "))


 está indicando una entrada de datos al programa. Como no se especifica otra cosa, se supone que es el ingreso de datos estándar, el teclado.
La instrucción input, funciona de la siguiente manera:
- Muestra en pantalla un cartel con lo que está entre comillas:  Ingrese la base del triángulo:
- Queda el cursor parpadeando, a la espera de que el usuario teclee un dato.


Al teclear el valor, la instrucción verifica que el dato ingresado sea un valor numérico entero ( int  ) Si no es así, el programa dará un error.
Si el valor ingresado es un entero, es el resultado de la instrucción input, y es lo que la instrucción de asignación guarda en la variable a.

La siguiente instrucción,

b = int(input("Ingrese la altura del triángulo: ")) 

 realiza lo mismo, con la única diferencia de que el resultado ingresado por teclado se guardará en la variable b, en vez de a.


La tercera instrucción,

    c = a * b / 2

es otra asignación. La secuencia de operaciones es la misma: Primero se resuelve la operación que está a la derecha del signo de asignación = , y luego se guarda el resultado en la variable que está a la izquierda.
Para resolver una operación que contiene variables, como a * b / 2, el compilador primero verifica que dichas variables existan y tengan un valor asignado. Si no es así, dará un mensaje de error. Como en este ejemplo, las variables fueron definidas y tienen los valores que el usuario ingresó en las instrucciones anteriores, el programa reemplazará las variables por dichos valores en la ecuación y la resuelve, siguiendo el orden de precedencia matemática. El resultado de la operación se guardará en la variable c, que se define en esta misma instrucción.

La última instrucción es

print(" La superficie del triángulo es " , c)


La instrucción print es la instrucción para salida de datos. Al igual que la instrucción input, si no se especifica otra salida, se utilizará la salida estándar, que es la pantalla.
En este caso, se envían a pantalla dos elementos, separados por una coma. El primero está entre comillas, por lo que se copiará textualmente en pantalla. El segundo no está entre comillas y es una letra, por lo que se supone que es una variable (c). Como efectivamente existe una variable llamada c, el programa consulta su valor y será dicho valor lo que se muestre por pantalla.


 Y así finaliza este programa. Una vez terminado, todas las variables son eliminadas y la memoria ocupada se devuelve al Sistema Oerativo para estar disponible a quien la solicite.

RESUMEN

En esta entrada vimos el concepto de variables.
También, tres instrucciones:
- Instrucción de asignación (=)
- Instrucción de entrada de datos (input)
- Instrucción de salida de datos (print)

Estas tres instrucciones se ejecutan una tras otra en el orden en que están escritas en el programa sin excepciones, es por ello que se denominan instrucciones secuenciales.

Es muy importante tener en claro estos conceptos antes de pasar a la siguiente entrada.

1.3 Variables


Variables

Una variable es un espacio en la memoria que se reserva para contener un dato de un tipo específico y se identifica con un nombre. El valor del dato contenido se puede modificar a lo largo del programa, de ahí el nombre de variable.

Tipos de datos

Los datos contenidos en las variables pueden ser de diferentes tipos:

int: Contienen datos numéricos enteros. Como mínimo los valores pueden ir de -32767 a  +32767 (cuando ocupa 2 bytes), aunque generalmente puede almacenar valores entre -2.147.483.648 y +2.147.483.647  (4 bytes)

float: Contiene datos numéricos "reales". Estrictamente hablando, no son valores reales, ya que éstos pueden tener infinitas cifras decimales, y la capacidad de almacenamiento de la memoria es limitada. Se almacenan como valores de punto flotante, separando la mantisa y el exponente.

complex: Se utiliza para almacenar números complejos (que tienen parte real y parte imaginaria). Ambas partes  se almacenan como valores de punto flotante, separando la mantisa y el exponente de cada una.

Es conveniente utilizar variables de tipo entero siempre que sea posible, ya que las float y las complex tienen dos inconvenientes: por un lado, las operaciones matemáticas sobre estas variables son más lentas, y por otro, tienen un cierto margen de error por problemas de redondeo.

double: También contienen valores reales, con el doble de precisión que los float. Obviamente, ocupan el doble de espacio de memoria.

str: Contienen texto. Una variable str pueden contener letras, números ó cualquier otro caracter especial. Al asignarles un valor, siempre se debe escribir entre comillas.

Hay otros tipos, pero estos serán más que suficientes para el presente curso.

Nombres de variables

En los ejemplos variables, utilizamos como nombres de variables "a", "b" y "c". En un programa más largo o complicado, es conveniente utilizar nombres más descriptivos, tales como "saldo" ó "suma".
Los nombres de variables deben cumplir ciertas reglas:

- Pueden contener cualquier combinación de letras y números, aunque el primer caracter debe ser una letra. "suma1" es un nombre válido de variable; pero "1suma" no es un nombre válido, ya que empieza con un número.

- Se debe tener en cuenta que el lenguaje distingue entre mayúsculas y minúsculas. "suma", "Suma" y "SUMA" son tres variables distintas. Para evitar confusiones de este tipo, se recomienda utilizar sólo minúsculas para los nombres de variables.

1.4 Operadores aritméticos



Los operadores matemáticos en Python son sencillos, casi todos ellos idénticos a los utilizados en matemática. Las operaciones fundamentales utilizan los siguientes operadores aritméticos:

+ suma
- resta
* multiplicación
/ división
// división entera
** potenciación
% resto



def ejemplo4():
    a = int(input("Ingrese un número:"))
    b = int(input("Ingrese otro número:"))
    print("La suma es ", a+b)
    print("La resta es ", a-b)
    print("El producto es ", a*b)
    print("El cociente es ", a/b)
    print("El cociente entero es ", a//b)
    print("El resto es ", a%b)
    print("La potenciación es ", a**b)
    print("Gracias por participar. Fin del programa.")
ejemplo4()


La división entera entre dos números realiza la división pero toma como resultado sólo la parte entera del cociente. Así


10 // 3 = 3
11 // 3 = 3
12 // 3 = 4
13 // 3 = 4
14 // 3 = 4
15 // 3 = 5, etc.

El operador resto o módulo realiza la división entera entre dos números, pero en lugar del resultado, toma el resto de la división. Así

10 % 3 = 1
11 % 3 = 2
12 % 3 = 0
13 % 3 = 1
14 % 3 = 2
15 % 3 = 0, etc.

Un uso muy importante para el operador % es ver si un número es múltiplo de otro, ya que si a es múltiplo de b, entonces a % b == 0.


La potenciación devuelve el valor de el primer operando elevado al segundo. Así,

2**5 == 32
5**2 == 25

Utilizando un valor float para el segundo operando, se pueden resolver raíces. Así,

49**0.5 == 7.0

Se debe tener en cuenta que las operaciones no definidas en la matemática tampoco lo están en Python. Por lo tanto querer dividir por cero generará un error y la interrupción del programa.





Dado que el Python contempla los números imaginarios, la raíz cuadrada de un número negativo no es un error:





Nótese que para este ejemplo, por lo menos el segundo valor debe ser de tipo float. El resultado de la potenciación es 4,286...*10^16 + 7j en lugar de ser sólo 7j. La diferencia es un valor muy pequeño, que es un error de precisión en el cálculo.
La precedencia de operadores es similar a la de las expresiones matemáticas:
- Primero se resuelven las operaciones entre paréntesis. Si hay varios paréntesis anidados, se resuelven desde adentro hacia afuera.
- Luego las potencias, de izquierda a derecha.
- Luego las multiplicaciones, divisiones y restos, de izquierda a derecha.
- Por último, las sumas y restas de izquierda a derecha.

Por lo tanto, los dos cálculos siguientes no son lo mismo:







1.5 Formatos numéricos y de presentación (Opcional)



(*) Los contenidos desarrollados en este artículo no son fundamentales para comprender el contenido posterior del curso, y pueden saltearse o leerse más adelante. Algunas de las instrucciones aquí explicadas pueden variar mucho o no existir en diferentes versiones de Python.

 
Supongamos un programa sencillo, que imprima las los cuadrados de los números de 1 a  20:



def ejemplo16():
    print("---------------")
    for i in range(1,21):
        r=i*i
        print("|",i," | ",r, " |")
    print("---------------")

ejemplo16()


La instrucción for se ve en el apartado 1.11. lo que hace el programa es generar sucesivamente los números de 1 a 20 y, para cada uno de ellos calcular su cuadrado.

El programa los debería mostrar ordenados en una tabla, pero el poco satisfactorio resultado es:



 Como cada número tiene diferente cantidad de cifras, ocupan una cantidad diferente de espacios en pantalla y se hace imposible encolumnarlos.

 Para resolver este problema se utiliza el parámetro format, que le indica al print el formato en que se quieren mostrar los datos.

 

 El texto entre comillas indica el formato. Así, '{0:<2}'  indica que queremos alinear el contenido a la derecha y ocupar al menos dos caracteres. Si el valor ocupa menos, lo completa con blancos. Si ocupa más, lo imprime completo, perdiendo la alineación. Para alinear a la derecha, se cambia el < por un >, como está hecho con r en el ejemplo (el número indica la cantidad de caracteres a completar) De esta manera, el resultado es mucho más prolijo:


 Otro problema que suele ocurrir se da en el siguiente ejemplo, que calcula todos los números primos menores que 1000:



 El resultado de este programa es el siguiente:



¡Al ser tantos números, los primeros se van de la pantalla!
Para resolver esto, podemos indicar en el comando print que el próximo print, en vez de realizarlo en una nueva línea, lo haga al lado del actual. para esto, le agregamos el parámetro  end="" que sería como indicarle que todavía no termine la línea, aunque haya terminado el print:



 De esta manera, podemos ver todos los número en pantalla (agregando un espacio en blanco al final de cada uno, para separarlos.

Combinando ambas opciones, el resultado es aún mejor:




De esta manera, podemos obtener un formato mucho más amigable para nuestros programas.