Python
«Programming is not about
typing, it’s about thinking.» –
Rich Hickey
Los ordenadores son dispositivos complejos pero están diseñados para
hacer una cosa bien: ejecutar aquello que se les indica.
La cuestión es cómo indicar a un ordenador lo que queremos que
ejecute.
Esas indicaciones se llaman técnicamente instrucciones y se expresan
en un lenguaje.
Podríamos decir que programar consiste en escribir instrucciones para
que sean ejecutadas por un ordenador. El lenguaje que utilizamos para
ello se denomina lenguaje de programación, en nuestro caso, va a ser
Python.
Ada Lovelace: primera programadora de la historia
1815- matemática y escritora británica, célebre sobre
todo por su trabajo acerca de la computadora mecánica
de uso general de Charles Babbage, la denominada
máquina analítica.
Fue la primera en reconocer que la máquina tenía
aplicaciones más allá del cálculo puro y en haber
publicado lo que se reconoce hoy como el primer
algoritmo destinado a ser procesado por una máquina,
por lo que se la considera como la primera
programadora de ordenadores.
https://commons.wikimedia.org/wiki/File:Ada_Lovelace_en_Grandes_Mujeres_de_Chicas_en_Tecnolog%C3%ADa_01.jpg
Código máquina
Ensamblador
El primer lenguaje de programación que encontramos
en esta «escalada» es ensamblador.
Veamos un ejemplo de código en ensamblador
del típico programa que se escribe por primera vez,
el «Hello, World»:
C
El mismo ejemplo anterior del
programa «Hello, World» se
escribiría así en lenguaje C:
Python
Si seguimos «subiendo» en esta lista de lenguajes de programación, podemos llegar hasta
Python.
Se dice que es un lenguaje de más alto nivel en el sentido de que sus instrucciones son más
entendibles por un humano.
Veamos cómo se escribiría el programa «Hello, World» en el lenguaje de programación
Python:
Lenguajes de alto nivel
Cronología de los lenguajes de programación más destacados
Uno de los lenguajes con mayor proyección actualmente
Grandes empresas y organismos que usan Python
Ranking de lenguajes de programación
Compilador
La pregunta que surge es: ¿cómo entiende una máquina lo que tiene que hacer si le
pasamos un programa hecho en Python (o cualquier otro lenguaje de alto nivel)?
La respuesta es un compilador. son programas que convierten un lenguaje
«cualquiera» en código máquina.
Se pueden ver como traductores, permitiendo a la máquina interpretar lo que
queremos hacer.
Intérprete
Para ser más exactos, en Python hablamos de un intérprete en vez de un compilador, pero a
los efectos es prácticamente lo mismo.
La diferencia está en que el intérprete realiza la «compilación» (interpretación) y la
«ejecución» de una vez, mientras que el compilador genera un formato «ejecutable» (código
objeto) que se ejecuta en otra fase posterior.
Python
Python es un lenguaje de programación de alto nivel creado a finales de los
80/principios de los 90 por Guido van Rossum, holandés que trabajaba por
aquella época en el Centro para las Matemáticas y la Informática de los Países
Bajos. Sus instrucciones están muy cercanas al lenguaje natural en inglés y se
hace hincapié en la legibilidad del código.
Toma su nombre de los Monty Python, grupo humorista de los 60 que gustaban
mucho a Guido.
Python fue creado como sucesor del lenguaje ABC
Características del lenguaje
A partir de su definición de la Wikipedia:
• Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en
una sintaxis que favorezca un código legible.
• Se trata de un lenguaje de programación multiparadigma, ya que soporta
orientación a objetos, programación imperativa y, en menor medida, programación
funcional.
Usa tipado dinámico y es multiplataforma.
• Añadiría, como característica destacada, que se trata de un lenguaje de propósito
general.
VENTAJAS DESVENTAJAS
● Libre y gratuito (OpenSource). ● Interpretado (velocidad de
● Fácil de leer, parecido a ejecución, multithread vs GIL, etc.).
pseudocódigo. ● Consumo de memoria. • Errores
● Aprendizaje relativamente fácil y durante la ejecución.
rápido: claro, intuitivo…. ● Dos versiones mayores no del todo
● Alto nivel. compatibles (v2 vs v3).
● Alta Productividad: simple y rápido. ● Desarrollo móvil.
● Tiende a producir un buen código: ● Documentación a veces dispersa e
orden, limpieza, elegancia, incompleta.
flexibilidad, … ● Varios módulos para la misma
● Multiplataforma. Portable. funcionalidad.
● Multiparadigma: programación ● Librerías de terceros no siempre del
imperativa, orientada a objetos, todo maduras.
funcional, …
● Interactivo, modular, dinámico. •
Librerías extensivas («pilas
incluídas»).
VENTAJAS DESVENTAJAS
● Gran cantidad de librerías de
terceros.
● Extensible (C++, C, …) y «embebible».
● Gran comunidad, amplio soporte.
● Interpretado.
● Fuertemente tipado, tipado
dinámico.
● Hay diferentes implementaciones:
CPython, PyPy, Jython, IronPython,
MicroPython, …
Evolución de Python
Entornos de desarrollo
Cuando vamos a trabajar con Python debemos tener instalado, como mínimo, un intérprete
del lenguaje (para otros lenguajes sería un compilador). El intérprete nos permitirá ejecutar
nuestro código para obtener los resultados deseados. La idea del intérprete es lanzar
instrucciones «sueltas» para probar determinados aspectos.
Pero normalmente queremos ir un poco más allá y poder escribir programas algo más largos,
por lo que también necesitaremos un editor. Un editor es un programa que nos permite crear
ficheros de código (en nuestro caso con extensión *.py), que luego son ejecutados por el intérprete.
Hay otra herramienta interesante dentro del entorno de desarrollo que sería el depurador. Lo
podemos encontrar habitualmente en la bibliografía por su nombre inglés debugger. Es el
módulo que nos permite ejecutar paso a paso nuestro código y visualizar qué está ocurriendo en
cada momento. Se suele usar normalmente para encontrar fallos (bugs) en nuestros programas
y poder solucionarlos (debug/fix).
Thonny
Thonny es un programa muy
interesante para empezar a
aprender Python ya que
engloba estas tres
herramientas: intérprete,
editor y depurador.
https://thonny.org/
Instalación de Thonny
Para instalar Thonny debemos acceder a su web y descargar la aplicación para nuestro sistema
operativo.
La ventaja es que está disponible tanto para Windows, Mac y Linux. Una vez descargado el fichero lo
ejecutamos y seguimos su instalación paso por paso.
Una vez terminada la instalación ya podemos lanzar la aplicación que se verá parecida a la siguiente
imagen:
Thonny
Podemos observar que la pantalla está dividida en 3 paneles:
● Panel principal que contiene el editor e incluye la etiqueta <untitled>
donde escribiremos nuestro código fuente Python.
● Panel inferior con la etiqueta Shell que contiene el intérprete de
Python. Thonny incluye la versión de Python 3.7.7.
● Panel derecho que contiene el depurador. Más concretamente se trata
de la ventana de variables donde podemos inspeccionar el valor de las
mismas.
Manual de Thonny
Tipos de datos
Los programas están formados por código y datos. Pero a nivel interno de la
memoria del ordenador no son más que una secuencia de bits.
La interpretación de estos bits depende del lenguaje de programación, que
almacena en la memoria no sólo el puro dato sino distintos metadatos.
Cada «trozo» de memoria contiene realmente un objeto, de ahí que se diga que en Python
todo son objetos.
Y cada objeto tiene, al menos, los siguientes campos:
● Un tipo del dato almacenado.
● Un identificador único para distinguirlo de otros objetos.
● Un valor consistente con su tipo.
TIPOS DE DATOS EN PYTHON
Variables
Las variables son fundamentales ya que permiten definir nombres para los valores
que tenemos en memoria y que vamos a usar en nuestro programa.
Reglas para nombrar variables
En Python existen una serie de reglas para los nombres de variables:
1. Sólo pueden contener los siguientes caracteres:
• Letras minúsculas.
• Letras mayúsculas.
• Dígitos.
• Guiones bajos (_).
2. Deben empezar con una letra o un guión bajo, nunca con un dígito.
3. No pueden ser una palabra reservada del lenguaje («keywords»).
Reglas para nombrar variables
Podemos obtener un listado de las palabras reservadas del lenguaje de la
siguiente forma:
IMPORTANTE
Los nombres de variables son «case-sensitive» .
Por ejemplo, stuff y Stuff son nombres diferentes.
Ejemplos de nombres de variables
Convenciones para nombres
Mientras se sigan las reglas que hemos visto para nombrar variables no hay problema en la
forma en la que se escriban, pero sí existe una convención para la nomenclatura de las
variables.
Se utiliza el llamado snake_case en el que utilizamos caracteres en minúsculas
(incluyendo dígitos si procede) junto con guiones bajos – cuando sean necesarios para su
legibilidad –.
Por ejemplo, para nombrar una variable que almacene el número de canciones en nuestro
ordenador, podríamos usar num_songs.
Convenciones para nombres
Constantes
Podríamos decir que es un tipo de variable pero que su valor no cambia a lo largo de
nuestro programa.
Por ejemplo la velocidad de la luz. Sabemos que su valor es constante de 300.000
km/s.
En el caso de las constantes utilizamos mayúsculas (incluyendo guiones bajos si es
necesario) para nombrarlas.
Para la velocidad de la luz nuestra constante se podría llamar: LIGHT_SPEED.
Elegir buenos nombres
Se suele decir que una persona programadora (con cierta experiencia), a lo que dedica más tiempo,
es a buscar un buen nombre para sus variables.
Quizás es algo excesivo pero da una idea de lo importante que es esta tarea.
Es fundamental que los nombres de variables sean autoexplicativos, pero siempre llegando a un
compromiso entre ser concisos y claros.
Regla general
ASIGNACIÓN
En Python se usa el símbolo = para asignar un valor a una variable:
EJERCICIO DE ASIGNACIÓN
Como recientemente ha sido el día de PI, vamos a asignar ese valor y mostrarlo después por
pantalla.
EJERCICIO DE ASIGNACIÓN
Como recientemente ha sido el día de PI, vamos a asignar ese valor y mostrarlo después por
pantalla.
ASIGNACIÓN
Python nos ofrece la posibilidad de hacer una asignación múltiple de la siguiente manera:
En este caso las tres variables utilizadas en el «lado izquierdo» tomarán el valor 3.
ASIGNACIÓN
¡CUIDADO con no seguir las reglas para los nombres!
Asignando una variable a otra variable
Las asignaciones que hemos hecho hasta ahora han sido de un valor literal a una
variable.
Pero nada impide que podamos hacer asignaciones de una variable a otra variable:
Conocer el valor de una variable
Hemos visto previamente cómo asignar un valor a una variable, pero aún no sabemos cómo
«comprobar» el valor que tiene dicha variable. Para ello podemos utilizar dos estrategias:
1. Si estamos en una «shell» de Python, basta con que usemos el nombre de la variable:
2. Si estamos escribiendo un programa desde el editor, podemos hacer uso de print:
Conocer el tipo de una variable
Para poder descubrir el tipo de un literal o una variable, Python nos ofrece la función
type(). ¡CUIDADO!, para que nos muestre el resultado debemos usarla con print())
Ejemplos:
Tarea 2: tipos (comprueba_tipos.py)
1. Asigna un valor entero 2001 a la variable space_odyssey y muestra su
valor.
2. Averigua el tipo del literal ‘Good night & Good luck’
3. Identifica el tipo del literal True.
4. Asigna la expresión 10 * 3.0 a la variable result y muestra su tipo.
MUTABILIDAD
Las variables son nombres, no lugares. Detrás de esta frase se esconde la reflexión de que cuando
asignamos un valor a una variable, lo que realmente está ocurriendo es que se hace apuntar el nombre de
la variable a una zona de memoria en el que se representa el objeto (con su valor).
Si realizamos la asignación de una
variable a un valor lo que está
ocurriendo es que el nombre de la
variable es una referencia al valor, no el
valor en sí mismo:
MUTABILIDAD
Si ahora «copiamos» el valor de
a en otra variable b se podría
esperar que hubiera otro
espacio en memoria para dicho
valor, pero como ya hemos
dicho, son referencias a
memoria:
MUTABILIDAD
Para comprobarlo podemos usar la función id() que nos permite conocer la dirección de memoria6 de un
objeto en Python. A través de ella podemos comprobar que los dos objetos que hemos creado «apuntan» a la
misma zona de memoria:
MUTABILIDAD
Se dice que un entero es inmutable ya que a
la hora de modificar su valor obtenemos una
nueva zona de memoria, o lo que es lo mismo,
un nuevo objeto:
MUTABILIDAD
Sin embargo, si tratamos con listas, podemos ver que la modificación de alguno de sus valores no implica un
cambio en la posición de memoria de la variable, por lo que se habla de objetos mutables.
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/lvCyXeL
La característica de que los nombres de variables sean referencias a objetos en memoria es la que hace
posible diferenciar entre objetos mutables e inmutables:
Importante: El hecho de que un tipo de datos sea
inmutable significa que no podemos modificar su
valor «in-situ», pero siempre podremos asignarle un
nuevo valor (hacerlo apuntar a otra zona de
memoria).
FUNCIONES DEL SISTEMA
Hemos ido usando una serie de funciones sin ser especialmente conscientes de ello. Esto se
debe a que son funciones «built-in» o incorporadas por defecto en el propio lenguaje Python.
AMPLIACIÓN
PARA AMPLIAR CONOCIMIENTOS PUEDES CONSULTAR:
● Basic Data Types in Python
● Tipos de datos
● Variables in Python
● Immutability in Python
● Referencia del Lenguaje Python
Booleanos
George Boole es considerado como uno de los fundadores del campo de las ciencias de la
computación y fue el creador del Álgebra de Boole que da lugar, entre otras estructuras
algebraicas, a la Lógica binaria.
En esta lógica las variables sólo pueden tomar dos valores discretos: verdadero o falso.
El tipo de datos bool proviene de lo explicado anteriormente y admite dos posibles valores:
• True que se corresponde con verdadero (y también con 1 en su representación numérica).
• False que se corresponde con falso (y también con 0 en su representación numérica).
Booleanos
Atención: Tal y como se explicó en este apartado, los
nombres de variables son «case-sensitive». De igual modo
el tipo booleano toma valores True y False con la
primera letra en mayúsculas. De no ser así obtendríamos
un error sintáctico.
Números enteros
Los números enteros no tienen decimales pero sí pueden
contener signo y estar expresados en alguna base distinta
de la usual (base 10).
Dos detalles a tener en cuenta:
• No podemos comenzar un número entero por 0.
• Python permite dividir los números enteros con guiones
bajos _ para clarificar su lectura/escritura. A efectos
prácticos es como si esos guiones bajos no existieran.
Operaciones con enteros
Ejemplos
Módulo
Módulo
Asignación aumentada
Python nos ofrece la posibilidad de escribir una asignación aumentada mezclando la
asignación y un operador.
Asignación aumentada
Supongamos que disponemos de 100 vehículos en stock y que durante el pasado mes se
han vendido 20 de ellos.
Asignación tradicional
Asignación aumentada
Asignación aumentada
De este mismo modo, podemos
aplicar un formato compacto al
resto de operaciones:
Límite de un entero
¿Cómo de grande puede ser un int en Python? La respuesta es de cualquier tamaño. Por poner un
ejemplo, supongamos que queremos representar un centillón. Este valor viene a ser un «1»
seguido por ¡600 ceros! ¿Será capaz Python de almacenarlo?
En muchos lenguajes tratar con enteros tan largos causaría un «integer overflow». No
es el caso de Python que puede manejar estos valores sin problema.
Número flotante
Los números en punto flotante tienen parte decimal.
Veamos algunos ejemplos de flotantes en Python
(diferentes formas de escribir 4.0)
Conversión de tipos
El hecho de que existan distintos tipos de datos en Python (y en el resto de lenguajes de
programación) es una ventaja a la hora de representar la información del mundo real de
la mejor manera posible.
Pero también se hace necesario buscar mecanismos para convertir unos tipos de datos
en otros.
Conversión IMPLÍCITA
Cuando mezclamos enteros, booleanos y flotantes, Python realiza automáticamente una
conversión implícita (o promoción) de los valores al tipo de «mayor rango».
Veamos algunos ejemplos de esto:
Conversión EXPLÍCITA
Aunque más adelante veremos el concepto de función, desde ahora podemos decir que existen
una serie de funciones para realizar conversiones explícitas de un tipo a otro:
bool()
Convierte el tipo a booleano.
int()
Convierte el tipo a entero.
float()
Convierte el tipo a flotante.
Conversión EXPLÍCITA. Ejemplos
En el caso de que usemos la función int() sobre un valor
flotante, nos retorna su parte ENTERA:
int(x)=⌊x⌋
Tarea 3: Ejercicios
1. Escribir un programa en Python que averigue el área de círculo de radio 5.
2. Escribir un programa en Python que obtenga el volumen de una esfera de radio 5.
3. Escribir un programa en Python que calcule el área de un triángulo de base 4 y
altura 5.
Cadenas de texto
Las cadenas de texto son secuencias de caracteres. También se les conoce
como «strings» y nos permiten almacenar información textual de forma
muy cómoda.
Es importante destacar que Python 3 almacena los caracteres codificados
en el estándar Unicode, lo que es una gran ventaja con respecto a versiones
antiguas del lenguaje.
Además permite representar una cantidad ingente de símbolos incluyendo
los famosos emojis 😎.
Creando STRINGS
Para escribir una cadena de texto en Python basta con rodear
los caracteres con comillas simples.
Dentro de un string puedo entrecomillar, si uso comillas dobles.
Creando STRINGS
Puede surgir la duda de cómo incluimos comillas simples dentro de la propia
cadena de texto.
Veamos soluciones para ello, escapando las comillas simples para que no sean
tratadas como caracteres especiales.
o cambiando el orden
Comillas triples
Hay una forma alternativa de crear cadenas de texto utilizando comillas triples.
Su uso está pensado principalmente para cadenas multilínea:
Conversión
Podemos crear «strings» a partir de otros tipos de datos usando la función
str():
Secuencias de escape
Python permite escapar el significado de algunos caracteres para conseguir otros
resultados. Si escribimos una barra invertida \ antes del carácter en cuestión, le
otorgamos un significado especial.
Quizás la secuencia de escape más conocida es \n que representa un salto de
línea, pero existen muchas otras:
Secuencias de escape
Secuencias de escape
Expresiones literales
Hay situaciones en las que nos interesa que los
caracteres especiales pierdan ese significado y poder
usarlos de otra manera. Existe un modificar de
cadena que proporciona Python para tratar el texto
en bruto.
Es el llamado «raw data» y se aplica anteponiendo
una r a la cadena de texto.
Veamos algunos ejemplos:
Más de print()
Hemos estado utilizando la función print() de forma sencilla, pero admite algunos
parámetros interesantes:
Línea 4:
Podemos imprimir todas las variables que
queramos separándolas por comas.
Línea 7:
El separador por defecto entre las variables es un
espacio, podemos cambiar el carácter que se
utiliza como separador entre cadenas.
Línea 10:
El carácter de final de texto es un salto de línea,
podemos cambiar el carácter que se utiliza como
final de texto.
Leer datos de teclado
Los programas se hacen para tener interacción con el usuario. Una de las formas de
interacción es solicitar la entrada de datos por teclado. Como muchos otros lenguajes
de programación, Python también nos ofrece la posibilidad de leer la información
introducida por teclado. Para ello se utiliza la función input():
Leer datos de teclado
Tarea 4: Calculadora
Escriba un programa en Python que lea por teclado dos números enteros y muestre
por pantalla el resultado de realizar las operaciones básicas entre ellos.
Aproveche todo el
potencial que ofrece
print() para
conseguir la salida
esperada.
Operaciones con «strings»: Combinar cadenas
Podemos combinar dos o más cadenas de texto utilizando el operador +:
Operaciones con «strings»: Repetir cadenas
Podemos repetir dos o más cadenas de texto utilizando el operador *:
Operaciones con «strings»: Obtener un carácter
Los «strings» están indexados y cada carácter tiene su propia posición.
Para obtener un único carácter dentro de una cadena de texto es necesario
especificar su índice dentro de corchetes [...].
Operaciones con «strings»: Trocear una cadena
Es posible extraer «trozos» («rebanadas») de una cadena de texto 2. Tenemos varias aproximaciones para
ello:
[:]
Extrae la secuencia entera desde el comienzo hasta el final. Es una especie de copia de toda la cadena de
texto.
[start:]
Extrae desde start hasta el final de la cadena.
[:end]
Extrae desde el comienzo de la cadena hasta end menos 1.
[start:end]
Extrae desde start hasta end menos 1.
[start:end:step]
Extrae desde start hasta end menos 1 haciendo saltos de tamaño step.
Operaciones con «strings»: Trocear una cadena
El troceado siempre llega a una unidad
menos del índice final que hayamos
especificado.
Sin embargo el comienzo sí coincide con el
que hemos puesto.
Operaciones con «strings»: Longitud de una cadena
Para obtener la longitud de una cadena podemos hacer uso de len(), una función
común a prácticamente todos los tipos y estructuras de datos en Python:
Operaciones con «strings»: Otras funciones
Pertenencia de un elemento: comprueba si una subcadena de texto está en la
cadena. Operador in y devuelve un booleano.
Operaciones con «strings»: Otras funciones
Dividir una cadena: función split(), que debemos usar anteponiendo el «string»
que queramos dividir:
Operaciones con «strings»: Otras funciones
Dividir una cadena: Existe una forma algo más avanzada de dividir una cadena a
través del particionado. Para ello podemos valernos de la función partition()
que proporciona Python.
Esta función toma un argumento como separador, y divide la cadena de texto en 3
partes:
lo que queda a la izquierda del separador,
el separador en sí mismo
y lo que queda a la derecha del separador:
Operaciones con «strings»: Limpiar cadenas
Cuando leemos datos del usuario o de cualquier fuente externa de información, es bastante
probable que se incluyan en esas cadenas de texto, caracteres de relleno 3 al comienzo y al final.
Python nos ofrece la posibilidad de eliminar estos caracteres u otros que no nos interesen.
La función strip() se utiliza para eliminar caracteres del principio y del final de un «string».
También existen variantes de esta función para aplicarla únicamente al comienzo o únicamente
al final de la cadena de texto [lstrip() y rstrip()].
Supongamos que debemos procesar un fichero con números de serie de un determinado
artículo. Cada línea contiene el valor que nos interesa pero se han «colado» ciertos caracteres de
relleno que debemos limpiar:
Operaciones con «strings»: Reemplazar elementos
Podemos usar la función replace() indicando la subcadena a reemplazar, la
subcadena de reemplazo y cuántas instancias se deben reemplazar.
Si no se especifica este último argumento, la sustitución se hará en todas las
instancias encontradas:
Operaciones con «strings»: Mayúsculas y minúsculas
Operaciones con «strings»: Caracteres UNICODE
Python trabaja por defecto con caracteres Unicode. Eso significa que tenemos
acceso a la amplia carta de caracteres que nos ofrece este estándar de codificación.
Supongamos un ejemplo sobre el típico «emoji» de un cohete definido en este cuadro:
La función chr() permite
representar un carácter a partir de
su código:
Operaciones con «strings»: Caracteres UNICODE
COMENTARIOS
Se trata de anotaciones que podemos incluir en el código, sin
que sean interpretadas, pero que nos permiten aclarar
determinados aspectos del código.
# para poner comentarios de una línea
LEGIBILIDAD DEL CÓDIGO
Los programas suelen ser más legibles cuando las líneas no son
excesivamente largas. La longitud máxima de línea recomendada por la
guía de estilo de Python es de 80 caracteres.
En caso de que queramos romper una línea de código demasiado larga,
tenemos dos opciones:
1. Usar la barra invertida \
2. Usar los paréntesis (...)
CONTROL DE FLUJO
Todo programa informático está formado por instrucciones
que se ejecutan de forma secuencial de «arriba» a «abajo», de
igual manera que leeríamos un libro.
Este orden constituye el llamado flujo del programa.
Es posible modificar este flujo secuencial para que tome
bifurcaciones o repita ciertas instrucciones.
Las sentencias que nos permiten hacer estas modificaciones
se engloban en el control de flujo.
DIAGRAMA DE FLUJO
El diagrama de flujo facilita mucho expresar por primera vez un programa
CONTROL DE FLUJO:
De selección / decisión/ CONDICIONALES
En una estructura de selección o decisión el
programa al ser ejecutado determina si se
debe ejecutar un bloque de código u otro si
se cumplen o no ciertas condiciones.
De ahí que se les suele llamar
“condicionales”.
CONTROL DE FLUJO: IF
La sentencia condicional en Python (al igual que en muchos otros lenguajes de
programación) es if.
En su escritura debemos añadir una expresión de comparación terminando con dos
puntos al final de la línea.
CONTROL DE FLUJO: IF-ELSE
En el caso anterior la condición se cumplía pero podría no ser así.
Para controlar ese caso existe la sentencia else.
CONTROL DE FLUJO: IF-ELSE
Podríamos tener incluso condiciones anidadas (usando indentación).
CONTROL DE FLUJO: ELIF
Python nos ofrece una mejora en la escritura de condiciones anidadas cuando
aparecen consecutivamente un else y un if. Podemos sustituirlos por la sentencia elif:
CONTROL DE FLUJO: ELIF
Ejecución paso a paso a través de Python Tutor:
https://cutt.ly/wd58B4t
Operadores de comparación
Cuando escribimos condiciones debemos incluir alguna expresión de
comparación. Para usar estas expresiones es fundamental conocer los
operadores que nos ofrece Python:
Operadores de comparación
Podemos escribir condiciones más complejas usando los operadores lógicos:
and • or • not
Operadores de comparación
A diferencia de otros lenguajes de programación, Python ofrece la posibilidad
de ver si un valor está entre dos límites de manera directa.
Tarea
Pedir un año al usuario, meterlo en una variable year (con un valor
entero) y comprobar si dicho año es bisiesto o no lo es.
Un año es bisiesto en el calendario Gregoriano, si es divisible
entre 4 y no divisible entre 100.
Compruébalo en esta lista de años bisiestos.
Uso de booleanos en las condiciones
Cuando queremos preguntar por la veracidad de una determinada variable
«booleana» en una condición, la primera aproximación que parece
razonable es la siguiente:
Uso de booleanos en las condiciones
Aunque podemos simplificar la condición:
Uso de booleanos en las condiciones
O si el valor es FALSO:
Valor nulo
None es un valor especial de Python que almacena el valor nulo .
Veamos cómo se comporta al incorporarlo en condiciones de veracidad:
Valor nulo
Para distinguir None de los valores propiamente booleanos, se
recomienda el uso del operador is.
Valor nulo
Esto nos puede servir para verificar la introducción de valores, por
ejemplo:
Para indicar que un string en Python contendrá variables a ser sustituidas debemos anteceder el caracter "f"
ESTRUCTURAS DE CONTROL CONDICIONAL
Existen tres tipos de estructuras de selección:
Estructura de selección doble: Al igual
Estructura de selección simple: que la estructura de selección simple Estructura de selección
estructura que evalúa una evalúa una condición pero con la múltiple: Al igual que la
determinada condición; y si diferencia de que permite tomar dos anterior nos permite realizar
esta se cumple (suponiendo que opciones o bifurcaciones diferentes bifurcaciones en ramales pero
sea verdadera) toma la decisión según se cumpla o no dicha condición. con la diferencia de que no solo
de ejecutar determinado Son fácilmente reconocidas o nos permite dos; sino muchas
bloque de código especificado; mencionadas como estructuras más; eligiendo una así entre
modificando el flujo normal del “si/sino” o “if/else”. Y fácilmente varias posibles (además de
programa a través de una diferenciables de las simples por permitir agregar una por
bifurcación. En caso de ser permitir ingresar otro bloque de defecto “else” al final). Y con la
determinada como falsa, código adicional en caso de no diferencia también que lo hace
continua el flujo normalmente cumplirse una condición (else) en base a un valor de una
haciendo caso omiso de ella. obteniendo así otro ramal de flujo variable
alternativo.
ESTRUCTURAS DE CONTROL
CONDICIONAL
Estructuras de selección SIMPLE:
ESTRUCTURAS DE CONTROL
CONDICIONAL
Estructuras de selección DOBLE:
ESTRUCTURAS DE CONTROL
CONDICIONAL
Estructuras de selección MÚLTIPLE:
ESTRUCTURAS DE CONTROL CONDICIONAL
Estructura de selección MATCH-CASE:
A partir de Python 3.10 se introduce el Structural Pattern Matching
que introdujo en el lenguaje una nueva sentencia
condicional.
Semejante al «switch» que ya existe en otros lenguajes
de programación.
Comprueba valores de entrada con una serie de literales, como si
realizáramos un secuencia encadenada de if.
ESTRUCTURAS DE CONTROL CONDICIONAL
Estructura de selección MATCH-CASE:
Tarea
Escriba un programa en Python que acepte un «string» con los 8
dígitos de un NIF, y calcule su dígito de control
Tarea AMPLIACIÓN
Escriba un programa en Python que acepte un DNI (incluida la letra) y
compruebe si es un DNI válido.
1. Recoger el DNI
2. Extraer solo los números
3. Calcular su dígito de control
4. Comprobar que concuerda con la letra que nos han dado
5. Mostrar un mensaje diciendo que es un DNI válido
CONTROL DE FLUJO
Todo programa informático está formado por instrucciones
que se ejecutan de forma secuencial de «arriba» a «abajo», de
igual manera que leeríamos un libro.
Este orden constituye el llamado flujo del programa.
Es posible modificar este flujo secuencial para que tome
bifurcaciones o repita ciertas instrucciones.
Las sentencias que nos permiten hacer estas modificaciones
se engloban en el control de flujo.
CONTROL DE FLUJO: BUCLES
Cuando queremos hacer algo más de una vez, necesitamos
recurrir a un bucle.
Vamos a ver las distintas sentencias en Python que nos
permiten repetir un bloque de código.
CONTROL DE FLUJO: Sentencia WHILE
La semántica tras esta sentencia es:
«Mientras se cumpla la condición haz algo»
CONTROL DE FLUJO: Sentencia WHILE
La semántica tras esta sentencia es:
«Mientras se cumpla la condición haz algo»
CONTROL DE FLUJO: Sentencia WHILE
La semántica tras esta sentencia es:
«Mientras se cumpla la condición haz algo»
CONTROL DE FLUJO: Romper una sentencia WHILE
Tenemos la posibilidad de romper o finalizar un bucle antes de
que se cumpla la condición de parada.
Supongamos un ejemplo en el que estamos buscando el
primer número múltiplo de 3 yendo desde 20 hasta 1:
CONTROL DE FLUJO: Romper una sentencia WHILE
Python nos ofrece la posibilidad de detectar si el bucle ha
acabado de forma ordinaria o no.
Es decir, si ha finalizado por no cumplirse la condición
establecida.
Para ello podemos hacer uso de la sentencia else como parte
del propio bucle. Si el bucle while finaliza normalmente (sin
llamada a break) el flujo de control pasa a la sentencia
opcional else.
CONTROL DE FLUJO: Romper una sentencia WHILE
Veamos un ejemplo en el que tratamos de encontrar un
múltiplo de 9 en el rango [1,8] :
CONTROL DE FLUJO: Continuar una sentencia WHILE
Hay situaciones en las que, en vez de romper un bucle, nos
interesa saltar adelante hacia la siguiente repetición.
Para ello Python nos ofrece la sentencia continue que hace
precisamente eso, descartar el resto del código del bucle y
saltar a la siguiente iteración.
CONTROL DE FLUJO: Continuar una sentencia WHILE
Vamos a mostrar todos los números en el rango [1,20]
ignorando aquellos que sean múltiplos de 3:
CONTROL DE FLUJO: Bucle infinito
Si no establecemos correctamente la condición de parada o
bien el valor de alguna variable está fuera de control, es
posible que lleguemos a una situación de bucle infinito, del
que nunca podamos salir.
Veamos un ejemplo de esto:
CONTROL DE FLUJO: Bucle infinito
Para salir de él Ctrl+C
CONTROL DE FLUJO: Sentencia FOR
Se usa cuando sé el número de vueltas que he de dar o lo
hacemos sobre un tipo de datos que permite ser ITERABLE
(por ejemplo, cadenas de texto, listas, diccionarios, ficheros,...)
CONTROL DE FLUJO: Romper una sentencia FOR
Se usa cuando sé el número de vueltas que he de dar o lo
hacemos sobre un tipo de datos que permite ser ITERABLE
(por ejemplo, cadenas de texto, listas, diccionarios, ficheros,...)
CONTROL DE FLUJO: Sentencia FOR
CONTROL DE FLUJO: Sentencia FOR con secuencias de
números
Es muy habitual hacer uso de secuencias de números en
bucles.
Python no tiene una instrucción específica para ello.
Pero podemos hacer uso de la función range() que
devuelve un flujo de números en el rango especificado.
CONTROL DE FLUJO: Sentencia FOR con secuencias de
números
función range(start, stop, step):
● start: Es opcional y tiene valor por defecto 0.
● stop: es obligatorio (siempre se llega a 1 menos que este
valor).
● step: es opcional y tiene valor por defecto 1.
range() devuelve un objeto iterable, así que iremos obteniendo
los valores paso a paso con una sentencia for ... in
CONTROL DE FLUJO: Sentencia FOR con secuencias de
números
CONTROL DE FLUJO: Sentencia FOR con secuencias de
números
CONTROL DE FLUJO: Sentencia FOR con secuencias de
números
CONTROL DE FLUJO: Sentencia FOR un número de veces
Hay veces que no necesitamos usar la variable que toma
valores en el rango, sino que solo queremos repetir una
acción un número determinado de veces.
Para estos casos se suele recomendar usar el guión bajo _
como nombre de variable, que da a entender que no estamos
usando esta variable de forma explícita.
CONTROL DE FLUJO: Sentencia FOR un número de veces
CONTROL DE FLUJO: Bucles anidados
Igual que con el if, podemos necesitar meter unas
sentencias de control (bucles) dentro de otras.
CONTROL DE FLUJO: Bucles anidados
Los bucles anidados también se pueden aplicar en la sentencia
while.
TAREA
Escribir un programa en Python que acepte una cadena de
texto e indique si todos sus caracteres son alfabéticos.
Para comprobar si un carácter es alfabético disponemos de las
función char.isalpha()que nos devuelve VERDADERO si
el carácter es alfabético.
Debe salirse cuando encuentre el primero no alfabético y
mostrar cuál es.
TIPOS DE DATOS COMPLEJOS
Son estructuras de datos que resultan de combinar los tipos
de datos básicos.
Molécula-Estructura compuesta de varios átomos
Átomo-Estructura básica Consultar tutorial oficial
TIPOS DE DATOS COMPLEJOS: LISTAS
Nos van a permitir almacenar objetos:
○ mediante un orden definido
○ con posibilidad de duplicados
Son estructuras de datos mutables, es decir, podemos:
○ añadir,
○ eliminar
○ o modificar sus elementos
CREACIÓN DE LISTAS
Una lista está compuesta por cero o más elementos.
En Python debemos escribir estos elementos separados
por comas y dentro de corchetes.
Ejemplos:
TAREA
Crea una lista con los días de la semana y otra con los
meses del año.
CONVERSIÓN
Para convertir otros tipos de datos en una lista podemos
usar la función list():
CONVERSIÓN
Para convertir otros tipos de datos en una lista podemos
usar la función list():
LISTA VACÍA
Si a list()no le paso ningún argumento lo que tengo es
la lista VACÍA.
También podemos crearlo usando [] (más eficiente)
OPERACIONES CON LISTAS
Tiene un funcionamiento similar a lo que vimos con las
cadenas de texto
EXTRAER UN ELEMENTO
OPERACIONES CON LISTAS
RECORRER UNA LISTA
OPERACIONES CON LISTAS
RECORRER UNA LISTA
OPERACIONES CON LISTAS
TROCEAR UNA LISTA
OPERACIONES CON LISTAS
TROCEAR UNA LISTA
OPERACIONES CON LISTAS
INVERTIR UNA LISTA
Conservando la lista original:
Troceado de listas con step negativo: lista_compra[::-1]
Conservando la lista original:
Función reversed(): list(reversed(lista_compra)
Modificando la lista original:
Función reverse(): lista_compra.reverse()
OPERACIONES CON LISTAS
INVERTIR UNA LISTA
OPERACIONES CON LISTAS
AÑADIR AL FINAL DE UNA LISTA
Una de las operaciones más utilizadas en listas es añadir elementos al final de
las mismas. Para ello Python nos ofrece la función append().
Se trata de un método destructivo que modifica la lista original:
OPERACIONES CON LISTAS
CONSTRUIR UNA LISTA
En muchas ocasiones trabajaremos con una lista vacía que iremos rellenando.
Por ejemplo, quiero crear una lista con los números pares del 1 al 20.
OPERACIONES CON LISTAS
AÑADIR EN CUALQUIER POSICIÓN DE UNA LISTA
Usaremos la función insert() con el índice de inserción y el elemento que
queremos insertar. También es una función DESTRUCTIVA.
OPERACIONES CON LISTAS
REPETIR ELEMENTOS DE UNA LISTA
Con * igual que con las cadenas de caracteres.
OPERACIONES CON LISTAS
COMBINAR LISTA
Mediante los operadores + o +=
OPERACIONES CON LISTAS
COMBINAR LISTA
Mediante la función extend():
OPERACIONES CON LISTAS
COMBINAR LISTA
Mediante la función extend():
OPERACIONES CON LISTAS
COMBINAR LISTA
Mediante la función append():
OPERACIONES CON LISTAS
MODIFICAR UNA LISTA
De manera similar al acceso:
OPERACIONES CON LISTAS
MODIFICAR UNA LISTA
De manera similar al acceso:
OPERACIONES CON LISTAS
MODIFICAR UNA LISTA CON TROCEADO
De manera similar al acceso:
OPERACIONES CON LISTAS
BORRAR ELEMENTOS DE UNA LISTA
● Por su índice, mediante la función del().
● Por su valor, mediante la función remove().
Si existen valores duplicados, la función remove() sólo borrará la primera ocurrencia.
OPERACIONES CON LISTAS
BORRAR ELEMENTOS DE UNA LISTA
● Por su índice (con EXTRACCIÓN) mediante la función pop().
OPERACIONES CON LISTAS
BORRAR ELEMENTOS DE UNA LISTA COMPLETA
● Con la función CLEAR: lista_compra.clear()
● Reinicialización a vacío: lista_compra=[]
OPERACIONES CON LISTAS
ENCONTRAR UN ELEMENTO DE UNA LISTA
● Con la función index: lista_compra.index(‘Pan’)
Si buscamos un valor que existe más de una vez en una lista, la función index() sólo nos
devolverá el índice de la primera ocurrencia.
OPERACIONES CON LISTAS
OTRAS FUNCIONES DE UNA LISTA
● Pertenencia de un elemento (Booleano): ‘Aceite’ in lista_compra
● Número de veces que aparece un valor: lista_compra.count(‘Pan’)
● Ordenar una lista, conservando original: sorted(lista_compra)
● Ordenar una lista, modificando la original: lista_compra.sort()
● Ambos métodos admiten un parámetro «booleano» reverse para indicar si
queremos que la ordenación se haga en sentido inverso:
○ sorted(lista_compra, reverse=True)
● Longitud de una lista: len(lista_compra)
OPERACIONES CON LISTAS
OTRAS FUNCIONES DE UNA LISTA
● Iterar sobre una lista:
for product in lista_compra:
print(product)
● Iterar con enumeración:
for i, product in enumerate(lista_compra):
print(i, product)
● Iterar sobre múltiples listas en paralelo (ZIP):
TUPLAS
El concepto de tupla es muy similar al de lista.
Aunque hay algunas otras diferencias, lo fundamental es que, mientras
una lista es mutable y se puede modificar, una tupla no admite cambios
y por lo tanto, es inmutable.
coord_Marbella=(36.51543, -4.88583)
Reyes_Magos=('Melchor', 'Gaspar', 'Baltasar')
DESEMPAQUETADO DE TUPLAS
El desempaquetado es una característica de las tuplas que nos permite
asignar una tupla a variables independientes:
Reyes_Magos=('Melchor', 'Gaspar', 'Baltasar')
rey1, rey2, rey3=Reyes_Magos
DICCIONARIO
Podemos trasladar el concepto de diccionario de la vida real al de
diccionario en Python. Al fin y al cabo un diccionario es un objeto que
contiene palabras, y cada palabra tiene asociado un significado.
Haciendo el paralelismo, diríamos que en Python un diccionario es también
un objeto indexado por claves (las palabras) que tienen asociados unos
valores (los significados).
DICCIONARIO
DICCIONARIO
Para crear un diccionario usamos llaves {} rodeando asignaciones clave: valor
que están separadas por comas.
rae = {
'bifronte': 'De dos frentes o dos caras',
'anarcoide': 'Que tiende al desorden',
'montuvio': 'Campesino de la costa'
Las claves pueden ser cadenas de texto (han de ir entrecomilladas) o valores enteros.
DICCIONARIO con dict()
Acceso a los elementos DICCIONARIO
Acceso a los elementos DICCIONARIO con GET
Existe una función muy útil para «superar» los posibles errores de acceso por
claves inexistentes. Se trata de get() y su comportamiento es el siguiente:
● Si la clave que buscamos existe, nos devuelve su valor.
● Si la clave que buscamos no existe, nos devuelve None salvo que le
indiquemos otro valor por defecto, pero en ninguno de los dos casos
obtendremos un error.
Acceso a los elementos DICCIONARIO con GET
AÑADIR elementos DICCIONARIO
TAREA DICCIONARIO
Usando un diccionario, contar el número de veces que se repite cada letra en una
cadena de texto dada (puedes pedirla por teclado)
Obtener todos los elementos de un DICCIONARIO
Obtener todas las claves de un diccionario, mediante la función keys():
Obtener todos los elementos de un DICCIONARIO
Obtener todos los valores de un diccionario, mediante la función values():
Obtener todos los elementos de un DICCIONARIO
Obtener todos los pares «clave-valor» de un diccionario, mediante la función
items():
Otras funciones del DICCIONARIO
● Número de elementos («clave-valor») de un diccionario: función len()
● …
TAREA 5
1. Investigar sobre otras funciones para trabajar con diccionarios
2. Hacer un ejemplo donde se usen
TAREA de ampliación
Hay un tipo de dato que no hemos definido, CONJUNTO.
Investiga sobre él:
1. Cómo lo defino.
2. Cómo itero sobre sus elementos.
3. Operaciones con conjuntos.
4. Funciones que me permiten trabajar con conjuntos.
FUNCIONES
En este tiempo hemos trabajado con funciones pero, ¿cómo puedo hacer mis
propias funciones?
https://www.freecodecamp.org/espanol/news/guia-de-funciones-de-python-con
-ejemplos/
FUNCIONES
Una función permite
definir un bloque de
código reutilizable que se
puede ejecutar muchas
veces dentro de tu
programa.
Lo que reducirá
considerablemente el
número total de líneas de
código en tu proyecto.
FUNCIONES: Sintaxis
● La palabra clave def
● Un nombre de función
● Paréntesis ’()’, y dentro de los paréntesis los parámetros
de entrada (aunque son opcionales)
● Dos puntos ’:’
● Algún bloque de código para ejecutar
● Una sentencia de retorno (opcional)
FUNCIONES (sin parámetros o retorno de valores)
FUNCIONES (con parámetros)
FUNCIONES
FUNCIONES (con varios parámetros y sentencia de retorno)
ÁMBITO DE LAS VARIABLES
El ámbito de una variable es el contexto en el que existe esa variable.
Así, una variable existe en dicho ámbito a partir del momento en que
se crea y deja de existir cuando desaparece su ámbito.
Además, las variables son accesibles solo desde su propio ámbito, pero
con alguna excepción, como veremos más adelante.
ÁMBITO DE LAS VARIABLES
Los principales tipos de ámbitos en Python son dos:
Ámbito local: corresponde con el ámbito de una función, que existe desde que se
invoca a una función hasta que termina su ejecución. En un programa, el ámbito
local corresponde con las líneas de código de una función.
Cada función tiene su ámbito local. No se puede acceder a las variables de una
función desde fuera de esa función o desde otra función.
Ámbito global: corresponde con el ámbito que existe desde el comienzo de la
ejecución de un programa. Todas las variables definidas fuera de cualquier función
corresponden al ámbito global, que es accesible desde cualquier punto del
programa, incluidas las funciones. Si desde un módulo A importamos un módulo B
mediante un import, desde A podremos acceder a las variables globales de B.
Variables locales
Se definen dos funciones, cada una de las cuales posee su ámbito local.
Las variables y parámetros definidos dentro de cada una de ellas son solo
accesibles desde su ámbito.
El error NameError
Si intentamos acceder al valor de una variable local desde el cuerpo principal del programa o,
en general, a una variable que no ha sido definida obtendremos un error: NameError.
Al ejecutar el código anterior se nos
mostrará el saludo por pantalla
debido a la llamada a la función
saludar. Después, al intentar
mostrar el valor de la variable
saludo desde el cuerpo principal del
programa, Python nos “obsequiará”
con el mensaje NameError: name
'saludo' is not defined.
Variables globales
Las variables globales en Python son aquellas definidas en el cuerpo
principal del programa fuera de cualquier función.
Son accesibles desde cualquier punto del programa, incluso desde
dentro de funciones.
También se puede acceder a las variables globales de otros
programas o módulos importados.
Tarea 6: Funciones
Crea una función con alguno de los ejercicios que hemos hecho antes y ejecútala.
Módulo TURTLE
En 1967 Wally Feurzeig y Seymour Papert
crearon Logo, un lenguaje de programación
con fines educativos. Ese lenguaje incluía las
llamadas "gráficas tortuga".
La "tortuga" de Logo es un cursor al que se le
pueden dar órdenes de movimiento (avance,
retroceso o giro) y que puede ir dejando un
rastro sobre la pantalla. Moviendo
adecuadamente la tortuga se pueden
conseguir dibujar todo tipo de figuras.
Módulo TURTLE
Para utilizar el módulo turtle sólo hace falta importarlo:
● Si se va a escribir código no orientado a objetos:
from turtle import *
● Si se va a escribir código orientado a objetos:
import turtle
Consultar los métodos disponibles para Turtle y Screen
en Manual de Python
Módulo TURTLE
Módulo TURTLE
Módulo TURTLE
Instrucciones con ejemplos
Tarea 7: Dibujo con Turtle
Realiza un dibujo usando la tortuga y explica en
cada instrucción qué hace (utiliza los comentarios
de Python)
TAREA de ampliación 3
Investigar sobre el trabajo con ficheros en Python
MÁS INFORMACIÓN SOBRE PYTHON
● Documentación oficial Python
● Guías de Python para principiantes
● Libros de Python
● Python intermedio