Mostrando entradas con la etiqueta ciencia. Mostrar todas las entradas
Mostrando entradas con la etiqueta ciencia. Mostrar todas las entradas

8 de junio de 2023

Janet Thornton, se jubila la madre de la bioinformática estructural

Hola, ayer escuché por videoconferencia un rato de la última charla que dio Janet Thornton en el EMBL-European Bioinformatics Institute antes de jubilarse.

Woman standing at podium
fuente: EMBL

Janet ha sido sin duda una de las madres de la bioinformática, sobre todo en el área de la bioinformática estructural. Por ejemplo, tiene su propio modelo de sustitución de aminoácidos para hacer filogenias (JTT). Podéis ver su enorme influencia en la literatura en EuropePMC, o las palabras que le dedican Alfonso Valencia o Roland Dunbrack. Entre la larga lista de discípulos están por ejemplo David Jones (la J del modelo JTT, parte del equipo de AlphaFold y examinador de mi tesis), Christine Orengo o Nick Luscombe, todos ellos autores a los que he citado innumerables veces.

Yo la conocí personalmente en un congreso en Brasil, el ISMB2006, donde tuve la fortuna de tener una reunión cara a cara con ella donde me dio consejos y ánimos para mi incipiente carrera en la ciencia. Hace 4 años volvimos a coincidir en la cafetería del EMBL-EBI y recordando ese rato me dijo algo como "no te ha ido tan mal, verdad?".

En su charla recordaba observaciones que ella y su grupo habían hecho en las últimas décadas sobre la lista de aminoácidos importantes para explicar la catálisis de las enzimas. Eso le dio pie a repasar los resultados de los últimos años de trabajo, liderados por Antonio Ribeiro, donde se han centrado en sistematizar las reglas y en medir de manera objetiva la similitud entre mecanismos enzimáticos, ganando capacidad predictiva por el camino (ver por ejemplo https://europepmc.org/article/MED/36659981 y https://europepmc.org/article/PPR/PPR540240). Terminó esta parte de la charla, la última que pude seguir, diciendo que lo más difícil de jubilarse era no poder planear nuevos experimentos y estudios para todo lo que queda por saber. Creo que esa curiosidad es el motor para muchos de nosotros, no tengo nada más que añadir,

hasta pronto,

Bruno


 


 

 


 

 



12 de abril de 2023

beneficios de la evaluación doble ciega por pares

La publicación de resultados en ciencia se hace normalmente por medio de artículos en revistas científicas. El proceso empieza (i) cuando los autores envían un borrador a los editores de una revista, a menudo con una carta de presentación del trabajo. Ésto se hace generalmente en inglés, la lengua franca de la ciencia. A continuación (ii) los editores deciden si el tema y los resultados son potencialmente interesantes para la revista. Si no lo son, el artículo es rechazado sin revisión (desk rejection). En caso contrario (iii), los editores buscarán a varias personas supuestamente expertas en el tema (revisores o pares), que no tengan conflictos de interés con los autores, y les pedirán una evaluación crítica del artículo, algo que puede tardar del orden de semanas. Finalmente, con las evaluaciones (reviews) en la mano, el editor decide (iv) si solicitar modificaciones a los autores, como nuevos experimentos, interpretaciones o ediciones del inglés, rechazar el trabajo o aceptarlo en su primera revisión (nunca me ha pasado).

Difference between open, single blind and double blind
Fuente: https://fourwaves.com/blog/single-double-blind-peer-review

En nuestro campo de la biología computacional y la genómica este proceso normalmente es ciego, es decir, los autores no conocen la identidad de los revisores, pero éstos sí pueden ver las identidades y afiliaciones de los primeros. 

Un estudio iniciado en 2019 y publicado en la revista Functional Ecology  en 2023 aporta datos convincentes para que cambiemos a un sistema doble ciego, donde tampoco los revisores puedan poner nombre a los autores. El estudio hizo un seguimiento a 1837 y 1852 artículos evaluados por el sistema ciego y doble ciego respectivamente y concluye que la evaluación doble ciega:

1) hace que las revisiones sean más exigentes.

