Introducción a la programación con Python

Para complementar estos ejercicios tienes más material en el curso de análisis de datos con Python. Existe un excelente libro de introducción a Python: Python Crash Course.

Recuerda que puedes trabajar en estos ejercicios con el editor online de Future coder.

Para instalar Python junto a las librerías más utilizadas en bioinformática puedes utilizar anaconda.

Las soluciones a los ejercicios puedes encontraslas en: ejercicios y soluciones.

Ejercicios

Adivinar un número

Escribe un programa que elija al azar un número entre el uno y el diez, que le pregunte al jugador un número y que compruebe si has acertado o no.

Par o impar

Crea un programa que pida un número entero y que devuelva si es par o impar.

number = input('Introduce un entero: ')
number = int(number)
if number % 2:
    print(f'{number} is odd')
else:
    print(f'{number} is even')

Palindromos

Escribe un programa que compruebe si una palabra es palindrómica o no.

word = input('Introduce una palabra: ')

if word.lower() == word.lower()[::-1]:
    print(f'{word} es palindrómica')
else:
    print(f'{word} no es palindrómica, al revés se leería: {word[::-1]}')

Sitio de restricción

Busca el sitio de restricción en una secuencia de ADN.

eco_ri_site = 'GAATTC'
sequence = 'ctagctagtcgtagctagtcagaattcgtcgtagtcagcta'

print(sequence.upper().find(eco_ri_site))

Secuencia reversa y complementaria

Haz un programa que cree una secuencia de ADN reversa y complementaria.

seq = 'ACTGGTA'

COMPLEMENTARY_NUCLS = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'}

comp_seq = []
for nucl in reversed(seq):
    compl_nucl = COMPLEMENTARY_NUCLS[nucl]
    comp_seq.append(compl_nucl)
comp_seq = ''.join(comp_seq)
print(comp_seq)

seq2 = 'CTAGACTA'

Conversor Fahrenheit a Celsius

Crea una función que convierta de fahrenheit a celsius y otra que lo haga al revés.

def convert_to_celsius(fahrenheit):
    celsius = (fahrenheit - 32.0) * (5.0 / 9.0)
    return celsius


def convert_to_fahrenheit(celsius):
    fahrenheit = (celsius * 9.0 / 5.0) + 32
    return fahrenheit


fahrenheit = input("Temperature in fahrenheit: ")
fahrenheit = float(fahrenheit)

celsius = convert_to_celsius(fahrenheit)
print("Celsius: ", celsius)
fahrenheit = convert_to_fahrenheit(celsius)
print("Fahrenheit", fahrenheit)

Juego del ahorcado

Crea un juego del ahorcado.

import random

DICTIONARY = ['hola', 'caracola', 'casa', 'barco']
INITIAL_NUM_ATTEMPS = 10

def create_revealed_string(secret_word, guessed_letters):

    num_letters_missing = 0
    revealed_string = ''
    for letter in secret_word:
        if letter.upper() in guessed_letters:
            revealed_letter = letter
        else:
            revealed_letter = '-'
            num_letters_missing += 1
        revealed_string += revealed_letter
    return revealed_string


def play_game():
    secret_word = random.choice(DICTIONARY)
    guessed_letters = set()
    num_attempts = INITIAL_NUM_ATTEMPS
    won = None
    while True:
        guessed_letter = input('Pick a letter ')
        guessed_letters.add(guessed_letter.upper())

        revealed_string = create_revealed_string(secret_word, guessed_letters)
        num_attempts -= 1

        num_letters_to_guess = revealed_string.count('-')
        if not num_letters_to_guess:
            won = True
            break
        elif num_letters_to_guess:
            if num_attempts:
                print('The guess so far: ', revealed_string, guessed_letters)
            else:
                won = False
                break

    if won:
        print('Congratulations, you have won the game')
    else:
        print('You have lost')
    print('The secret word was: ', secret_word)


play_game()

Hola mundo en el Visual Studio Code

El Visual Studio Code es un excelente editor de código.

Más ejercicios

Frío o caliente

Escribe un programa que pregunte al usuario la temperatura actual y que responda diciendo si hace frío o calor.

temperatura_habitacion = input('Cual es la temperatura actual? ')
temperatura_habitacion = int(temperatura_habitacion)

if temperatura_habitacion < 16:
    print('Hace bastante frío')
