Tipos y operadores
Variables
Una variable es un nombre que apunta a un valor (la etiqueta de una caja que contiene un dato).
En Python el valor de una variable se le asigna directamente con el operador =:
- Prueba a cambiar los valores de las variables y vuelve a ejecutar el script.
- ¿Qué pasa si intentas imprimir una variable que no has definido? Intenta llamar a
print(altura)sin haber definidoalturaantes. - Define altura como un número decimal y vuelve a ejecutar el script.
f"..." es una f-string: una cadena de texto donde {variable} se sustituye por el valor de esa variable. Es la forma más cómoda de construir un mensaje combinando texto fijo con datos.
Python permite hacer asignaciones múltiples en una sola línea:
Las variables no son cadenas de texto
Las variables no son cadenas de texto: son nombres que apuntan a un valor. Por eso, si quieres imprimir el valor de una variable, no debes ponerlo entre comillas:
Arregla el siguiente código para que imprima correctamente el mensaje “Alicia tiene 20 años”:
Flujo de ejecución
Los programas se ejecutan de arriba abajo, línea a línea. Este orden es fundamental para entender cómo se comportan los programas. Por ejemplo:
Las variables no son fijas
Las variables en Python pueden cambiar su valor durante la ejecución del programa. Por ejemplo:
Tipos de datos
En Python, las variables pueden contener diferentes tipos de datos. Algunos de los más comunes son:
str(string): textoint(integer): números enterosfloat: números decimalesbool(boolean): valores lógicos (TrueoFalse)None: ausencia de valor
A diferencia de otros lenguajes, Python no requiere declarar el tipo de una variable: lo infiere automáticamente del valor que le asignas. Por eso puedes cambiar el tipo de una variable simplemente asignándole un valor de otro tipo:
Las variables se pueden manipular y comparar con operadores. Por ejemplo, + suma, - resta, * multiplica, / divide, y == compara si dos valores son iguales.
Convertir entre tipos
A veces necesitas convertir un valor de un tipo a otro; esto se llama conversión de tipos o casting. Por ejemplo, si tienes un número como cadena de texto y quieres hacer cálculos con él, debes convertirlo a un tipo numérico.
También podemos convertir a bool:
- ¿Qué cadena de texto representa el valor
Falseen Python?
- ¿Puedes hacer un cast a entero de un booleano?
int y float
Son números, pero con diferencias importantes: int son enteros, mientras que float son decimales. Por ejemplo:
Los ordenadores almacenan y representan los float como una aproximación binaria, lo que puede dar lugar a resultados inesperados al hacer operaciones con ellos:
- ¿Qué valor imprimirá el siguiente código?
- ¿Son iguales
0.1 + 0.2y0.3?
Operadores aritméticos
Los operadores aritméticos más habituales:
| Operador | Significado |
|---|---|
+ |
suma |
- |
resta |
* |
multiplicación |
/ |
división con decimales |
// |
división entera |
% |
resto |
** |
potencia |
¿Qué resultado devuelve cada operación?
También existen operadores unariosos que actúan sobre un solo operando (en contraposición a los anteriores que son binarios, porque actúan sobre dos operandos):
Existen varios operadores de asignación combinados con operaciones aritméticas, aunque los más usados son += y -=.
| Operador | Significado |
|---|---|
+= |
suma y asignación |
-= |
resta y asignación |
*= |
multiplicación y asignación |
/= |
división y asignación |
//= |
división entera y asignación |
%= |
resto y asignación |
**= |
potencia y asignación |
Comparación
Los operadores de comparación devuelven un valor booleano: True o False.
| Operador | Significado | Ejemplo | Resultado |
|---|---|---|---|
== |
igual a | 5 == 5 |
True |
< |
menor que | 2 < 5 |
True |
<= |
menor o igual que | 5 <= 5 |
True |
> |
mayor que | 7 > 3 |
True |
>= |
mayor o igual que | 4 >= 4 |
True |
!= |
distinto de | 3 != 5 |
True |
Bool y None
Las variables booleanas (bool) solo pueden tener dos valores: True o False. Se usan para representar condiciones y tomar decisiones en el flujo del programa.
Operadores lógicos
Los operadores lógicos combinan condiciones booleanas:
and: DevuelveTruesi ambas condiciones sonTrue.or: DevuelveTruesi al menos una de las condiciones esTrue.not: Devuelve el valor opuesto de la condición.
¿Qué resultado devuelve cada operación?
La variable None es un valor especial en Python que representa la ausencia de un valor. Se usa para indicar que una variable no tiene un valor asignado, o para representar un valor nulo en ciertos contextos.
Para la comparación de None con otras variables, se recomienda usar el operador is en lugar de ==.
Cadenas de texto
Las cadenas de texto (str) son secuencias de caracteres encerradas entre comillas simples ' o dobles ". Se usan para representar texto y se pueden manipular con diversos métodos.
Como has visto, se pueden comparar con == para comprobar si son iguales. También se pueden concatenar con el operador + y repetir con *:
Escribe un programa que, dado un número n, devuelva n + nn + nnn.
Igual puedes hacer un cast de int a str y viceversa.
Métodos de cadenas
Las cadenas tienen muchos métodos útiles para manipularlas:
.upper(): Convierte la cadena a mayúsculas..lower(): Convierte la cadena a minúsculas..strip(): Elimina espacios en blanco al principio y al final..split(sep): Divide la cadena en una lista usando un separador..replace(old, new): Reemplaza una subcadena por otra..startswith(prefix): Comprueba si la cadena empieza con un prefijo..endswith(suffix): Comprueba si la cadena termina con un sufijo..join(iterable): Une los elementos de un iterable con la cadena como separador.
Además, puedes usar len(cadena) para obtener la longitud de la cadena.
Para cualquier variable puedes conocer los métodos disponibles con dir(variable), y para ver la documentación de un método puedes usar help(variable.metodo).
Igual existe un método para contar. Compruébalo.
Un poco más difícil: calcula el contenido de GC de la siguiente secuencia de ADN.
Igual hay que eliminar los espacios en blanco.
Extrae la especie de la siguiente línea de datos y represéntala sin el _.
Slicing de cadenas
El slicing de cadenas es una técnica para extraer una parte de una cadena. Se utiliza la sintaxis [inicio:fin] donde inicio es el índice del primer carácter a incluir y fin es el índice del primer carácter a excluir.
- Los índices en Python empiezan en 0, por lo que el primer carácter de una cadena tiene índice 0, el segundo índice 1, y así sucesivamente.
- El índice
-1se refiere al último carácter,-2al penúltimo, y así sucesivamente.
Calcula la letra de un DNI.
Tipos compuestos
Los tipos compuestos son estructuras que pueden almacenar múltiples valores o elementos bajo un solo nombre de variable. Los dos tipos compuestos más comunes en Python son las listas y los diccionarios.
Listas
Las listas son colecciones ordenadas de elementos, que pueden ser de diferentes tipos. Se definen usando corchetes [] y los elementos se separan por comas. Que sean ordenadas significa que cada elemento siempre ocupa la misma posición dentro de la lista, y por tanto se le puede asignar un índice.
# Ejemplos de una lista
lista_vacia = [] # lista vacía
especies = ["Quercus_robur", "Pinus_sylvestris", "Fragaria_vesca"] # lista de strings
alturas = [1.5, 2.0, 0.3] # lista de floats
numero_individuos = [5, 10, 3] # lista de ints
estan_sanos = [True, False, True] # lista de bools
datos_muestreo = ["Quercus_robur", 1.5, 5, True] # lista mixta
datos_muestreo = [especies, alturas, numero_individuos, estan_sanos] # lista de listasCrear listas
Las listas se pueden crear de varias maneras:
- Usando corchetes
[]y separando los elementos con comas. - Usando la función
list()para convertir un iterable en una lista (un iterable es cualquier objeto que se puede recorrer, como una cadena de texto o un rango de números).
Acceder a elementos de una lista
De manera similar a las cadenas de texto, puedes acceder a los elementos de una lista usando índices.
Recuerda que en Python, el primer elemento tiene índice 0, el segundo índice 1, y así sucesivamente. También puedes usar índices negativos para acceder a los elementos desde el final de la lista.
Usando la lista personajes, intenta hacer lo siguiente:
Las listas son mutables, lo que significa que puedes cambiar sus elementos después de haberlas creado. Por ejemplo, puedes modificar un elemento existente, añadir nuevos elementos o eliminar elementos.
- Recuerda que las listas son mutables, así que puedes cambiar un elemento directamente usando su índice.
- Igual sobran y faltan comillas.
- ¿Están bien escritas las variables?
Métodos y operadores con listas
Algunos de los métodos más comunes para trabajar con listas son:
.append(): Añade un elemento al final de la lista..extend(): Añade varios elementos al final de la lista..pop(): Elimina y devuelve el elemento en la posición especificada.
sorted()o.sort(): Ordena la lista en orden ascendente.reversed()o.reverse(): Invierte el orden de los elementos en la lista.
Estos dos métodos pueden devolver una nueva lista ordenada o invertida sin modificar la lista original (sorted y reversed) o bien modificar la lista original (inplace) (.sort() y .reverse()).
len(): Devuelve el número de elementos en la lista.min(): Devuelve el valor mínimo de la lista.max(): Devuelve el valor máximo de la lista.sum(): Devuelve la suma de los elementos de la lista..count(): Devuelve el número de elementos con el valor especificado.
in: Comprueba si un elemento está en la lista.
¿Una lista vacía es False o True? ¿Y con elementos?
- Recuerda que puedes usar
bool()para convertir un valor a booleano.
Diccionarios
Los diccionarios son colecciones de pares clave-valor. Mientras que en las listas los elementos se acceden por su posición, en los diccionarios se acceden por su clave.
Se definen usando llaves {} y los elementos se separan por comas. Cada elemento tiene una clave ÚNICA que se usa para acceder a su valor correspondiente.
Fíjate que no he escrito el diccionario en una sola línea, sino que he usado varias líneas para que sea más legible. Esto es posible porque Python permite dividir una expresión en varias líneas si está dentro de paréntesis, corchetes o llaves.
Los diccionarios y las listas también pueden contener otros diccionarios y listas como valores, lo que permite crear estructuras de datos más complejas.
Los diccionarios son mutables, lo que significa que puedes cambiar sus elementos después de haberlos creado. Por ejemplo, puedes modificar un valor existente, añadir nuevos pares clave-valor o eliminar pares clave-valor.
Crea un diccionario
motivo_dnaque contenga la información de la secuencia de ADNdna_seqy suidAñade al diccionario
motivo_dnala secuencia de ARN usando un diccionario para convertir entre ADN y ARNAñade al diccionario
motivo_dnala secuencia reversa y complementaria. Para crearla usa un diccionario que contenga la información de los nucleótidos complementarios.
Métodos y operadores con diccionarios
Los diccionarios tienen varios métodos útiles para trabajar con ellos. Los más comunes son:
.keys(): Devuelve un iterador de las claves del diccionario..values(): Devuelve un iterador de los valores del diccionario..items(): Devuelve un iterador de los pares clave-valor del diccionario.
len(): Devuelve el número de pares clave-valor en el diccionario.in: Comprueba si una clave está en el diccionario.
Crea un diccionario a partir de las listas individuos y edades, donde cada individuo sea una clave y su edad el valor correspondiente. Luego, comprueba:
- ¿Cuántos individuos hay en el diccionario?
- ¿Está “Alice” en el diccionario?
- ¿Cuál es la edad media?
Ejercicios
Para resolver estos ejercicios solo necesitas lo visto en este tema: variables, operadores, cadenas de texto, listas y diccionarios. Todavía no hacen falta bucles ni condicionales.
1. Índice de masa corporal
El índice de masa corporal (IMC) se calcula como el peso (kg) dividido entre la altura (m) al cuadrado. Calcula el IMC de la paciente e imprime un mensaje como El IMC de Lucía es .... Después, guarda en una variable sobrepeso si su IMC es mayor o igual a 25 e imprímela.
- El operador de potencia es
**. - Una comparación como
imc >= 25devuelve directamenteTrueoFalse, así que puedes guardar su resultado en una variable.
2. Conversión de temperaturas
Un termómetro antiguo envía sus lecturas como texto. Convierte la lectura a número, calcula su equivalente en grados Fahrenheit (°F = °C × 9 / 5 + 32) e imprime ambos valores. Comprueba con type() el tipo de la variable antes y después de convertirla.
- ¿Qué pasa si intentas hacer
lectura * 9? ¿Ylectura + 32? - La lectura tiene decimales: ¿qué función de conversión necesitas,
int()ofloat()?
3. Crecimiento de un cultivo bacteriano
Un cultivo de E. coli se ha mantenido en la estufa durante 437 minutos. Sabiendo que en esas condiciones las bacterias se dividen cada 20 minutos:
- Expresa el tiempo de incubación en horas y minutos (por ejemplo,
7 h y 17 min). - Calcula cuántas generaciones completas han tenido lugar.
- Si el cultivo empezó con 1000 células, ¿cuántas células habrá al final? (en cada generación el número de células se duplica)
- La división entera
//te da las horas completas; el resto%, los minutos que sobran. - Tras
ngeneraciones, el número de células es el inicial multiplicado por2 ** n.
4. ¿Puede donar sangre?
Para donar sangre una persona debe cumplir todos estos requisitos:
- tener entre 18 y 65 años (ambos incluidos),
- pesar al menos 50 kg,
- tener una hemoglobina de al menos 12.5 g/dL,
- no tener fiebre.
Guarda en la variable puede_donar si el donante cumple los requisitos e imprímela. Después cambia los datos del donante para comprobar que funciona en otros casos.
- Escribe primero cada requisito como una comparación por separado.
- Para que se cumplan todas a la vez, combínalas con
and. notinvierte un valor booleano.
Con estos datos el donante no puede donar porque su hemoglobina es demasiado baja.
5. Limpiar un nombre científico
Al pasar a limpio una hoja de campo, un nombre científico ha quedado mal escrito. A partir de nombre, consigue:
"Pinus sylvestris": sin espacios sobrantes, con el género en mayúscula y el epíteto en minúscula."P. sylvestris": la forma abreviada."Pinus_sylvestris": el formato que usamos en las tablas de datos.
.strip()quita los espacios de los extremos y.lower()pasa todo a minúsculas.- Con slicing puedes separar la primera letra (
[0]) del resto ([1:]) y poner solo esa en mayúscula. - Para la forma abreviada,
.split()separa el género del epíteto.
6. ¿Es un marco abierto de lectura?
Un marco abierto de lectura (ORF) es un fragmento de ADN que empieza por el codón de inicio ATG, termina en uno de los codones de parada (TAA, TAG o TGA) y tiene una longitud múltiplo de 3. Para la secuencia seq:
- Comprueba por separado cada una de las tres condiciones y guarda en
es_orfsi se cumplen todas. - Calcula cuántos codones tiene.
- Imprime el segundo codón.
- Obtén la secuencia de ARN correspondiente (cambiando
TporU).
- Las cadenas tienen un método para comprobar cómo empiezan.
- Con
seq[-3:]obtienes los tres últimos caracteres;inte dice si están en la listacodones_parada. - Un número es múltiplo de 3 si el resto de dividirlo entre 3 es 0.
- El segundo codón va de la posición 3 a la 5 (ambas incluidas).
7. Identificador de una muestra
En el laboratorio cada muestra se etiqueta con un identificador que contiene la fecha (año-mes-día), el sitio, el individuo y el tejido. A partir de id_muestra:
- Extrae cada dato en una variable distinta.
- Imprime el mensaje
Muestra de hoja del individuo Q017, tomada en SiteB el 14/03/2026. - Obtén el número del individuo como entero (
17) y súmale 1 para conocer el número del siguiente individuo.
- Usa
.split()dos veces: una para separar los campos y otra para separar la fecha. "/".join(lista)une los elementos de una lista de cadenas poniendo/entre ellos.- El número del individuo son los caracteres de
"Q017"a partir del segundo.int("017")da17.
8. Pesos de ratones
Tenemos los pesos (g) de los ratones de un experimento, pero el último valor tiene un error al teclear: debería ser 24.0 y no 240.0.
- Elimina el valor erróneo y añade el correcto.
- Ha llegado un ratón nuevo que pesa
30.2g: añádelo. - Imprime cuántos ratones hay, el peso mínimo, el máximo, el rango (máximo − mínimo) y la media.
- Calcula la mediana: el valor que queda en el centro cuando la lista está ordenada (con un número impar de valores).
- ¿Hay algún ratón que pese exactamente
25.0g?
.pop()sin argumentos elimina el último elemento.- La media es la suma de los valores entre el número de valores.
- En una lista ordenada de
nelementos, connimpar, el elemento central está en la posiciónn // 2.
9. Equilibrio de Hardy-Weinberg
En una población en equilibrio de Hardy-Weinberg, si p es la frecuencia del alelo A y q la del alelo a (con p + q = 1), las frecuencias de los genotipos son AA = p², Aa = 2pq y aa = q².
- Añade al diccionario
alelosla frecuencia del alelo"a". - Crea un diccionario
genotiposcon las frecuencias esperadas de"AA","Aa"y"aa". - Comprueba si las tres frecuencias suman 1.
- En una población de 500 individuos, ¿cuántos heterocigotos se esperan?
- Puedes añadir una clave nueva a un diccionario con
alelos["a"] = .... - Guarda
pyqen variables para que las fórmulas sean más fáciles de leer. - Para sumar todas las frecuencias,
sum()funciona congenotipos.values(). - Si la suma no da exactamente 1, recuerda lo que vimos sobre los
float.
Fíjate en que 1 - 0.7 no da exactamente 0.3 por la forma en que se representan los float.
10. Expresión génica
Se ha medido la expresión de varios genes en células control y en células tratadas con un fármaco.
- Crea los diccionarios
controlytratamientoa partir de las listas, con el nombre del gen como clave. - Se ha medido un gen más,
"EGFR", con una expresión de 3.2 en control y 9.6 en tratamiento: añádelo a ambos diccionarios. - Crea un diccionario
fold_changecon el cociente tratamiento / control de cada gen. - Guarda en un diccionario
sobreexpresadosi el fold change de cada gen es mayor o igual a 2. - Imprime la lista de genes ordenada alfabéticamente y el fold change medio.
- ¿Se ha medido el gen
"GAPDH"?
dict(zip(claves, valores))crea un diccionario a partir de dos listas.- Sin bucles, tendrás que calcular el fold change de cada gen accediendo a cada clave por separado.
sorted()funciona también con.keys().
Escribir lo mismo para cada gen es repetitivo y poco práctico si tuviéramos cientos de genes. En el siguiente tema veremos cómo los bucles resuelven este problema.