1. Conceptos básicos

1.1. ¿Qué es Python?

Python es un lenguaje de programación interpretado, multiparadigma y de tipado dinámico.

1.2. Breve historia de Python

  • Python fue creado a finales de los años 80 por Guido van Rossum.

  • Guido van Rossum quería diseñar un lenguaje de programación sencillo, legible y versátil.

  • Python en un lenguaje de programación muy popular[1] utilizado en una amplia variedad de aplicaciones como desarrollo web, ciencia de datos y machine learning, entre otras.

1.3. Estado de las versiones de Python

  • En el momento de escribir este tutorial, la última versión estable es Python 3.13.2 (Release date: 2025-02-04).

Estado de las versiones de Python
Figura 1. Estado de las versiones de Python. Imagen obtenida de Python Developer’s Guide

Los estados de las versiones son:

  • end-of-life: El ciclo de vida de la versión está congelado, no se pueden realizar más cambios en ella.

  • security: Solo se aceptan correcciones de seguridad y no se lanzan más binarios, aunque se pueden lanzar nuevas versiones solo con el código fuente.

  • bugfix: Se aceptan correcciones de errores y correcciones de seguridad, pero aún se lanzan nuevos binarios. También se llama modo de mantenimiento o versión estable.

  • feature: Se aceptan nuevas características, correcciones de errores y correcciones de seguridad.

1.4. Python es un lenguaje interpretado

Java
  • Java es un lenguaje compilado e interpretado.

  • En Java, es necesario compilar el código fuente para obtener un archivo .class que contiene el bytecode que será interpretado por la JVM (Java Virtual Machine).

javac HelloWorld.java (1)
java HelloWorld (2)
1 Compilamos el código fuente con javac para obtener un archivo .class (bytecode).
2 Ejecutamos el bytecode en la JVM.
Python
  • Pyton es un lenguaje interpretado.

  • Podemos ejecutar directamente el código sin necesidad de compilarlo.

  • El intérprete oficial de Python es CPython, aunque existen otros como: PyPy, Jython, IronPython o MicroPython, entre otros.

python hello.py

1.5. Python es un lenguaje multiparadigma

Java
  • Java utiliza un paradigma orientado a objetos.

  • El código se organiza en clases y métodos.

  • Es necesario el método main() como punto de entrada.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("¡Hola, mundo!");
    }
}
Python
  • Python es un lenguaje multiparadigma.

  • Es compatible con programación estructurada, orientada a objetos y funcional.

  • Puedo ejecutar código sin tener que crear una clase.

print("¡Hola, mundo!")

1.6. Python utiliza tipado dinámico

Java
  • Utiliza un tipado estático. Es necesario definir los tipos de datos de las variables antes de ser utilizadas.

Python
  • Utiliza un tipado dinámico. Los tipos de datos de las variables se determinan en tiempo de ejecución.

1.7. Python es menos verboso

Java
  • Requiere escribir más líneas de código para tareas sencillas.

  • Es obligatorio finalizar las instrucciones con ;.

import java.util.Scanner;

public class Hello {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("¿Cómo te llamas? ");
        String name = scanner.nextLine();
        System.out.println("¡Hola, " + name + "! Bienvenido a Java.");
    }
}
Python
  • Es mucho más sencillo.

  • Es opcional finalizar las instrucciones con ;.

name = input("¿Cómo te llamas? ")
print(f"¡Hola, {name}! Bienvenido a Python.")

1.8. Python no usa llaves

Java
  • Utiliza llaves {} para delimitar bloques de código.

public class Suma {
    public static void main(String[] args) {
        int suma = 0;
        for (int i = 1; i <= 100; i++) {
            suma += i;
        }
        System.out.println("La suma es: " + suma);
    }
}
Python
  • Utiliza la indentación para delimitar bloques de código.

suma = 0
for numero in range(1, 101):
    suma += numero
print(f"La suma es: {suma}")

1.9. Guías de estilo

Java
  • Una de las guías de estilo de Java más popular es la de Google.

Python
  • La guía de estilo oficial de Python es la PEP 8.

2. Configuración del entorno de desarrollo

2.1. Instalación de Python

  • Descarga Python desde la página oficial: Python.org.

2.2. IDEs recomendados

En este curso utilizaremos: Visual Studio Code y Google Colab.

2.3. Visual Studio Code

qs python ext install
Figura 2. Instalación de la extensión de Python en VS Code. Imagen obtenida de la página oficial de VS Code.

Interfaz de usuario de Visual Studio Code

Después de instalar la extesión de Python en Visual Studio Code le aparercerán las siguientes funcionalidades en la interfaz de usuario.

ui tour
Figura 3. Descripción de la interfaz gráfica de VS Code. Imagen obtenida de la página oficial de VS Code.
  • A: Permite ejecutar y depurar código Python.

  • B: Permite configurar tests para nuestro proyecto Python.

  • C: Permite definir breakpoints para depurar nuestro código.

  • D: Permite crear un nuevo termimal.

  • E: Muestra el lenguaje de programación del archivo actual.

  • F: Permite seleccionar el intérprete de Python que queremos utilizar.

  • G: Permite ejecutar el el código actual.

Paleta de comandos

Abre la paleta de comandos con Ctrl + Shift + P (Linux y Windows) o Cmd + Shift + P (macOS), y escribe Python para ver cuáles son las opciones disponibles.

cmd plt v2
Figura 4. Paleta de comandos de VS Code. Imagen obtenida de la página oficial de VS Code.

Configurar nuestro Workspace

Antes de iniciar Visual Studio Code

Para configurar nuestro workspace antes de iniciar Visual Studio Code podemos seguir los siguientes pasos:

  • Crea un nuevo directorio para tu proyecto.

  • Abre Visual Studio Code y selecciona el directorio creado.

  • Crea un nuevo archivo con extensión .py y comienza a escribir tu código.

Ejemplo:

mkdir proyecto
cd proyecto
code .
Desde la interfaz de usuario de iniciar Visual Studio Code

También puede configurar su workspace desde la interfaz de usuario de VS Code accediendo a File > Open Folder para seleccionar la carpeta de su proyecto.

workspace file open folder

3. Entornos virtuales

3.1. ¿Qué es un entorno virtual en Python?

Es un espacio aislado que permite instalar dependencias específicas para un proyecto, evitando conflictos con otros proyectos que estén en la misma máquina o con la configuración global de Python del sistema.

Cuando instalamos el intérprete de Python en nuestro sistema se instala el módulo venv que es el que nos permite crear entornos virtuales.

3.2. ¿Qué contiene un entorno virtual?

  • Scripts para activar el entorno virtual.

  • Enlaces simbólicos al intérprete Python que hemos seleccionado para este entorno.

  • Scripts para utilizar el gestor de paquetes pip.

  • El directorio site-packages que es donde se instalarán las dependencias de nuestro proyecto.

Ejemplo:

.venv/
├── .gitignore
├── bin
│   ├── Activate.ps1
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── pip
│   ├── pip3
│   ├── pip3.13
│   ├── python -> python3.13
│   ├── python3 -> python3.13
│   └── python3.13 -> /Library/Frameworks/Python.framework/Versions/3.13/bin/python3.13
├── include
│   └── python3.13
├── lib
│   └── python3.13
│       └── site-packages
└── pyvenv.cfg

Ejemplo:

En este ejemplo se muestran dos proyectos que utilizan entornos virtuales para gestionar diferentes versiones del intérprete de Python y Flask.

# Proyecto A (usa Python 3.11 y Flask 2.2.1)
proyectoA/
  ├── .venv/  # Entorno virtual
      └── bin/python3.11
      └── lib/python3.11/site-packages/flask-2.2.1.dist-info
      └── ...
  └── requirements.txt
  └── ...

# Proyecto B (usa Python 3.13 y Flask 3.1.0)
proyectoB/
  ├── .venv/  # Entorno virtual
      └── bin/python3.13
      └── lib/python3.13/site-packages/flask-3.1.0.dist-info
      └── ...
  └── requirements.txt
  └── ...

3.3. Crear un entorno virtual

python -m venv mi-entorno

En este ejemplo se ha utilizado mi-entorno como nombre del entorno virtual, pero puede utilizar cualquier otro nombre.

Es una buena práctica utilizar el nombre .venv para el entorno virtual.

3.4. Activar un entorno virtual

