Cap. 1 - Cómo es programar en Python
Queremos aprender a pensar como desarrolladores de software ("Computer scientists")
- Esto requiere habilidades combinadas del matemático (lenguaje formal), ingeniero (ensamblar y armar cosas) y científico (estudiar e investigar sistemas complejos)
- La mayor habilidad requerida: resolver problemas
- Es decir: plantear problemas, pensar creativamente en soluciones y expresar/implantar claramente (y con precisión) dichas soluciones
- Aprenderemos a programar como un fin en sí, y como un medio para aprender a resolver problemas
1.1) El lenguaje de programación Python
Es un lenguaje de alto nivel (como C++, PHP, Pascal, Java, C#, etc.)
- Los de bajo nivel son lenguaje de máquina o Assembler, los que entiende la computadora
- Los de alto nivel han de traducirse a bajo nivel antes de ser comprensibles para la computadora
Ventaja de los lenguajes de alto nivel: son fáciles de entender y permiten desarrollar software portable de un sistema a otro.
Se llama Intérprete Python al motor (engine) que traduce y ejecuta nuestro código Python. Tiene dos modos: inmediato y script
- En modo inmediato, se escribe código Python en la línea intérprete y Python ejecuta la acción de inmediato
- El "> > >" es el Python prompt - indica al usuario que el intérprete está pronto para recibir instrucciones
- En modo script, escribimos un programa en un archivo (script) y luego le pedimos al intérprete que ejecute dicho script
- (Los scripts tienen la ventaja de poder guardarse en disco, reutilizarse, imprimirse, etc.)
Usamos como editor de archivos a PyScripter - aunque hay otros varios editores
- Para ejecutar un programa desde PyScripter alcanza con crear un archivo "primer_programa.py" y darle click al botón "Run" en PyScripter
- PyScripter se puede bajar desde acá: https://sourceforge.net/projects/pyscripter/files/latest/download
- Previamente hay que instalar Python que se baja desde: https://www.python.org/downloads/windows/
1.2) ¿Qué es un programa?
Un programa es una secuencia de instrucciones que especifican qué queremos hacer. Cada lenguaje difiere, pero en casi todos aparece lo siguiente:
input | Obtener información desde el teclado, un archivo o algún otro dispositivo. |
output | Mostrar información en pantalla, enviarla a un archivo o a otro dispositivo |
math | Operaciones matemáticas básicas (suma, multiplicación, etc.) |
ejecución condicional | Chequear ciertas condiciones y en función del resultado ejecutar una u otra secuencia de acciones |
repetición | Repetir cierta acción varias veces (habitualmente con cierta variación entre cada repetición) |
Y eso es casi todo! Casi todo programa, por más complicado que sea, se basa en una serie de instrucciones que podrían reducirse a esos 5 tipos.
1.3) ¿Qué es debugging?
La programación es un proceso complejo hecho por humanos, por lo cual suele conducir a errores. Los errores de programación se llaman bugs y el proceso por el cual se eliminan estos errores se llama debugging. Se sabe que el término bug para referirse a errores de ingeniería se utiliza desde hace tiempo (Edison lo utilizó en 1889 para referirse a un problema con su fonógrafo).
Suelen darse 3 clases de error en un programa:
- Errores de sintaxis
- Errores de tiempo de ejecución (runtime)
- Errores semánticos
1.4) Errores de sintaxis (Syntax errors)
Los errores de sintaxis pueden ocurrir igualmente en lenguaje hablado, pero solemos ser capaces de manejarnos con ellos (por ejemplo, si un texto tiene un par de errores ortográficos o gramaticales comprendemos su significado de todas formas). Python no va a ser tan paciente y va a detener la ejecución de inmediato, reportando el error. Estos errores suelen ser un dolor de cabeza para los programadores principiantes.
1.5) Errores de tiempo de ejecución (runtime)
Sólo aparecen cuando se ejecuta el programa (también se llaman exceptions porque indican que algo no esperado ha ocurrido).
No suelen darse en programas sencillos, por lo cual no son frecuentes cuando uno empieza a programar.
1.6) Errores semánticos
Ocurren cuando el programa corre exitosamente, pero no hace lo que uno esperaba. Hace algo distinto: lo que le indicamos que hiciera.
Es decir, el programa que escribimos no es el que queríamos escribir. Son problemas difíciles de detectar y difíciles de resolver: requieren reproducir el problema primero para ir hacia atrás y encontrar el punto en que la lógica es incorrecta.
1.7) Debugging experimental
A veces puede ser frustrante, pero hacer debugging es una de las tareas más desafiantes y detectivescas de la programación, y es parte fundamental del aprendizaje del programador.
Tiene también algo de ciencia experimental: se conjetura cuál puede ser la causa del error, se hacen cambios y se vuelve a probar.
Hay quien dice que programar y hacer debugging es lo mismo: programar es hacer debugging a un código hasta que termina haciendo lo que queremos que haga.
Ejemplo: Linux. Empezó como un programa de bajo nivel que debía pasar de mostrar "AAAA" a mostrar "BBBB", y hoy es un sistema operativo de millones de líneas.
1.8) Lenguajes formales y naturales
Naturales: son los que hablamos (inglés, español, francés). No fueron diseñados por personas, sino que evolucionaron por su cuenta.
Formales: diseñados por personas para aplicaciones específicas. Por ejemplo, los lenguajes formales de las matemáticas (expresan relaciones) y la química (expresan estructuras químicas).
Los lenguajes de programación fueron diseñados para expresar computaciones.
Los lenguajes formales tienen reglas (2+2 = 4 es correcto; 2+/=42 no lo es - del mismo modo, H2O es correcto, pero Z2324O no lo es)
La sintaxis de un lenguaje de computación consta de tokens y estructura
- Los tokens son los elementos básicos del lenguaje (palabras, números, paréntesis, comas, etc.)
- Las estructuras establecen en qué orden pueden o no relacionarse los tokens para que la expresión sea válida
El proceso por el cual al leer (los tokens de) una frase determinamos cuál es su estructura se llama parsing
- En el caso de lenguajes naturales, "parsing" consiste en identificar cuál es el sujeto, cuál el verbo, etc.
Una vez identificada la sintaxis correcta, ésta se interpreta con una semántica (la cual depende del contexto).
Algunas diferencias entre lenguajes naturales y formales:
- Ambigüedad: los naturales están llenos de ambigüedades (que manejamos utilizando contexto y otras claves) - los lenguajes formales se diseñan para evitar dicha ambigüedad
- Redundancia: para evitar los malos entendidos provocados por la ambigüedad, los lenguajes naturales utilizan mucha redundancia - los formales, en cambio, buscan ser más concisos
- Literalidad: los lenguajes formales significan exactamente lo que afirman - los naturales, en cambio, están llenos de expresiones típicas y metáforas
Para leer un lenguaje formal:
- Recordar que son mucho más densos que los lenguajes naturales (dicen mucho en poco espacio)
- No ir "hacia adelante" como se hace como uno natural, sino identificar primero la estructura
- Los mínimos detalles y errores cuentan: un punto y coma o un espacio pueden alterar completamente el significado del programa
1.9) Primer programa
Por tradición, el primer programa es "Hola, mundo", que queda así en Python:
Algunos juzgan la calidad de un lenguaje de programación por la simplicidad de su "Hola, Mundo!". En este sentido, Python es de los mejores.
1.10) Comentarios
Un comentario es texto que sólo se dirige al usuario humano (para aclararle de qué se trata el código que está leyendo).
Un comentario comienza en el primer punto de una línea en que aparezca el token #
También se pueden dejar líneas en blanco (todas las que se quiera)
Ejemplo:
#--------------------------------------------------- # Esta demo muestra cuán fácil es agregar comentarios en Python # Adaptado de un programa de Joe Soap (diciembre 2010). # Se puede copiar o modificar libremente #--------------------------------------------------- print("Hola mundo!") # Es muy fácil!
1.11) Glosario
- algoritmo, bug, comentario, debugging, excepción, lenguaje formal, lenguaje natural
- lenguaje de alto nivel (un lenguaje de programación como Python que fue diseñado para ser de fácil lectura para seres humanos)
- lenguaje de bajo nivel (un lenguaje de programación diseñado para que la máquina lo pueda ejecutar fácilmente; también llamado lenguaje de máquina o assembler)
- modo inmediato (un estilo de uso de Python: se escribe en la línea de comandos y se obtiene la respuesta de inmediato - por oposición a script)
- intérprete (el engine que ejecuta los scripts y expresiones Python)
- código objeto (output del compilador luego de traducir el programa)
- parsing, portabilidad, función "print", resolución de problemas, programa
- Python shell (interfaz interactiva para el intérprete de Python: el usuario escribe tras el prompt >>> y recibe la respuesta de inmediato - es el modo por defecto en PyScripter)
- runtime error, o error de tiempo de ejecución (error que ocurre sólo cuando el programa está corriendo, pero interrumpe su ejecución)
- script, error semántico, semántica, código fuente, sintaxis, error de sintaxis, token
1.12) Ejercicios
1) Escribir una sentencia en español con semántica comprensible pero sintaxis incorrecta. Y otra con sintaxis correcta pero errores semánticos
- Semántica ok: gato de mesa arriba acostado
- Sintaxis ok: el gato está ladrando sobre la luna
2) Hacer experimentos con la suma (+), multiplicación (*) y potenciación (**) en la línea de comandos
3) La expresión "1 2" genera un reporte de error de sintaxis. Buscar otros casos que generen mensajes similares.
4) Si se escribe print("hello") se obtiene "hello" sin comillas. Si simplemente se escribe "hello" se obtiene 'hello' con comillas. Experimentar con ese tema.
5) Si se escribe una palabra como "gato" (sin comillas), se obtendrá un reporte de error de sintaxis (porque la palabra no ha sido definida)
- Si en cambio se hace gato = 3 primero, entonces luego gato devolverá el valor 3 (ya está definido)
6) Si se escribe 6+4*9 en el prompt, se obtiene el resultado 42. Pero si se escribe en un script, no se obtiene output (ya que no se solicitó output, sólo se hace el cálculo internamente)
Si en cambio en el script se pone print(6+4*9) entonces sí se ve el 42
- La causa: cuando se escribe una expresión en el prompt, ésta se evalúa y el resultado se envía a pantalla
- En cambio, cuando se escribe una expresión en un script, ésta se evalúa pero no se envía a pantalla