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.