elif temperatura_habitacion < 22:
    print('Hace algo de frío')
elif temperatura_habitacion < 26:
    print('Se está bastante bien')
elif temperatura_habitacion < 28:
    print('Hace algo de calor')
else:
    print('Hace calor')

Divide la cadena de texto

Escribe un programa que elimine un número determinado de letras, el que se le pida en una variable, de una cadena de texto e imprima el resultado.

texto = 'Hola Caracola'
num_caracteres_a_eliminar = 5
texto = texto[num_caracteres_a_eliminar:]
print(texto)

Escribe asteriscos

Escribe un programa que pida un número e imprima ese mismo número de asteriscos “*”. (Puedes utilizar la función range).

numero = input('Escribe un número: ')
numero = int(numero)

for indice in range(numero):
    print('*')

Elimina letras

Escribe un programa que elimine algunas letras de una cadena de texto, las que le des en una lista, utilizando un bucle for.

texto = 'Hola Caracola'
caracteres_a_eliminar = ['a', 'e', 'i', 'o', 'u']

nuevo_texto = ''
for letra in texto:
    if letra in caracteres_a_eliminar:
        continue
    nuevo_texto = nuevo_texto + letra

print(nuevo_texto)

Escribe el número reverso

Escribe un programa que genere el número con las cifras al revés separadas por espacios. Por ejemplo, si le das “7563” el resultado debería ser “3 6 5 7”.

numero = 56783
numero = str(numero)

cifras = []
for cifra in reversed(numero):
    cifras.append(cifra)

numero = ' '.join(cifras)
print(numero)

Par o impar

Escribe un programa que imprima cada número del 1 al 20 y que indique si es par o impar.

for numero in range(1, 21):
    if numero % 2:
        print(numero, 'impar')
    else:
        print(numero, 'par')

Tablas de multiplicar

Escribe un programa que imprima las tablas de multiplicar hasta el 10.

for numero1 in range(1, 10):
    for numero2 in range(1, 10):
        print(f'{numero1} x {numero2} = ', numero1 * numero2)
    print()

Pirámide de números

Escribe un programa que imprima el siguiente patrón:

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
for numero in range(1, 6):
    numero_chr = str(numero)
    numeros = [numero_chr] * numero
    print(' '.join(numeros))

Caracteres impares

Escribe un programa que imprima las letras impares de una cadena de texto. (Puedes utilizar la función enumerate)

texto = 'Hola caracola'

for indice, letra in enumerate(texto):
    if indice % 2:
        continue
    else:
        print(letra)

Suma los primeros números

Escribe un programa que sume los números desde 0 a 50 utilizando un bucle for.

ultimo_numero = 50

suma = 0
for num in range(ultimo_numero + 1):
    suma = suma + num

print('La suma total es: ', suma)

Ejercicios con listas y diccionarios

Máximo y mínimo

Crea una función que calcule el máximo y el mínimo de una lista de números utilizando un bucle for. Compara el resultado con el que dan las funciones min y max..

def calcula_min_y_max(numeros):
    min_ = None
    max_ = None
    for numero in numeros:
        if min_ is None or numero < min_:
            min_ = numero
        if max_ is None or numero > max_:
            max_ = numero
    return min_, max_

numeros = [3, 4, 5, 2]
min_, max_ = calcula_min_y_max(numeros)
print(min_, min(numeros))
print(max_, max(numeros))

Reverso de una lista

Escribe un programa que cree una lista en orden inverso utilizando un bucle for y compara con el resultado de la función reversed.

def crea_lista_reversa(lista):
    reversa = []
    for index in range(1, len(lista) + 1):
        reversa.append(lista[-index])
    return reversa

lista = ['hola', 0, 3, None, True]
rev_lista = crea_lista_reversa(lista)
print(rev_lista)
print(list(reversed(lista)))

Filtra una lista de números

Escribe una función a la que dada una lista de números y un valor máximo, devuelva una nueva lista con los números menores o iguales al valor máximo.

def elimina_valores_grandes(numeros, maximo_aceptable):
    numeros_aceptados = []
    for numero in numeros:
        if numero <= maximo_aceptable:
            numeros_aceptados.append(numero)
    return numeros_aceptados

numeros = [1, 8, 5, 10, 2, 7]
numeros_pequenos = elimina_valores_grandes(numeros, 5)
print(numeros_pequenos)