2) iguala las evaluaciones de artículos liderados por mujeres, por personas cuya lengua materna no es el inglés o de científicos de países con menores índices de desarrollo humano.

Copio aquí una de las figuras del estudio:

Fuente: https://doi.org/10.1111/1365-2435.14259


Como dicen aquí, harán falta más estudios como este para confirmar los hallazgos, pero son resultados muy importantes que alertan de los sesgos en los que incurrimos al evaluar el trabajo de los demás,

hasta pronto,

Bruno



18 de marzo de 2021

la invisible ciencia básica detrás de las vacunas SARS-CoV-2

Hola,

la pandemia que estamos viviendo, un año después, nos está poniendo a prueba. A pesar de la improvisación de los políticos a escala global, de la desinformación en las redes sociales y los brotes de desconfianza, a pesar de la economía bajo mínimos y del cole en casa, ahora la mayoría tenemos la esperanza de que las vacunas resuelvan el problema. 

En este artículo solamente pretendo recordar el largo camino de la investigación básica que nos ha traído hasta el presente. Estas vacunas son ya grandes hitos de la humanidad, a la altura de la llegada a la luna, pero el camino ha sido largo, de al menos 25 años. Por tanto, nada de milagros, son el fruto de mucho trabajo acumulado que fue explotado con mucho éxito por empresas como BioNTech y Moderna. Como pasó con CRISPR para la edicion de genomas, para que alguien llegara a la cima fueron necesarios muchos pasos previos, muchos de los cuales fuera de contexto serían objeto de "y eso para qué sirve". Aquí enumero los más importantes para las vacunas de ARN, extraídos de este hilo (no están los de los otros tipos de vacunas):

1970 T7 ARN polimerasa: nature.com/articles/22822 . Esta enzima permite sintetizar moléculas de ARN a medida, como las de las vacunas.

1978 Liposomas para llevar ARN mensajeros (mRNA): nature.com/articles/27492 . Estos vehículos permiten que el ARN de las vacunas pueda atravesar
la doble capa lipídica de la membrana celular.

1990 Inyecciones de ADN y ARN para expresar genes de manera transitoria en tejidos: science.sciencemag.org/content/247/49 .  Este trabajo demostró que es posible expresar genes a medida tras ser inyectados en tejidos, de manera que se traducen como proteínas.

2005 Ribonucleótidos modificados no disparan respuestas inmunes: cell.com/immunity/fullt .
Esto permite que el ARN inyectado no desencadene una reacción inmune por si mismo, lo que se pretende es que la reacción la desencadene la proteína codificada por ese ARNm.

2017 Estabilización de proteínas expuestas de los coronavirus MERS-CoV y SARS-CoV: pnas.org/content/114/35. Esto permite que la proteína modificada del coronoavirus que expresa el ARNm sea más estable y desencadene una reacción inmune más robusta.

Esta sucesión de descubrimientos y la tecnología actual permitieron que el tiempo de desarrollo de las vacunas haya sido el más corto de la historia:

 


En mi actual institución, el Instituto Europeo de Bioinformática (EBI), también hemos contribuído con el https://www.covid19dataportal.org y el navegador de genomas https://covid-19.ensembl.org

Espero haberos convencido de que la ciencia financiada con fondos públicos y transparente, muchas veces invisible e ingrata, es una parte fundamental e integral del avance de nuestra sociedad, y que de ella beben las empresas que nos venden luego los productos.

Hasta pronto,

Bruno

PD1 Me preguntan si "mucha de esa investigación no la financian las farmacéuticas de forma privada, con escasos beneficios en mucho casos. Esto me recuerda a cuando proponen nacionalizar farmacéuticas". 
 