El script activate modifica algunas variables de entorno (PATH, VIRTUAL_ENV_PROMPT, PS1) y define en el shell la función deactivate para poder revertir los cambios.

Activar un entorno virtual en Linux o macOS.

source mi-entorno/bin/activate

Activar un entorno virtual en Windows (CMD).

mi_entorno\Scripts\activate.bat

Activar un entorno virtual en Windows (PowerShell).

.\mi-entorno\Scripts\Activate.ps1

Puede ser que en Windows necesite habilitar la ejecución de scripts en PowerShell.

Si le aparece un error de política de ejecución ejecute el siguiente comando:

Set-ExecutionPolicy Unrestricted

Referencia:

Cuando haya activado el entorno virtual, el nombre del entorno aparecerá en el prompt de la terminal entre paréntesis al inicio de la línea de comandos.

Ejemplo:

(mi-entorno) /home/josejuan/proyecto$

3.5. Desactivar un entorno virtual

deactivate

Este comando es una función de shell que se carga en memoria al activar el entorno virtual. Esta función permite revertir los cambios realizados en las variables de entorno que se realizaron con activate.

3.6. Cómo gestionar los entornos virtuales en Visual Studio Code

  • Abra la paleta de comandos con Ctrl + Shift + P (Linux y Windows) o Cmd + Shift + P (macOS).

  • Escriba Python: Create Environment.

  • Le aparecerá una lista de tipos entornos disponibles: Venv o Conda. En nuestro caso seleccionaremos Venv.

create environment dropdown
Figura 5. Tipos de entornos virtuales disponibles. Imagen obtenida de la página oficial de VS Code.

Ahora le aparecerá una lista con los intérpretes de Python disponibles en su sistema y tendrá que seleccionar el intérprete que desea utilizar para su proyecto.

interpreters list
Figura 6. Lista de intérpretes de Python disponibles. Imagen obtenida de la página oficial de VS Code.

Cuando seleccione el intérprete se creará automáticamente un entorno virtual con el nombre .venv dentro del directorio de su proyecto.

Para comprobar cuál es el entorno virtual activo, puede consultar la esquina inferior derecha de la interfaz de usuario de Visual Studio Code.

ui tour venv

4. Gestión de paquetes

El gestor de paquetes de Python es pip.

Los paquetes de Python se pueden descargar desde el repositorio oficial de Python, PyPI o desde otros repositorios.

4.1. Instalar un paquete

pip install nombre_paquete

Ejemplo:

Para instalar el paquete NumPy para trabajar con arrays multidiemensionales ejecutaremos:

pip install numpy

Para instalar el paquete Flask que contiene un microframework para crear aplicaciones web ejecutaremos:

pip install flask

4.2. Desinstalar un paquete

pip uninstall nombre_paquete

4.3. Listar paquetes instalados

Obtener un listado de los paquetes instalados en forma de tabla.

pip list

Ejemplo:

>>> pip list

Package      Version
------------ -------
blinker      1.9.0
click        8.1.8
Flask        3.1.0
itsdangerous 2.2.0
Jinja2       3.1.5
MarkupSafe   3.0.2
pip          25.0.1
Werkzeug     3.1.3

Obtener un listado de los paquetes instalados en formato paquete==versión.

pip freeze

Ejemplo:

>>> pip freeze

blinker==1.9.0
click==8.1.8
Flask==3.1.0
itsdangerous==2.2.0
Jinja2==3.1.5
MarkupSafe==3.0.2
Werkzeug==3.1.3

4.4. Crear un archivo requirements.txt

pip freeze > requirements.txt

Crea un archivo requirements.txt que contiene una lista de todos los paquetes instalados en el entorno de Python actual, junto con sus versiones exactas. Este archivo es útil para poder replicar el entorno en otro sistema.

4.5. Instalar paquetes desde un archivo requirements.txt

Instalar paquetes desde un archivo requirements.txt.

pip install -r requirements.txt

5. Ejecución de código Python

5.1. Ejecución de código desde el REPL

¿Qué es el REPL?

REPL (Read-Eval-Print Loop) es una herramienta interactiva que permite ejecutar código Python de forma interactiva ejecutando el código línea a línea.

  • Read: Lee el código que escribes.

  • Eval: Ejecuta el código.

  • Print: Muestra el resultado.

  • Loop: Repite el proceso en bucle.

Esta herramienta es muy útil para:

  • Probar fragmentos de código rápidamente.

  • Aprender sintaxis o funciones nuevas.

  • Depurar pequeños fragmentos de código.

¿Cómo acceder al REPL?

Desde una terminal, ejecuta el comando python, python3 o py (Windows).

Te aparecerá un mensaje de bienvenida con la versión del intérprete de Python y el prompt >>>.

$ python

Python 3.13.1 (v3.13.1:06714517797, Dec  3 2024, 14:00:22) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Una vez que estés en el REPL puedes escribir el código Python que quieras ejecutar.

>>> print("Hello world!")
Hello world!

Para salir del REPL, puedes presionar Ctrl + D o escribir exit() o quit().

5.2. Ejecución de código desde un archivo en la terminal

La forma más habitual de trabajar con Python será escribir nuestro código en un archivo y ejecutarlo desde la terminal.

Para ello, sigue estos pasos:

  • Abre tu editor de código favorito.

  • Escribe el código Python que quieras ejecutar.

  • Guarda el archivo con la extensión .py.

  • Abre una terminal y sitúate en la carpeta donde guardaste el archivo.

  • Ejecuta el archivo con el comando python o python3 seguido del nombre del archivo.

Ejemplo:

Creamos el archivo hello.py con el siguiente contenido.

print("Hello world!")

Ejecutamos el archivo desde la terminal.

$ python hola_mundo.py
Hello world!

5.3. Ejecución de código desde un archivo en Visual Studio Code

También podemos ejecutar nuestro código Python directamente desde la interfaz de Visual Studio Code.

En la parte superior derecha de la interfaz hay un botón de Run que nos permite ejecutar el código. Cuando lo pulsamos, se abrirá una terminal en la parte inferior de la interfaz y se mostrará el resultado de la ejecución.

run python vscode

6. Funciones integradas

builtin functions
Figura 7. Funciones integradas en Python. Imagen obtenida de 30-Days-Of-Python de Asabeneh.

En la documentación oficial de Python puede encontrar una descripción detallada de cada una de las funciones integradas en Python.

Veamos algunos ejemplos de algunas funciones:

  • print(): Imprime un mensaje en la consola.

  • help(): Muestra la documentación de un objeto.

  • type(): Muestra el tipo de un objeto.

  • dir(): Muestra la lista de atributos y métodos de un objeto.

  • int(): Convierte un valor a entero.

  • float(): Convierte un valor a número real.

  • str(): Convierte un valor a cadena.

Ejemplo:

>>> print("Hello world!")
Hello world!

>>> help(int)

>>> type('Cadena')
<class 'str'>

>>> type(10)
<class 'int'>

>>> type(2.5)
<class 'float'>

>>> type(True)
<class 'bool'>

>>> int(10.5)
10

>>> float(1)
1.0

>>> str(1)
'1'

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

7. Palabras reservadas

Para obtener la lista de palabras reservadas en Python, puede ejecutar el comando help('keywords') en el intérprete de Python.

>>> help('keywords')

Here is a list of the Python keywords.  Enter any keyword to get more help.

False               class               from                or
None                continue            global              pass
True                def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield
break               for                 not

8. Comentarios

Java

En Java se pueden utilizar los caracteres // para comentarios de una línea y /* */ para comentarios de múltiples líneas y una línea.

// Comentario de una una línea

a = 10 // Esto es un comentario inline

/* Esto es
   un comentario
   de múltiples
   líneas */

/* También se pueden utilizar para una sola línea */
Python

En Python se utiliza el carácter # para hacer comentarios.

Python permite utilizar los caracteres """ """ o ''' ''' para realizar comentarios de múltiples líneas.

A estas cadenas se les conoce como docstrings y se suelen utilizar para documentar funciones, clases, métodos o módulos.

# Esto es un comentario de una línea

a = 10  # Esto es un comentario inline

# Esto es un comentario
# de múltiples líneas

"""
También podemos escribir comentarios
de múltples líneas así.
"""

'''
O utilizando
comillas simples
'''