Cuenta las palabras

Dada una cadena de texto con palabras escribe un programa que cuente el número de veces que aparece cada palabra.

from collections import Counter

def  cuenta_palabras(texto):
    palabras = texto.strip().split(' ')
    cuentas = {}
    for palabra in palabras:
        palabra = palabra.lower()
        if palabra in cuentas:
            cuentas[palabra] += 1
        else:
            cuentas[palabra] = 1
    return cuentas

def  cuenta_palabras2(texto):
    palabras = texto.strip().lower().split(' ')
    cuentas = Counter(palabras)
    return cuentas

texto = 'En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lantejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda.'
cuentas = cuenta_palabras(texto)
print(cuentas)
cuentas2 = cuenta_palabras2(texto)
print(cuentas2)

Base datos de genes

Disponemos de la siguiente información almacenada en un fichero o cadena de texto.

'''nombre funcion cromosoma start end
gen1 kinasa chrom1 13904 18904
gen2 polimerasa chrom1 43904 49904
gen3 fosfatasa chrom2 1904 5904
'''

Queremos crear una base de datos que guarde la información relativa a los genes, por ejemplo en un diccionario. Una vez creada la base de datos deseamos que el usuario pueda pedir la información dando el nombre de un gen y que el programa imprima la información relativa a ese gen.

from csv import DictReader
from io import StringIO

texto = '''nombre funcion cromosoma start end
gen1 kinasa chrom1 13904 18904
gen2 polimerasa chrom1 43904 49904
gen3 fosfatasa chrom2 1904 5904
'''

def crea_base_de_datos(texto):
    genes = {}
    primera_linea = True
    for linea in texto.splitlines():
        if primera_linea:
            primera_linea = False
            continue
        items = linea.strip().split()
        gen = {'funcion': items[1], 'cromosoma': items[2], 'start': int(items[3]), 'end': int(items[4])}
        genes[items[0]] = gen
    return gen

def crea_base_de_datos2(fhand):
    fields = next(fhand).strip().split()
    reader = DictReader(fhand, fields, delimiter=' ')
    genes = {}
    for record in reader:
        record['start'] = int(record['start'])
        record['end'] = int(record['end'])
        genes[record['nombre']] = record
    return genes


def consulta_base_datos(genes):
    while True:
        nombre_gen = input('introduce el nombre de un gen: ')
        if nombre_gen == 'fin':
            break
        elif nombre_gen in genes:
            gen = genes[nombre_gen]
            print(f'Información para {nombre_gen}: {gen["funcion"]} {gen["cromosoma"]}:{gen["start"]}-{gen["end"]}')
        else:
            print(f'Gen desconocido: {nombre_gen}. Escribe "fin" para terminar.')


genes = crea_base_de_datos(texto)
# Otra alternativa
genes = crea_base_de_datos2(StringIO(texto))

consulta_base_datos(genes)

Lee un fichero fasta

Crea una función capaz de leer ficheros fasta.

from io import StringIO

def parse_fasta(fhand):
    seq = None
    for line in fhand:
        line = line.strip()
        if line[0] == ">":
            if seq:
                yield seq
            items = line[1:].split(" ", 1)
            if len(items) == 1:
                seq = {"name": items[0], "seq": ""}
            elif len(items) == 2:
                name, description = items
                seq = {"name": name, "seq": "", "description": description}
            else:
                raise RuntimeError("Fixme, we should not be here")
        else:
            seq["seq"] += line
    if seq:
        yield seq

if __name__ == "__main__":
    fasta_fhand = StringIO(">seq1 description\nATCT\nACTGC\n>seq2\nACTGTG\n")
    seqs = parse_fasta(fasta_fhand)
    print(list(seqs))

Calcular el porcentaje de GC por secuencia

Dado un fichero fasta con secuencias, calcula el porcentaje de GC para cada una de ellas.

Introducción a pandas y numpy

Pandas y numpy son dos librerías ampliamente utilizadas en el análisis de datos.

¿Qué son los dataframes y arrays?.

Numpy tiene un excelente tutorial de introducción numpy, además de mucha más documentación.

Pandas tiene un tutorial sobre DataFrame y Series y una introducción a pandas en 10 minutos.

En mi curso sobre análisis de datos hay otra introducción a numpy y pandas que incluye ejercicios.