Mi respuesta es que mi argumento no iba en esa dirección. De hecho creo que esta historia es un buen ejemplo de cómo lo iniciativa privada puede agilizar el desarrollo y las pruebas clínicas de las vacunas llevando a buen puerto en tiempo récord lo que empezó solamente como investigación básica. Mi argumento es que el riesgo es que la opinión pública, y los políticos que deciden, se queden sólo con el final del proceso y no vea la utilidad de la investigación básica. Quién les iba a decir a los autores de los artículos citados que iban a ser instrumentales para dos vacunas en el año 2020?
 
En cuanto a la financiación, como no es mi campo no me atrevo a opinar, pero sí puedo copiar aquí los que dicen al respecto los artículos citados más arriba:
 
1970 "This investigation was supported by a US Public Health Service research grant and training grant from the Institute of General Medical Sciences."
 
1978 "I thank Dr J. R. Tata for the freedom to pursue my own research goals... G.J.D. is in receipt of an EMBO long-term fellowship."
 
1990 "Supported in part by the NIH (grant numbers HD00669-05 and HD03352) and the Lynn F. Taylor Memorial Fund."
 
2005 "This work was supported by National Institutes of Health grants AI060505, AI50484, and DE14825."
 
2017 "This work was supported by Grants P20GM113132 ... and R01AI127521 ..., NIH Contract HHSN261200800001E Agreement 6x142 ..., and intramural funding from National Institute of Allergy and Infectious Diseases to support work at the VRC. Argonne is operated by UChicago Argonne, LLC, for the US Department of Energy (DOE), Office of Biological and Environmental Research under Contract DE-AC02-06CH11357. Use of the Stanford Synchrotron Radiation Lightsource (SSRL), SLAC National Accelerator Laboratory, is supported by the DOE, Office of Science, Office of Basic Energy Sciences under Contract DE-AC02-76SF00515. The SSRL Structural Molecular Biology Program is supported by the DOE Office of Biological and Environmental Research and by the NIH, National Institute of General Medical Sciences (including P41GM103393)."
 
PD2 Parece ser que Uğur Şahin, uno de los dos fundadores de BioNTech, dirige actualmente un proyecto ERC financiado con dinero público de la UE: https://twitter.com/ERC_Research/status/1372962936856190982

18 de abril de 2017

ciencia básica = ciencia aplicada (fármacos aprobados)

Buenas,
hoy quisiera comentar un tema recurrente cuando hablamos de ciencia: el de ciencia básica vs ciencia aplicada. En general mi impresión es que la primera se percibe como un esfuerzo romántico que da sentido a la vida de algunos locos, mientras que la segunda es la que vale, puesto que participan ingenieros, y acaba llegando a nuestro smartphone en poco tiempo. Obviamente exagero, pero por ahí van los tiros.

La excusa para sacar este tema hoy es un artículo publicado recientemente en la revista Science (http://science.sciencemag.org/content/356/6333/78.full) donde se analiza cómo se citan los proyectos de Biomedicina financiados por los NIH norteamericanos en patentes. El estudio cubre los años entre 1980 y 2007. Las conclusiones de este trabajo son:

1) que si tenemos en cuenta las citas indirectas, es decir, patentes que citan artículos que a su vez citan proyectos NIH, finannciados con dinero público, hasta un 31% de proyectos en ese periodo son citados en patentes.

2) los proyectos citados en patentes que protegen fármacos aprobados por la FDA son en igual proporción "básicos" y "aplicados", según las definiciones de los autores, que son conscientes de lo resbaladizo de estos términos.

Figura tomada de http://science.sciencemag.org/content/356/6333/78.full


Hasta luego,
Bruno

13 de mayo de 2015

Curso de Python para biólogos - Lección 7. Lectura y escritura de archivos

Con Python podemos leer, crear y modificar archivos de texto. Por ejemplo podemos leer un fichero con miles/millones de secuencias de DNA y extraer información del mismo, lo cual sería muy complicado de forma manual. Se verá un ejemplo al final de la lección.

Trabajando con directorios