def suma(a, b):
    """
    Esto es un comentario de múltiples líneas que se utiliza para
    documentar funciones, clases, métodos o módulos.
    Son conocidos como docstrings.
    """
    return a + b

9. Tipos de datos y variables

La guía de estilo oficial de Python PEP 8 recomienda utilizar la siguiente notación:

  • snake_case para nombres de variables, funciones y métodos.

  • CamelCase para nombres de clases.

Ejemplo:

# Variables en snake_case
nombre_usuario = "Pepe"
saldo_cuenta = 1500.50

# Clase en CamelCase
class Persona:
    pass

9.1. Declaración de variables: tipado estático vs. dinámico

Java: Tipado estático

En Java, se debe declarar el tipo de una variable al momento de definirla.

int edad = 25;
String nombre = "Pepe";
double salario = 1800.50;
Python: Tipado dinámico

En Python, no es necesario declarar el tipo de la variable, se asigna automáticamente según el valor.

edad = 25
nombre = "Pepe"
salario = 1800.50

9.2. Tipos de datos básicos: enteros, reales, cadenas, booleanos

Java: Tipos primitivos
  • Enteros: int, short, long, byte

  • Reales: float o double

  • Complejos: No está implementado como tipo de dato primitivo.

  • Cadenas: String

  • Booleanos: boolean

Python: Tipos básicos
  • Enteros: int

  • Reales: float

  • Complejos: complex

  • Cadenas: str

  • Booleanos: bool

Ejemplo:

# Declaración de variables
numero_entero = 10
numero_real = 3.14
numero_complejo = -1.23 + 4.5j
cadena = "Hola"
es_par = True

# Verificación de tipos
print(type(numero_entero))      # <class 'int'>
print(type(numero_real))        # <class 'float'>
print(type(numero_complejo))    # <class 'complex'>
print(type(cadena))             # <class 'str'>
print(type(es_par))             # <class 'bool'>

# None es un valor especial que equivale a null en Java
# None es una instancia de la clase NoneType
a = None
print(type(a))                  # <class 'NoneType'>

Todos los tipos de datos de Python son clases, no existen los tipos primitivos como en Java.

Pruebe a ejecutar la función dir(int) para ver los métodos disponibles para el tipo int.

Puede hacer lo mismo con el resto de tipos de datos: int, float, complex, str, bool.

9.3. Tipos de datos disponibles

La lista de tipos de datos disponibles en Python es la siguiente:

Categoría Tipos

Tipos booleanos

  • bool

Tipos de datos numéricos

  • int

  • float

  • complex

Cadenas de caracteres

  • str

Tipos de secuencias

  • list

  • tuple

  • range

Tipos de secuencias binarias

  • bytes

  • bytearray

  • memoryview

Tipos mapa (Diccionario)

  • dict

Conjuntos

  • set

  • frozenset

Referencia:

9.4. Todos los valores son objetos

En Python, todos los valores son objetos, son instancias de una clase y todas heredan de la clase object.

>>> cadena = "Hola"
>>> isinstance(cadena, object)
True

>>> isinstance("Hola", object)
True
>>> isinstance(10, object)
True
>>> isinstance(7.5, object)
True
>>> isinstance(True, object)
True

>>> isinstance(10, int)
True
>>> isinstance(10, float)
False

>>> (3).is_integer()
True
>>> "Hola".upper()
'HOLA'

9.5. Más sobre variables en Python

Una variable es una etiqueta que apunta a un objeto en memoria.

Recuerda que las variables en Python son referencias, que no tienen un tipo de dato asociado, sino que el tipo de dato está asociado al objeto al que apunta.

python var1
Figura 8. Ejemplo de una variable apuntando a un objeto en memoria. Imagen obtenida de Python Programming de Josiah Wang.

Ejemplo:

En este ejemplo vamos a utilizar la función id() para obtener la dirección de memoria de un objeto.

>>> x = 5
>>> id(x)
4559587432
>>> id(5)
4559587432
>>> type(x)
<class 'int'>
>>> type(5)
<class 'int'>

>>> y = x
>>> id(y)
4559587432
>>> y = 10
>>> id(y)
4559587592

9.6. Objetos mutables e inmutables

En Python, los objetos se clasifican en dos categorías:

  • Mutables: Pueden cambiar su contenido después de haber sido creados.

    • Tipos de datos mutables: list, dict, set, bytearray.

  • Inmutables: No pueden cambiar su contenido después de haber sido creados.

    • Tipos de datos inmutables: int, float, complex, str, tuple, frozenset, bool.

Ejemplo de objeto inmutable:

En este ejemplo, la variable x es de tipo int que es un tipo inmutable. Cuando modificamos el valor de x, Python crea un nuevo objeto en memoria y actualiza la referencia de la variable x.

# Creamos una variable de tipo entero
>>> x = 5
>>> type(x)
<class 'int'>

# Consultamos la dirección de memoria de x
>>> id(x)
4394825832

# Modificamos el valor de la variable x
>>> x = 10

# Volvemos a consultar la dirección de memoria y vemos que ha cambiado
>>> id(x)
4394825992

Ejemplo de objeto mutable:

En este ejemplo, la variable lista es de tipo list que es un tipo mutable. Por lo tanto, cuando modificamos el contenido de la lista, la dirección de memoria no cambia.

# Creamos una lista
>>> lista = [1, 2, 3]

# Consultamos la dirección de memoria de la lista
>>> id(lista)
4402171904

# Modificamos el contenido de la lista
>>> lista.append(4)

# Consultamos la dirección de memoria de la lista
>>> id(lista)
4402171904

10. Cadenas

Las cadenas en Python pueden ir encerradas entre comillas simples (') o dobles (").

Veamos algunas operaciones comunes que podemos realizar con cadenas.

nombre = "Pepe"
print(nombre)

nombre = 'Pepe'
print(nombre)

10.1. Cadenas multilínea

Podemos crear cadenas multilínea utilizando tres comillas simples o dobles.

cadena_multilnea = """Esto es un ejemplo
de una cadena multilínea."""
print(cadena_multilnea)

cadena_multilnea = '''Esto es un ejemplo
de una cadena multilínea.'''
print(cadena_multilnea)

10.2. Concatenación de cadenas

Podemos concatenar cadenas utilizando el operador +.

nombre = "Pepe"
apellido = "Pérez"
nombre_completo = nombre + " " + apellido
print(nombre_completo)

10.3. Operaciones con cadenas

cadena = "seminario de Python para desarrolladores Java"

# Longitud de la cadena
len(cadena)

# Devuelve la cadena en mayúsculas pero no modifica la cadena
cadena.upper()

# Devuelve la cadena en minúsculas pero no modifica la cadena
cadena.lower()

# Devuelve la primera letra en mayúscula pero no modifica la cadena
cadena.capitalize()

# Devuelve una nueva cadena reemplazando una subcadena pero no modifica la original
cadena.replace("thon", "tón")

# Devuelve una lista de cadenas separadas por un delimitador.
# Si no se indica el delimitador, se utiliza el espacio por defecto
cadena.split()

cadena = "     Seminario de Python     "

# Devuelve una cadena eliminando los espacios en blanco al principio y al final
cadena.strip()

# Podemos utilizar varios métodos encadenados
cadena = "  valor1;valor2;valor3;valor4   "

cadena.strip().split(";")

10.4. Actividades

Ejercicio 1

Extrae el nombre de usuario y la contraseña de la siguiente cadena:

"usuario:admin|contraseña:1234"

Pista: Puedes utilizar la función split().

Ejercicio 2

Extrae el valor numérico como float (1500.5) de la siguiente cadena:

"  Precio: 1,500.50€  "

Pista: Puedes utilizar las funciones strip(), split(), replace() y float().

11. Colecciones

Tipo de Colección Descripción

Lista

  • Ordenada y modificable

  • Permite duplicados

  • Elementos de distintos tipos

Tupla

  • Ordenada e inmutable

  • Permite duplicados

  • No acepta cambios después de su creación

Diccionario

  • Desordenado y modificable

  • Claves únicas e inmutables

  • Almacena pares clave-valor

Conjunto

  • Desordenado y no indexado

  • Sin elementos duplicados

  • Se pueden añadir/eliminar elementos

11.1. Listas

Una lista en Python es una colección de elementos que se pueden ordenar, que pueden ser de diferentes tipos de datos y que se pueden modificar.

Java:

Uso de ArrayList.

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> lista = new ArrayList<>();
        lista.add("Uno");
        lista.add("Dos");
        lista.add("Tres");
        System.out.println(lista);
    }
}
Python:

Uso de list.

lista = ["Uno", "Dos", "Tres"]
print(lista)

type(lista)         # <class 'list'>

Diferencias clave:

  • En Python, las listas son un tipo de dato integrado, mientras que en Java se necesita importar ArrayList.

Cómo crear una lista

# Crea una lista vacía
lista = list()

# También se puede crear así
lista = []

# Inicializar una lista con valores
lista = [1, 2, 3, 4]

# Las listas pueden almacenar diferentes tipos de datos
lista = [1, "Dos", 3.0, True, [1, 2, 3]]

Consultar el tamaño de la lista

Para consultar el tamaño de una lista podemos utilizar la función len.

print(len(lista))

Cómo acceder a los elementos de una lista

Las listas empiezan en el índice 0.

list index
Figura 9. Imagen obtenida de 30-Days-Of-Python.
lista = ['banana', 'orange', 'mango', 'lemon']

# Accedemos al primer elemento
print(lista[0])

# Acceso al último elemento
last_index = len(lista) - 1
print(lista[last_index])

# Accedemos a un elemento de una lista anidada
lista = [1, "Dos", 3.0, True, [1, 2, 3]]
print(lista[4][0])
print(lista[4][1])
print(lista[4][2])

También podemos utilizar índices negativos para acceder a la lista desde el final.

list negative indexing
Figura 10. Imagen obtenida de 30-Days-Of-Python.

En este caso el último elemento de la lista tendrá el índice -1, el penúltimo el -2 y así sucesivamente.

lista = ['banana', 'orange', 'mango', 'lemon']

# Accedemos al último elemento
print(lista[-1])

# Accedemos al penúltimo elemento
print(lista[-2])

Modificar elementos de una lista

Las listas son tipos de datos mutables, por lo que podemos modificar sus elementos.

lista = ['banana', 'orange', 'mango', 'lemon']

lista[0] = 'apple'

print(lista)

Slicing

Python nos permite obtener una parte de la lista utilizando la técnica de slicing.

La sintaxis es la siguiente:

lista[inicio:fin:incremento]