Antes de empezar a crear y leer archivos, vamos a consultar el directorio de trabajo por defecto de Python con el comando 'os.getcwd', crear un nuevo directorio para trabajar en esta lección con 'os.makedirs' y cambiar el directorio de trabajo por este nuevo directorio ('os.chdir'). Para realizar todo ello primero tenemos que importar el módulo 'import os' (Operating System) que nos proporcionará los métodos mencionados. Un módulo es una extensión de Python y se debe importar para poder trabajar con sus herramientas.

Creación de archivos

Una vez que estamos en el directorio de trabajo deseado, vamos a crear un archivo llamado 'example.txt', para ello usaremos la función 'open' con la opción 'w' que indica escritura (write). El nuevo archivo será un objeto guardado en la variable 'f' y con el método 'write' podremos insertar un texto en el mismo. No debemos olvidar cerrar siempre el archivo después de leer o modificar sus contenidos con el método 'close'. Si abrimos el archivo con nuestro explorador de archivos, veremos el texto que contiene.

Usando un bucle 'for' podemos insertar automáticamente múltiples líneas de texto:

Lectura de archivos

Para leer un archivo, primero debemos abrirlo con la función 'open' y la opción 'r' que indica lectura (read). El método 'read' leerá todo el archivo de una vez si no se especifica ningún argumento. Importante, después de leerlo debemos cerrarlo con la función close.

Una  forma más adecuada de leer un fichero puede ser línea a línea con un bucle 'for', cada línea será almacenada en la variable 'line' en cada iteración.

Existen varias formas alternativas de leer los ficheros, entre ellas los métodos 'read' y 'readline', ambos aceptan especificar el número de caracteres que serán leídos. En próximas lecturas, Python continuará en la posición que terminó la anterior.

Ejercicio. Contar el número de genes codificantes que tiene el genoma de Escherichia coli

Para ello, primero descargaremos el fichero del proteoma de E. coli del siguiente enlace. Después, copiaremos el fichero descargado a nuestro directorio de trabajo. Y por último escribiremos un código en Python que cuente el número de veces que aparece el símbolo '>' al comienzo de una línea, dicho símbolo indica el comienzo de una proteína.

Si hemos hecho todo bien, el número de genes debería ser '4140', o similar (las nuevas versiones del genoma pueden variar ligeramente dicho número). Podemos confirmarlo en la web de KEGG.

Próxima lección

 En la próxima lección se hará una introducción a las expresiones regulares.

Curso de Python para biólogos - Lección 6. Bucles 'for'

En la lección de hoy presentaremos los bucles 'for', muy similares a los 'while' explicados en la lección 4, pero con un código más sencillo.

Bucles 'for':

Un bucle 'for', al igual que 'while', repite la ejecución de un bloque de código un número determinado de veces. Si invocamos el bucle 'for' con un nombre de variable más 'in' y una lista, el número de repeticiones vendrá determinado por el número de elementos de la lista, que serán pasados de uno en uno a la variable durante cada iteración. Veamos algunos ejemplos:

Con la función 'range' podemos especificar un listado de números que serán pasados a la variable especificada en el bucle. El primer parámetro de la función será el número inicial en el bucle, el segundo parámetro indicará el último número y el tercer parámetro proporcina el incremento a aplicar en cada iteración, por defecto el incremento es 1.

Como ya se ha comentado 'for' es una simplificación de 'while' cuando se trabaja con listas o números. El mismo código con 'while' es posible, pero será más largo y complejo.

Veamos como podemos usar 2 bucles 'for' anidados para recorrer los elementos de una matriz:

Sentencias de control de bucles: 'break', 'continue' y 'pass'

A veces nos interesará salir de un bucle (ya sea 'while' o 'for') antes de terminar todas las iteraciones, la forma de conseguirlo es mediante las sentencias de control 'break' y 'continue'. 'Break' terminará totalmente el bucle y continuará la ejecución del código del resto de programa. 'Continue' terminará la ejecución de una iteración y pasará directamente a la siguiente iteración del bucle, sin salir del bucle. 'Pass' no hace nada, es simplemente una sentencia que puede ser usada cuando no se requiere ejecutar ninguna acción pero es requerido escribir algo.

Bucles 'for' y diccionarios:

Los bucles 'for' también pueden ser útiles para procesar una a una las claves de un diccionario, sus valores o ambas cosas a la vez.


Ejercicios: 

Volvamos a los ejercicios propuestos en la lección anterior y resueltos con bucles 'while', veamos cómo pueden resolverse de una forma más sencilla mediante bucles 'for'.



Próxima lección

En la próxima lección se explicará como leer y escribir archivos con Python.



23 de marzo de 2015

Curso de Python para biólogos - Lección 5. Funciones y ejercicios prácticos

Hoy descansaremos un poco y sólo explicaremos un nuevo concepto teórico, pero muy importante, las funciones en Python. Tras ello se propondrán varios ejercicios para aplicar los conocimientos adquiridos en las lecciones previas (1, 2, 3 y 4).

Funciones en Python

Una función es un bloque de código que toma ciertos datos o variables como argumentos y devuelve otros datos o variables como resultado. Aunque no nos hayamos dado cuenta, ya hemos usado funciones anteriormente: print(), input(), int(), str(), len(), type(), min(), max()...dichas funciones vienen por defecto con Python y alguien las ha escrito previamente para que nosotros las podamos usar. La importancia fundamental de las funciones es que nos permiten escribir un código una sola vez y utilizarlo todas las veces que sea necesario sin volver a escribirlo, lo cual nos ahorra tiempo y simplifica los programas.

Las funciones se especifican con 'def' seguido del nombre de la función y entre paréntesis tantas variables como argumentos utiliza, estas variables guardarán los argumentos que demos al llamar a la función. No hay que olvidar los dos puntos al final de esta primera línea y escribir el bloque de código de la función tabulado (4 espacios). Al final de la función el resultado de la misma se devuelve con el comando 'return'. Para ejecutar o llamar una función simplemente hay que escribir su nombre y entre paréntesis sus argumentos. El resultado/s de las funciones los podemos guardar en variables o usarlos directamente.

Veamos en el primer ejemplo cómo escribir una función que realiza la suma de dos números y la devuelve como resultado. En el segundo ejemplo, la función recibe un nombre y devuelve una frase dando la bienvenida.

Ejercicio 1: Calcular el factorial de un número

El factorial de un número se define como el producto de todos los números enteros positivos desde 1. El ejercicio propuesto consiste en escribir una función que lo calcule usando un bucle 'while' que vaya restando (o sumando) número a número y guardando el resultado de la multiplicación por el anterior. No vale mirar en Google y usar funciones ya escritas.

Ejercicio 2: Contar el número de nucleótidos en una secuencia de DNA

Ahora escribiremos una función que cuente el número de pares de bases de una secuencia de DNA tomada como argumento de la función. Creo que este problema será más sencillo que el anterior, el código de la función puede ocupar tan sólo una línea, pero sugiero utilizar el bucle 'while' para leer letra a letra y aprender más.

Ejercicio 3: Encontrar un codón de inicio de la traducción en una secuencia de DNA

El ejercicio consiste en encontrar el codón de inicio de la traducción, osea la palabra 'ATG', en una secuencia de DNA. La función puede ser muy sencilla utilizando expresiones regulares, pero como no las hemos estudiado todavía, propongo reutilizar el código del Ejercicio 2 que debería leer letra a letra la secuencia e ir extrayendo palabras de 3 letras en cada iteración del bucle. Comprobar si la palabra es 'ATG' con una sentencia condicional, si lo es retornar la posición como resultado de la función, y si no seguir hasta terminar de leer toda la secuencia.

Ejercicio 4: Calculando una secuencia consenso