Donde:

  • inicio: Es el índice donde comienza el slice (incluido).

  • fin`: Es el índice donde termina el slice (excluido).

  • paso: Es el intervalo entre elementos (opcional, por defecto 1).

slicing
Figura 11. Ejemplos de slicing. Imagen obtenida de 'Computing with Python' de Claus Führer.

Ejemplos:

lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# Devuelve todos los elemntos de la lista
lista[:]

# Devuelve los elementos desde el índice 2 al 5
print(lista[2:6])

# Devuelve desde el primer elemento hasta el índice 5
print(lista[:6])

# Devuelve dese el primer hasta el último de dos en dos
print(lista[::2])

# Devuelve desde el índice -3 hasta el final
print(lista[-3:])

# Devuelve la lista en orden inverso
print(lista[::-1])

Cómo añadir elementos a una lista

lista = ['banana', 'orange', 'mango', 'lemon']

lista.append('apple')
lista.append('kiwi')
lista.apend('grape')

Cómo insertar elementos en una posición de la lista

lista = ['banana', 'orange', 'mango', 'lemon']

lista.insert(1, 'apple')
lista.insert(3, 'kiwi')

Cómo eliminar un elemento de la lista

lista = ['banana', 'orange', 'mango', 'lemon']

# Elminamos un elemento de una posición determinada
del lista[1]

# Devuelve y elimina el último elemento de la lista
lista.pop()

Eliminar elementos por su valor

lista = ['banana', 'orange', 'mango', 'lemon']

lista.remove('orange')

Ordenar una lista

El método sort() ordena la lista y modifica su valor.

lista = ['banana', 'orange', 'mango', 'lemon']

lista.sort()

Sin embargo, si utlizamos la función sorted mostrará la lista ordenada pero no modificará la lista original.

lista = ['banana', 'orange', 'mango', 'lemon']

# Muestra la lista ordenada pero no la modifica
print(sorted(lista))

# Muestra la lista como estaba
print(lista)

Invertir el orden de una lista

lista = ['banana', 'orange', 'mango', 'lemon']

lista.reverse()

print(lista)

Concatenar listas

lista = ['banana', 'orange', 'mango', 'lemon']

lista = lista + [4, 5, 6]

print(lista)

vegetables = ['potato', 'tomato', 'cucumber']

lista = lista + vegetables

print(lista)

Copiar listas

lista = ['banana', 'orange', 'mango', 'lemon']

# Si hacemos una asignación directa, ambas variables apuntarán a la misma lista
copia = lista

# Podemos comprobarlo consultando la dirección de memoria a la que apuntan
print(id(lista))
print(id(copia))

# Hacmos un copia real de la lista
copia = lista.copy()

# Comprobamos la dirección de memoria a la que apuntan
print(id(lista))
print(id(copia))

Suma, media, máximo y mínimo

temperaturas = [25, 30, 35, 40]

# Suma de los elementos
print(sum(temperaturas))

# Media
media = sum(temperaturas) / len(temperaturas)
print(media)

# Máximo
print(max(temperaturas))

# Mínimo
print(min(temperaturas))

11.2. Tuplas

Una tupla es una colección de objetos que pueden ser de diferentes tipos de datos. Esta colección está ordenada y es inmutable.

No se pueden modificar sus elementos una vez que se han definido.

tupla = ('banana', 'orange', 'mango', 'lemon')

# No se puede modificar
tupla[0] = 'apple'

#Traceback (most recent call last):
#  File "<python-input-117>", line 1, in <module>
#    lista[0] = 'apple'
#    ~~~~~^^^
#TypeError: 'tuple' object does not support item assignment

Convertir una tupla en una lista

tupla = ('banana', 'orange', 'mango', 'lemon')

print(type(tupla))         # <class 'tuple'>

lista = list(tupla)

print(type(lista))         # <class 'list'>

Puede encontrar más información sobre cómo trabajar con tuplas en la siguiente URL:

11.3. Diccionarios

Un diccionario es una colección de pares clave-valor, desordenados y modificables.

Las claves deben ser únicas e inmutables.

Java:

Uso de HashMap.

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Double> diccionario = new HashMap<>();
        diccionario.put("almeria", 22.5);
        diccionario.put("granada", 23.7);
        diccionario.put("malaga", 21.9);

        System.out.println(diccionario);
        System.out.println("Valor asociado a 'almeria': " + diccionario.get("almeria"));

        diccionario.remove("malaga");
        System.out.println(diccionario);
    }
}
Python:

Uso de dict.

diccionario = {"almeria": 22.5, "granada": 23.7, "malaga": 21.9}
print(diccionario)

# Acceder a un valor del diccionario por su clave
print("Valor asociado a 'almeria':", diccionario["almeria"])

# Eliminar un elemento del diccionario
del diccionario["malaga"]
print(diccionario)

Cómo crear un diccionario

# Creamos un diccionario vacío
usuario = {}

# Creamos un diccionario con valores
usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

# Accedemos a los valores del diccionario a través de su clave
print(usuario["nombre"])
print(usuario["apellido1"])
print(usuario["apellido2"])
print(usuario["edad"])

Acceder a los elementos de un diccionario

usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

# Accedemos a los valores del diccionario a través de su clave
print(usuario["nombre"])
print(usuario["apellido1"])
print(usuario["apellido2"])
print(usuario["edad"])

Añadir nuevos elementos a un diccionario

Podemos añadir nuevos pares de clave-valor al diccionario de una forma muy sencilla.

usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

# Creamos un nuevo par de clave-valor
usuario["email"] = "pepe@ual.es"

print(usuario)

Modificar elementos de un diccionario

usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

usuario["edad"] = 21

print(usuario)

Eliminar un elemento de un diccionario

usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

del usuario["edad"]

print(usuario)

Recorrer los elementos de un diccionario

usuario = {"nombre": "Pepe", "apellido1": "López", "apellido2": "Martínez", "edad": 20}

# Recorremos las claves
for clave in usuario:
    print(clave)

# Recorremos los valores
for valor in usuario.values():
    print(valor)

# Recorremos los pares clave-valor
for clave, valor in usuario.items():
    print(clave, ":", valor)

11.4. Conjuntos (Sets)

Un conjunto es una colección desordenada, no indexada que no admite elementos repetidos.

Java:

Uso de Set.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> conjunto = new HashSet<>();
        conjunto.add("A");
        conjunto.add("B");
        conjunto.add("C");

        System.out.println(conjunto);
    }
}
Python:

Uso de set.

conjunto = {"A", "B", "C"}
print(conjunto)

print(type(conjunto))         # <class 'set'>

Puede encontrar más información sobre cómo trabajar con tuplas en la siguiente URL:

11.5. Actividades

Ejercicio 1. Listas (Manipulación básica)

Crea una lista de números del 1 al 10 y realiza las siguientes operaciones:

  • Modificar el tercer elemento a 100.

  • Extraer una sublista del 5º al 8º elemento.

  • Añadir el número 200 al final.

  • Calcular la suma y media de los elementos.

Ejercicio 2. Tuplas (Conversión y modificación)

Dada una tupla de coordenadas (40.7128, -74.0060) realiza las siguientes operaciones:

  • Convertir a lista.

  • Añadir un tercer elemento (altitud: 10).

  • Convertir de vuelta a tupla.

  • Desempaquetar los tres valores en variables.

Ejercicio 3. Diccionarios

Crea un diccionario con información de un estudiante que contenga las siguientes claves:

  • nombre (cadena)

  • edad (entero)

  • asignaturas (Lista de cadenas).

Una vez creado realiza las siguientes operaciones:

  • Añadir una nueva asignatura a la lista.

  • Actualizar la edad a 21 años

  • Mostrar todas las claves y valores del diccionario.

12. Operadores

12.1. Operadores aritméticos

Python

Operadores artiméticos en Python.

a = 10
b = 3
print(a + b)   # Suma: 13
print(a - b)   # Resta: 7
print(a * b)   # Multiplicación: 30
print(a ** b)  # Potencia, `a` elevado a `b`: 1000
print(a / b)   # División: 3.333...
print(a // b)  # División entera: 3
print(a % b)   # Módulo: 1

12.2. Operadores relacionales

Python

Operadores relacionales en Python.

Operación Significado

>

estrictamente mayor que

>=

mayor o igual que

<

estrictamente menor que

<=

menor o igual que

==

igual que (comparación de valor)

!=

diferente que (comparación de valor)

is

igualdad a nivel de identidad (mismo objeto en memoria)

is not

desigualdad a nivel de identidad (objetos diferentes en memoria)

x = 5
y = 10
print(x > y)    # False
print(x >= y)   # False
print(x < y)    # True
print(x <= y)   # True
print(x == y)   # False
print(x != y)   # True
x is y          # False
x is not y      # True

12.3. Operadores lógicos

Python

Operadores lógicos en Python.

Operación Resultado

x and y

Si x es falso, retorna x, de lo contrario, retorna y.

x or y

Si x es verdadero, retorna x, de lo contrario, retorna y.

not x

Si x es falso, retorna True, de lo contrario, retorna False.

x = True
y = False
print(x and y)  # False
print(x or y)   # True
print(not x)    # False

13. Operaciones de Entrada/Salida

13.1. Mostrar por pantalla. print()

Esta función nos permite mostar un mensaje por pantalla. Podemos utilizar comillas dobles o comillas simples.

print("Texto")
print('Texto')

Podemos mostrar el contenido de una variable.

print(variable)

Podemos combinar una cadena de texto con variables.

print("Texto: ", variable)

A partir de Pyton 3.6 podemos utilizar las cadenas f.

print(f",Texto {variable}")

Por defecto, imprime un salto de línea, pero podemos indicar qué no haga un salto de línea indicando cuál debe ser el último carácter de la cadena que se debe imprimir. Si utilizamos end="", entonces no escribirá el salto de línea.

print("Texto", end="")

13.2. Leer por teclado. input()

numero = input("Introduce un número: ")

Los valores que leemos desde el teclado se almacenarán como una cadena de caracteres, pero es posible convertirlos al tipo de datos que sea necesario con las siguientes funciones:

  • int()

  • float()

  • complex()

  • bool()

No se recomienda el uso de la función eval para convertir el contenido que leemos con input porque puede ocasionar problemas de seguridad.

Se recomienda la lectura del artículo: Eval really is dangerous.

13.3. Actividades

Actividad 1

Escriba un programa en Python que convierta de grados Celsius a grados Farenheit. El programa tiene que pedir por teclado el valor de una temperatura en grados Celsius y convertirla a grados Farenheit. Tenga en cuenta que la fórmula para convertir de grados Celsius a grados Farenheit es la siguiente:

\[farenheit = 1.8 \cdot celsius + 32\]

Actividad 2

Escriba un programa en Python que calcule el área de un círculo. El programa tiene que pedir por teclado el valor del radio del círculo. Tenga en en cuenta que la fórmula para calcular el área de un círculo es la siguiente:

\[area = \pi \cdot r^2\]

Puede importar el módulo math para hacer uso de la constante pi. Consulte la sección [Importar módulos].

Actividad 3

Escriba un programa en Python que calcula la hipotenusa de un triángulo rectángulo. El programa tiene que pedir por teclado el valor de los dos catetos. Tenga en cuenta que la fórmula para calcular la hipotenusa de un triángulo rectángulo es la siguiente:

\[hipotenusa = \sqrt{a^2 + b^2}\]

Para poder realizar la raíz cuadrada tendrá que utilizar la función sqrt del módulo math.

Actividad 4

Escriba un programa en Python que calcule el índice de masa corporal de una persona (IMC). El programa tiene que pedir por teclado el valor del peso en kilogramos y la altura en metros. Tenga en cuenta que la fórmula para calcular el índice de masa corporal de una persona es la siguiente:

\[imc = \frac{peso}{altura^2}\]

Actividad 5

Escriba un programa en Python que pida por teclado una cantidad en euros y la convierta a dólares estadounidenses (USD) y bitcoins (BTC). Tenga en cuenta que los valores de las monedas a día de hoy son los siguientes:

  • 1 euro equivale a 1,06 dólar estadounidense (USD).

  • 1 euro equivale a 0,000034 bitcoins (BTC).

14. Módulos

Un módulo es un archivo con extensión .py que contiene código Python que se puede puede reutlizar (funciones, clases, variables).

Los módulos permiten organizar el código, para poder reutilizarlo y facilitar su mantenimiento.

14.1. Importar módulos estándar de Python

Importar un módulo completo

Ejemplo 1

import math (1)
print(math.pi) (2)
1 Importamos el módulo math. Al importar el módulo math podemos acceder a todas las variables, constantes y funciones que están definidas en él.
2 Hacemos uso de la constante pi que está definida en el módulo math. Como el módulo ha sido importado con la instrucción import math debemos indicar el nombre del módulo seguido de un punto para acceder a sus variables, constantes y funciones.

Importar un elemento del módulo

Ejemplo 2

from math import pi (1)
print(pi) (2)
1 Importamos únicamente la constante pi del módulo math. El resto de contenido del módulo math no estará disponible porque no ha sido importado.
2 Hacemos uso de la constante pi que hemos importado en el paso anterior. A diferencia del ejemplo anterior, en este caso no es necesario indicar el nombre del módulo delante de la constante.
Creación de alias al importar un módulo

Es posible crear un alias al importar un módulo en Python.

Ejemplo 1

import math as m
print(m.pi)

Ejemplo 2

from math import pi as numero_pi
print(numero_pi)

14.2. Importar nuestros propios módulos

Vamos a crear un archivo llamado funciones.py con el siguiente contenido:

def sumar(a, b):
    return a + b

def restar(a, b):
    return a - b

def multiplicar(a, b):
    return a * b

Importar un módulo completo

Ahora vamos a crear un archivo llamado main.py donde vamos a importar el archivo funciones.py:

import funciones

print(funciones.sumar(2, 3))
print(funciones.restar(5, 2))
print(funciones.multiplicar(3, 4))

Importar un módulo completo con un alias

Ahora vamos a crear un archivo llamado main.py donde vamos a importar el archivo funciones.py:

import funciones as func

print(func.sumar(2, 3))
print(func.restar(5, 2))
print(func.multiplicar(3, 4))

Importar algunos elementos del módulo

from funciones import sumar, restar

print(sumar(2, 3))
print(restar(5, 2))

15. Condicionales

15.1. if, else y elif

Java

Condicionales en Java.

if (x > 10) {
    System.out.println("Mayor a 10");
} else if (x == 10) {
    System.out.println("Igual a 10");
} else {
    System.out.println("Menor a 10");
}
Python

Condicionales en Python.

if x > 10:
    print("Mayor a 10")
elif x == 10:
    print("Igual a 10")
else:
    print("Menor a 10")

Diferencia clave:

  • Python no utiliza llaves {} ni puntos y comas ;.

  • La indentación es obligatoria y define los bloques de código.

15.2. match y switch

Java

Sentencia switch en Java.

switch (dia) {
    case "1":
        System.out.println("Lunes");
        break;
    case "2":
        System.out.println("Martes");
        break;
    case "3":
        System.out.println("Miércoles");
        break;
    case "4":
        System.out.println("Jueves");
        break;
    case "5":
        System.out.println("Viernes");
        break;
    case "6":
        System.out.println("Sábado");
        break;
    case "7":
        System.out.println("Domingo");
        break;
    default:
        return "Día no válido";
    }
Python

Sentenca match en Python.

match dia:
    case "1":
        print("Lunes")
    case "2":
        print("Martes")
    case "3":
        print("Miércoles")
    case "4":
        print("Jueves")
    case "5":
        print("Viernes")
    case "6":
        print("Sábado")
    case "7":
        print("Domingo")
    case _:
        return "Día no válido"
  • La sentencia match de Python permite realizar comparaciones más complejas que el switch de Java.

15.3. Actividades

Actividad 1

Escriba un programa en Python que lea un número entero por teclado y muestre un mensaje indicando si el número es par o impar. Tenga en cuenta que un número es par si el resto de la división del número entre 2 es igual a 0. Para calcular el resto de una división puede utilizar el operador módulo (%).

Actividad 2

Escribe un programa en Python que lea por teclado un número real entre 1 y 10, simulando una nota numérica, y muestre un mensaje indicando la calificación obtenida teniendo en cuenta los siguientes rangos:

  • Insuficiente: [0, 5)

  • Suficiente: [5, 6)

  • Bien: [6, 7)

  • Notable: [7, 9)

  • Sobresaliente: [9, 10]

Si el número introducido no está en ninguno de los rangos anteriores debe mostrar un mensaje de error indicando que la nota no es válida.

Actividad 3

Escribe un programa en Python que simule el comportamiento de lanzar una moneda al aire y muestre un mensaje indicando si ha salido cara o cruz.

Para generar un número entero aleatorio puede utilizar la función randint del módulo random. Esta función genera un número entero aleatorio comprendido entre los dos números que recibe como parámetros.

Por ejemplo, para generar un número entero entre 1 y 10 podríamos utilizar las siguientes opciones.

Opción 1

import random
n = random.randint(1, 10)
print(n)

Opción 2

from random import randint
n = randint(1, 10)
print(n)

Actividad 4

Escriba un programa en Python que muestre el siguiente mensaje por pantalla para preguntarle al usuario si desea seleccionar cara o cruz.

0 - Cara
1 - Cruz
Introduce una opción (0 o 1):

Después de leer la opción seleccionada por el usuario el programa generará un número aleatorio para simular el lanzamiento de una moneda y mostrará un mensaje indicando si el usuario ha ganado o ha perdido dependiendo del resultado.

Actividad 5

Escriba un programa en Python que simule el juego de piedra, papel o tijera. En primer lugar el programa tendrá que mostrar un mensaje por pantalla al usuario para preguntarle qué opción desea elegir. Por ejemplo:

1. Piedra
2. Papel
3. Tijera
Seleccione una opción (1, 2 o 3):

Después de leer la opción seleccionada por el usuario el programa generará un número aleatorio para simular una jugada y mostrará un mensaje indicando si el usuario ha ganado o ha perdido dependiendo del resultado.

Tenga en cuenta que:

  • La piedra gana a la tijera pero pierde contra el papel.

  • El papel gana a la piedra pero pierde contra la tijera.

  • La tijera gana al papel pero pierde contra la piedra.

16. Bucles

16.1. Bucle for

Java

Bucle for.

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
Python:

Bucle for.

for numero in range(5):  # Itera de 0 a 4
    print(numero)

Diferencias clave:

  • En Python, for puede iterar sobre cualquier objeto iterable, como listas o cadenas.

Recorrer una lista con for

nombres = ["Juan", "María", "Carlos", "Luisa"]
for nombre in nombres:
    print(nombre)

Recorrer una cadena con for

cadena = "Hola Mundo"
for letra in cadena:
    print(letra)

Recorrer un diccionario con for

diccionario = {"nombre": "Juan", "edad": 30, "ciudad": "Almería"}
for clave, valor in diccionario.items():
    print(clave, valor)

Utilizar for con range

La función range devuelve una secuencia de números que es de tipo range.

Puede aceptar uno, dos o tres argumentos:

range(inicio, fin, paso)
  • inicio: valor inicial de la secuencia. Su valor por defecto es 0.

  • fin: valor final de la secuencia.

  • paso: incremento de la secuencia. Su valor por defecto es 1.

Ejemplos:

for numero in range(5):             # Itera de 0 a 4
    print(numero)

for numero in range(1, 6):          # Itera de 1 a 5
    print(numero)

for numero in range(0, 11, 2):      # Itera de 0 a 10 de 2 en 2
    print(numero)

for numero in range(10, 0, -1):      # Itera de 10 a 1
    print(numero)

for numero in range(10, 0, -2):     # Itera de 10 a 1 de 2 en 2
    print(numero)

16.2. Bucle while

Java

Bucle while.

int contador = 0;
while (contador < 5) {
    System.out.println(contador);
    contador++;
}
Python:

Bucle while.

contador = 0
while contador < 5:
    print(contador)
    contador += 1

Diferencia clave:

  • En Python, no es necesario utilizar llaves {} para delimitar el cuerpo del bucle.

16.3. Actividades

Actividad 1

Escriba un programa en Python que muestre una lista de números del 1 al 10. Resuelva el ejercicio de dos formas distintas, utilizando los bucles for y while. Cuando utilice el bucle for puede hacer uso de la función range.

Actividad 2

Escriba un programa en Python que muestre una lista de números del 10 al 1. Resuelva el ejercicio de dos formas distintas, utilizando los bucles for y while. Cuando utilice el bucle for puede hacer uso de la función range.

Actividad 3

Escriba un programa en Python que muestre los números pares que hay entre 0 y 10. Resuelva el ejercicio utilizando un bucle for.

Actividad 4

Escriba un programa en Python que muestre los números impares que hay entre 1 y 11. Resuelva el ejercicio utilizando un bucle for.

Actividad 5

Escriba un programa en Python que lea por teclado un número comprendido entre 1 y 10. Resuelva el ejercicio utilizando un bucle while. ¿Es posible resolver este ejercicio con un bucle for?

Actividad 6

Escriba un programa en Python que realice las siguientes operaciones:

  • Leer por teclado un número comprendido entre 1 y 10.

  • Una vez que ha leído el número tiene que mostrar su tabla de multiplicar.

Actividad 7

Escriba un programa en Python que realice las siguientes operaciones:

  • Leer por teclado un número comprendido entre 1 y 10.

  • Una vez que ha leído el número tiene que mostrar su tabla de multiplicar.

  • Después de mostrar la tabla de multiplicar tiene que preguntar al usuario si desea introducir otro número o no. Si el usuario selecciona que quiere continuar el programa tendrá que volver a ejecutarse y repetir los mismos pasos. Si el usuario indica que no quiere continuar el programa finaliza.

Actividad 8

Escriba un programa en Python que muestre todas las tablas de multiplicar de los números comprendidos del 1 al 10.

17. Funciones

Las funciones se declaran con la palabra reservada def.

17.1. Funciones sin parámetros

En este ejemplo la función no recibe ningún parámetro y no devuelve ningún valor.

def saludar():
    print("¡Hola mundo!")

saludar()

17.2. Funciones que devuelven un valor

En este ejemplo la función recibe dos parámetros y devuelve un valor.

# Declarar una función
def sumar(a, b):
    return a + b

# Invocar a una función
sumar(1, 2)

17.3. Funciones que devuelve más de un valor

En este ejemplo la función recibe un parámetro y devuelve dos valores.

def dividir(dividendo, divisor):
    cociente = dividendo // divisor
    resto = dividendo % divisor
    return cociente, resto

c, r = dividir(10, 3)
print(f"Cociente: {c}, Resto: {r}")

17.4. Funciones pasando argumentos con clave y valor

Si utilizamos una función pasando argumentos con clave y valor, podemos cambiar el orden de los argumentos.

def saludar(nombre, apellido):
    print(f"Hola {nombre} {apellido}")

saludar(apellido="Pérez", nombre="Juan")

17.5. Funciones con parámetros por defecto

Si no le pasamos un valor a un parámetro, se utilizará el valor que se haya definido por defecto.

def saludar(nombre="Mundo"):
    print(f"Hola {nombre}")

saludar()
saludar("Juan")

17.6. Funciones con un número variable de argumentos

Si queremos que una función pueda recibir un número variable de argumentos, podemos utilizar el operador * para indicar que se trata de una tupla.

def sumar(*numeros):
    suma = 0
    for numero in numeros:
        suma += numero
    return suma

s = sumar(1, 2, 3, 4, 5)
print(s)

17.7. Actividades

Actividad 1

Escriba un programa en Python que haga uso de una función llamada saludar que cumpla los siguientes requisitos:

  • Entrada: No tiene parámetros de entrada.

  • Salida: No tiene parámetros de salida.

  • Funcionalidad: Imprime por pantalla el texto "Hola mundo".

Solución

# Definimos la función saludar
def saludar():
    print("Hola mundo")

#--------------------------------------------------
# Programa Principal
# Utilizamos la función saludar
saludar()

Actividad 2

Escriba un programa en Python que haga uso de una función llamada saludar que cumpla los siguientes requisitos:

  • Entrada: Tiene 1 parámetro de entrada, que será una cadena de texto con el nombre de una persona.

  • Salida: No tiene parámetros de salida.

  • Funcionalidad: Imprime por pantalla un mensaje saludando al nombre de la persona que se haya pasado como parámetro de entrada. Por ejemplo, si el parámetro de entrada es "Pepe", la función mostrará por pantalla: "¡Hola Pepe!".

Solución

# Definimos la función saludar
def saludar(nombre):
    print(f"¡Hola {nombre}!")

#--------------------------------------------------
# Programa Principal
# Utilizamos la función saludar
nombre = input("Dime tu nombre: ")
saludar(nombre)

Actividad 3

Escriba un programa en Python que haga uso de una función llamada saludar que cumpla los siguientes requisitos:

  • Entrada: Tiene 3 parámetros de entrada, que serán 3 cadenas de texto.

    • Nombre,

    • Primer apellido,

    • Segundo apellido

  • Salida: No tiene parámetros de salida.

  • Funcionalidad: Imprime por pantalla un mensaje saludando al nombre de la persona que se haya pasado como parámetro de entrada. Por ejemplo, si los parámetros de entrada son "Pepe López Martínez", la función mostrará por pantalla: "¡Hola Pepe López Martínez!".

Solución

# Definimos la función saludar
def saludar(nombre, apellido1, apellido2):
    print(f"¡Hola {nombre} {apellido1} {apellido2}!")

#--------------------------------------------------
# Programa Principal
# Utilizamos la función saludar
nombre = input("Dime tu nombre: ")
apellido1 = input("Dime tu primer apellido: ")
apellido2 = input("Dime tu segundo apellido: ")

saludar(nombre, apellido1, apellido2)

Actividad 4

Escriba un programa en Python que haga uso de una función llamada calcular_area_circulo que cumpla los siguientes requisitos:

  • Entrada: Tiene 1 parámetro de entrada, que será un número real con el valor del radio del círculo del que queremos calcular su área.

  • Salida: Tiene 1 parámetro de salda, que será un número real con el valor del área del círculo.

  • Funcionalidad: Calcula el área de un círculo. Tenga en cuenta que el valor del radio no se pide dentro de la función, sino que se recibe como parámetro de entrada.

Solución

import math

# Definimos la función
def calcular_area_circulo(radio):
    area = math.pi * radio * radio
    return area

#-------------------------------------------------------
# Programa Principal
radio = float(input("Introduce el radio del círculo: "))
area = calcular_area_circulo(radio)
print(f"El área del círculo es {area}")

Actividad 5

Escriba un programa en Python que haga uso de una función llamada calcular_area_triangulo que cumpla los siguientes requisitos:

  • Entrada: Tiene 2 parámetros de entrada, que serán dos números reales con el valor de la base y la altura del triángulo que queremos calcular su área.

  • Salida: Tiene 1 parámetro de salida, que será un número real con el valor del área del triángulo.

  • Funcionalidad: Calcula el área de un triángulo. Tenga en cuenta que el valor de la base y la altura no se piden dentro de la función, sino que se reciben como parámetros de entrada.

Solución

# Definimos la función
def calcular_area_triangulo(base, altura):
    area = (base * altura) / 2
    return area

#--------------------------------------------------

# Programa Principal (Main)
base = float(input("Introduce el valor de la base: "))
altura = float(input("Introduce el valor de la altura: "))
area = calcular_area_triangulo(base, altura)
print(f"El área del triángulo es {area}")

Actividad 6

Escriba un programa en Python que haga uso de una función llamada calcular_area_rectangulo que cumpla los siguientes requisitos:

  • Entrada: Tiene 2 parámetros de entrada, que serán dos números reales con el valor de la base y la altura del rectángulo que queremos calcular su área.

  • Salida: Tiene 1 parámetro de salida, que será un número real con el valor del área del rectángulo.

  • Funcionalidad: Calcula el área de un rectángulo. Tenga en cuenta que el valor de la base y la altura no se piden dentro de la función, sino que se reciben como parámetros de entrada..

Solución

# Definimos la función
def calcular_area_rectangulo(base, altura):
    area = base * altura
    return area

#--------------------------------------------------

# Programa Principal (Main)
base = float(input("Introduce el valor de la base: "))
altura = float(input("Introduce el valor de la altura: "))
area = calcular_area_rectangulo(base, altura)
print(f"El área del rectángulo es {area}")

Actividad 7

Escriba un programa en Python que muestre un menú que permita al usuario seleccionar qué operación desea realizar. Las operaciones que puede realizar serán calcular el área de un círculo, un triángulo o un rectángulo. El menú que se le muestra al usuario será similar al siguiente:

1. Calcular el área de un círculo
2. Calcular el área de un triángulo
3. Calcular el área de un rectángulo
4. Salir
Introduce una opción (1-4):

El programa se estará ejecutando de forma indefinida hasta que el usuario seleccione la opción 4.

Tendrá que diseñar las siguientes funciones:

  • mostrar_menu

    • Descripción: Muestra el menú por pantalla con todas las opciones disponibles.

  • principal

    • Descripción: Lee por teclado la opción seleccionada por el usuario, valida que la opción está entre 1 y 4, y una vez que ha leído una opción válida llamará a la función correspondiente en función de la opción seleccionada.

  • opcion1

    • Descripción: Lee por teclado el valor del radio del círculo, valida que el radio siempre sea mayor que 0 y una vez que ha validado el radio llamará a la función calcular_area_circulo.

  • opcion2

    • Descripción: Lee por teclado el valor de la base y la altura del triángulo, valida que los dos datos son mayores que 0 y una vez que los ha validado llamará a la función calcular_area_triangulo.

  • opcion3

    • Descripción: Lee por teclado el valor de la base y la altura del rectángulo, valida que los dos datos son mayores que 0 y una vez que los ha validado llamará a la función calcular_area_rectangulo.

18. Clases y Objetos

18.1. Declaración de clases y objetos

Java:

Declaración de una clase y creación de un objeto

public class Persona {
    private String nombre;

    public Persona(String nombre) {
        this.nombre = nombre;
    }

    public void saludar() {
        System.out.println("Hola, mi nombre es " + nombre);
    }

    public static void main(String[] args) {
        Persona persona = new Persona("Juan");
        persona.saludar();
    }
}
Python:

Declaración de una clase y creación de un objeto

class Persona:
    def __init__(self, nombre):
        self.nombre = nombre

    def saludar(self):
        print(f"Hola, mi nombre es {self.nombre}")

# Crear un objeto
persona = Persona("Juan")
persona.saludar()

Diferencias clave:

  • En Python, no es necesario especificar modificadores de acceso como public o private.

  • El constructor en Python se define con init y el parámetro self es obligatorio para métodos de instancia.

Constructores: init en Python vs. métodos en Java

Java:

Constructor y uso de valores por defecto.

public class Persona {
    private String nombre;

    public Persona() {
        this.nombre = "Sin nombre";
    }

    public Persona(String nombre) {
        this.nombre = nombre;
    }

    public void saludar() {
        System.out.println("Hola, mi nombre es " + nombre);
    }
}
Python:

Constructor y valores por defecto.

class Persona:
    def __init__(self, nombre="Sin nombre"):
        self.nombre = nombre

    def saludar(self):
        print(f"Hola, mi nombre es {self.nombre}")

persona = Persona()  # Sin nombre
persona.saludar()

Nota: En Python, los valores por defecto se definen directamente en los parámetros del constructor.

Métodos de instancia y estáticos

Java:

Métodos de instancia y estáticos.

public class Ejemplo {
    public void metodoInstancia() {
        System.out.println("Este es un método de instancia.");
    }

    public static void metodoEstatico() {
        System.out.println("Este es un método estático.");
    }

    public static void main(String[] args) {
        Ejemplo ejemplo = new Ejemplo();
        ejemplo.metodoInstancia();
        Ejemplo.metodoEstatico();
    }
}
Python:

Métodos de instancia y estáticos.

class Ejemplo:
    def metodo_instancia(self):
        print("Este es un método de instancia.")

    @staticmethod
    def metodo_estatico():
        print("Este es un método estático.")

ejemplo = Ejemplo()
ejemplo.metodo_instancia()
Ejemplo.metodo_estatico()

Diferencia clave: En Python, los métodos estáticos requieren el decorador @staticmethod.

18.2. Encapsulación, herencia y polimorfismo

Java:

Modificadores de acceso.

public class Persona {
    private String nombre;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}
Python:

Encapsulación y acceso controlado.

class Persona:
    def __init__(self, nombre):
        self.__nombre = nombre  # Variable privada

    def get_nombre(self):
        return self.__nombre

    def set_nombre(self, nombre):
        self.__nombre = nombre

En Python, los atributos "privados" usan un prefijo doble de guiones bajos (__), pero no son estrictamente privados ya que es posible acceder a ellos.

Por ejemplo, en el ejemplo anterior, el atributo nombre se puede acceder usando persona._Personanombre.

persona = Persona("Juan")
print(persona.get_nombre())
print(persona._Persona__nombre)

Herencia: uso de super() en ambos lenguajes

Java:

Herencia y uso de super.

class Animal {
    public void sonido() {
        System.out.println("El animal hace un sonido");
    }
}

class Perro extends Animal {
    @Override
    public void sonido() {
        super.sonido();
        System.out.println("El perro ladra");
    }
}
Python:

Herencia y uso de super.

class Animal:
    def sonido(self):
        print("El animal hace un sonido")

class Perro(Animal):
    def sonido(self):
        super().sonido()
        print("El perro ladra")

perro = Perro()
perro.sonido()

18.3. Actividades

Ejerccio 1

Escribe una clase llamada Punto que tenga dos atributos x e y que representan las coordenadas de un punto en un plano cartesiano. La clase debe tener un método llamado imprimir_punto que imprima las coordenadas del punto.

Realice la intancia de 3 puntos y muestre sus coordenadas haciendo uso del método correspondiente.

class Punto:
    def __init__(self, x, y):
        self.x = x  # Coordenada x del punto
        self.y = y  # Coordenada y del punto

    def imprimir_punto(self):
        print(f"Coordenadas: ({self.x}, {self.y})")

# Creamos 3 instancias de las clase Punto
p1 = Punto(0, 0)
p2 = Punto(2, 5)
p3 = Punto(-1, 3)

# Imprimimos las coordenadas de los puntos
p1.imprimir_punto()  # Salida: Coordenadas: (0, 0)
p2.imprimir_punto()  # Salida: Coordenadas: (2, 5)
p3.imprimir_punto()  # Salida: Coordenadas: (-1, 3)

Ejercicio 2

Haciendo uso de la clase anterior (Punto), escriba una nueva clase llamada Triangulo que tengas tres atributos que serán de tipo Punto y representarán los vértices de un triángulo. La clase debe tener un método llamado imprimir_vertices que imprima las coordenadas de los tres vértices, haciendo uso del método imprimir_punto de la clase Punto.

class Punto:
    def __init__(self, x, y):
        self.x = x  # Coordenada x del punto
        self.y = y  # Coordenada y del punto

    def imprimir_punto(self):
        print(f"Coordenadas: ({self.x}, {self.y})")

class Triangulo:
    def __init__(self, v1, v2, v3):
        self.v1 = v1  # Primer vértice (objeto Punto)
        self.v2 = v2  # Segundo vértice (objeto Punto)
        self.v3 = v3  # Tercer vértice (objeto Punto)

    def imprimir_vertices(self):
        print("Vértice 1:")
        self.v1.mostrar_punto()  # Usa el método de Punto
        print("Vértice 2:")
        self.v2.mostrar_punto()
        print("Vértice 3:")
        self.v3.mostrar_punto()

# Creamos 3 instancias de la clase Punto
p1 = Punto(0, 0)
p2 = Punto(2, 5)
p3 = Punto(-1, 3)

# Creamos un triángulo con los puntos que hemos creado
triangulo = Triangulo(p1, p2, p3)

# Imprimir los vértices del triángulo
triangulo.imprimir_vertices()

19. Gestión de Excepciones

Para gestionar excepciones en Python podemos utilizar las sentencias try y except. Estas nos permiten manejar errores que pueden surgir durante la ejecución de un programa.

La sintaxis básica es la siguiente:

Imagen obtenida de 30-Days-Of-Python.

try except

Ejemplo 1: ZeroDivisionError

try:
    x = 1 / 0
except ZeroDivisionError:
    print("Error: División por cero")

Ejemplo 2: IndexError

try:
    lista = [1, 2, 3]
    print(lista[5])
except IndexError:
    print("Error: Índice fuera de rango")

Ejemplo 3: Uso de except, else y finally

try:
    num1 = int(input("Introduce el número 1: "))
    num2 = int(input("Introduce el número 2: "))
    resultado = num1 / num2
    print(f"Resultado: {resultado}")
except ValueError:
    print("Error: Debe introducir números enteros")
except ZeroDivisionError:
    print("Error: No se puede dividir entre cero")
else:
    print("Todo funcionó correctamente (sin errores)")
finally:
    print("Este mensaje siempre se ejecuta")

20. Manejo de Archivos

20.1. Lectura y escritura de archivos

Para leer y escribir archivos en Python, se utiliza la función open(). Esta función recibe dos argumentos: el nombre del archivo y el modo de apertura.

Los modos de apertura más comunes son:

  • r: Lectura (Es el modo por defecto).

  • r+: Lectura y escritura.

  • w: Escritura. Si el archivo no existe, se crea y si ya existe, se sobreescribe.

  • w+: Igual que w, pero permite la lectura.

  • a: Abre el archivo para añadir contenido al final.

  • a+: Igual que a, pero permite la lectura.

Modo Crea el archivo si no existe Sobrescribe el archivo si existe Lectura Escritura Posición inicial

r

No

No

No

Inicio

r+

No

No

Inicio

w

No

Inicio (el archivo estará vacío)

w+

Inicio (el archivo estará vacío)

a

No

No

Final

a+

No

Final

Ejemplo de escritura en un archivo

with open("archivo.txt", "w+") as file:
    file.write("Primera línea del archivo\n")
    file.write("Segunda línea del archivo\n")

Ejemplos de lectura de un archivo

En este ejemplo, la función file.read().splitlines() carga todo el contenido en memoria, lo que puede ser ineficiente si el archivo es muy grande.

with open("archivo.txt", "r") as file:
    for line in file.read().splitlines():
        print(line)

En este ejemplo, el archivo se lee línea por línea, lo que es más eficiente.

with open("archivo.txt", "r") as file:
    for line in file:
        print(line.strip())

21. Licencia

22. Referencias


1. Datos del Octoverse 2024