El último ejercicio de hoy consiste en escribir una función que tome como argumentos 3 secuencias de DNA (preferiblemente de la misma longitud, para evitar problemas y errores, si no calcular el consenso hasta la longitud de la secuencia más corta) y devuelva una única secuencia que contenga en cada posición el nucleótido más frecuente o en su defecto la letra 'N'. Este ejercicio es el más complejo y requiere utilizar bucles 'while', sentencias condicionales...


Buena suerte y nos vemos en la próxima lección.

19 de marzo de 2015

Curso de Python para biólogos - Lección 4. Entrada de datos y bucles while

En esta nueva lección aprenderemos a pedir datos al usuario desde nuestro programa y a realizar nuestros primeros bucles. Como veremos, un bucle consiste en repetir un bloque de código varias veces sin tener que volver a escribirlo.

Entrada de datos desde la línea de comandos

A veces necesitaremos introducir datos en nuestro programa de forma interactiva, lo que significa que preguntaremos o pediremos al usuario cierta información (por ej. linux siempre nos pregunta antes de instalar un nuevo programa y debemos responder 'yes' o 'no'). En Python se utiliza la función 'input', dicha función devuelve el texto introducido por el usuario antes de pulsar Enter. El texto tendrá formato de cadena (string), por lo que no podrá ser utilizado directamente en caso de ser un número, habrá que convertir la cadena en número.

Conversión entre diferentes formatos de datos

Muchas funciones y métodos de Python sólo aceptan un tipo de datos, por ejemplo 'print' requiere cadenas o las operaciones aritméticas requieren números. Los tipos de datos que conocemos son: números, cadenas, listas y diccionarios. Simplificando, en Python existen 2 clases de números, los enteros (int) y los decimales (float). Por ello es importante conocer cómo convertir una cadena (devuleta por la función 'input' por ejemplo) en un número antes de realizar operaciones aritméticas, o convertir un número en una cadena antes de imprimirlo.
Si intentamos elevar al cuadrado un número introducido mediante 'input' nos dará error, porque antes deberemos convertir la cadena devuelta por 'input' en un tipo de número (int o float).
Si el texto devuelto por 'input' contiene decimales, al intentar convertirlo en número entero nos devolverá un error. La solución es convertirlo a decimal primero. Pero cuidado, operar con números enteros es diferente que con números decimales, y los resultados pueden variar mucho.

Validación de datos con 'try' y 'except':

Como hemos visto en los ejemplos anteriores, muchas veces tenemos errores al intentar operar con los diferentes tipos de datos. Una forma de evitar problemas es detectar los errores con la sentencia 'try:' y evitar que se ejecute el código que origina el error para ejecutar un código alternativo especificado por 'except:'. Se podría traducir cómo: "en caso de error... hacer lo siguiente...".
 Notar cómo siempre hay diferentes maneras de hacer lo mismo...
Pero 'try' y 'except' no son milagrosos, no permiten por ejemplo corregir errores en la sintaxis de nuestro código, como puede ser olvidarnos un paréntesis o unas comillas.

Bucles 'while':

Por fin vamos a adentrarnos en el fascinante mundo de los bucles. Un bucle es un bloque de código que es ejecutado varias veces, pero sólo hay que escribirlo una vez :)

La particularidad de un bucle 'while' es que es ejecutado indefinidamente (bucle infinito) mientras la condición que le sigue es cierta (True). Como en el caso de las sentencias condicionales con 'if', el código a ejecutar mientras se cumpla la condición debe ser tabulado 4 espacios para ser reconocido por Python. Veamos unos ejemplos.
Empecemos a aplicar los conocimientos adquiridos y veamos cómo usar sentencias condicionales (if...elif...else...) dentro de un bucle, la tabulación será muy importante...

Ejercicio1. Programa para adivinar un número:

Para terminar la lección haremos dos ejercicios muy interesantes. El primero será escribir un código que genera un número aleatorio entre 1 y 100, y nos preguntará sucesivante por el número hasta que lo adivinemos. Las primeras líneas (from random import randint y number=randint(1,100)) son necesarias para generar el número aleatorio guardado en la variable 'number' pero serán explicadas en próximas lecciones.
Pero, qué pasa si nos equivocamos y no escribimos un número? El programa devolverá un error a no ser que nos preparemos para ello:

Ejercicio2. Cantar una canción

En el último ejercicio de hoy, crearemos un código que nos pida escribir una canción línea a línea y después la mostrará en pantalla 2 veces, imprimiendo línea por línea con un bucle 'while'.
  
Próxima lección: bucles 'for' 




9 de marzo de 2015

Curso de Python para biólogos - Lección 3. Data comparison and conditional statements

Comenzamos la semana con una nueva lección de Python, todavía no quedan un par de lecciones de conceptos básicos antes de empezar a hacer algún pequeño programa para resolver problemas biológicos. En la presente lección explicaremos cómo se pueden comparar datos y condicionar la ejecución del código de acuerdo a dichas comparaciones.



Expresiones booleanas

Una expresión booleana es una comparación entre 2 valores o variables que devuelve un resultado de cierto (true) si ambos valores son iguales o ambas variables contienen el mismo valor y falso (false) si son diferentes. True y false son los dos únicos valores de otro tipo de datos llamado booleano (pero no queremos explicar más tipos de datos, con los ya vistos es suficiente: números, cadenas, listas y diccionarios).

Operadores de comparación y lógicos

Se denominan operadores de comparación a las expresiones mostradas en la imagen (==, !=, <, >, <= y >=), permiten realizar comparaciones de dos valores o variables con 2 únicos posibles resultados: true o false.
Los comparadores lógicos son 'and', 'or' and 'not' y permiten combinar diferences comparaciones. En la tabla se muestran los posibles resultados. 'and' da como resultado true si todas las comparaciones son ciertas y false si una de ellas es falsa. 'or' devuelve true si al menos una de las comparaciones es cierta y false si todas son falsas. 'not' cambia el resultado de una comparación de true a false o al contrario.
 Veamos unos ejemplos:

Sentencias condicionales

Una sentencia condicional decide si se ejecuta o no el código indentado que le sigue a continuación, si la comparación es cierta el código se ejecuta, si es falsa no sucede nada. Las sentencias condicionales se escriben con el operador 'if' seguido de una comparación y termina con dos puntos ':'. En las siguientes líneas se escribe el código indentado con espacios o tabulador (recomendado 4 espacios). El código indentado sólo se ejecutará si la comparación da como resultado true.
Las sentencias condicionales se pueden hacer más completas añadiendo condiciones con el operador 'elif'. Si la primera condición (con 'if') no se cumple, se pasará a comprobar si se cumple la segunda (con 'elif') y así sucesivamente hasta que se agoten las condiciones. Si todas las comparaciones con 'if' y 'elif' son falsas, entonces se ejecutará el código especificado por el operador 'else'.
Para usar las sentencias condicionales con listas, o con valores de diccionarios (recordar dict.values() devuelve una lista de los valores asociados a las claves y dict.keys() devuelve una lista de todas las claves) existe la expresión if in :. Dicha expresión permite buscar un valor en una lista y si lo encuentra ejecuta el código indentado. Es una expresión muy útil que usaremos en futuras lecciones.

Condicionales anidados

Para terminar por hoy veremos une ejemplo donde hay una combinación de comparaciones y operadores lógicos muy larga y que hace confuso el código (lo que también propicia errores al escribirlo, por ejemplo si nos dejamos un paréntesis). El mismo código se puede escribir introduciendo unas sentencias condicionales dentro de otras, el código es más largo, pero también más claro y conciso. Cada sentencia condicional que se escribe debe ser indentada, si escribimos una sentencia condicional dentro de otra deberemos indentar el doble de espacios.

Próxima lección

En la próxima lección veremos como pedir al usuario que introduzca datos y cómo realizar bucles 'while'.