# 🧬 Python pour les biologistes — Fonctions, `map`, `lambda` et `zip` ## 🧪 Exercice 1 — Calculer le contenu GC d’une séquence d’ADN **Contexte :** Le contenu en bases G et C (contenu GC) est un indicateur important en génomique, car il influence la stabilité de l’ADN et l’expression des gènes. **Consigne :** 1. Écrivez une fonction `gc_content(seq)` qui prend une séquence d’ADN et renvoie le pourcentage de GC. Appliquez ensuite cette fonction à une liste de séquences. 2. Utilisez `map` pour calculer le contenu GC de toutes les séquences d’une liste. ```python # Données d'exemple sequences = ["ATGCGC", "TTTTAA", "GCGCGC", "ATATAT"] ``` <details> <summary>💡 Correction</summary> ```python # Q1 def gc_content(seq): seq = seq.upper() gc_count = seq.count("G") + seq.count("C") return round(gc_count / len(seq) * 100, 2) sequences = ["ATGCGC", "TTTTAA", "GCGCGC", "ATATAT"] for s in sequences: print(f"{s}: {gc_content(s)}% GC") ``` </details> <details> <summary>💡 Correction</summary> ```python # Q2 gc_values = list(map(gc_content, sequences)) print(gc_values) ``` </details> --- ## 🌿 Exercice 2 — Normaliser des valeurs d’expression génique **Contexte :** En analyse transcriptomique, on compare souvent des niveaux d’expression génique entre gènes ou échantillons. Pour rendre ces valeurs comparables, il est courant de **normaliser** les données entre 0 et 1. **Consigne :** Vous disposez d’une liste de valeurs d’expression d’un échantillon. Écrivez une fonction `normalize(values)` qui : 1. Calcule le minimum et le maximum des valeurs. 2. Applique une transformation pour que chaque valeur soit comprise entre 0 et 1 : $$ x_{\text{norm}} = \frac{x - \min(x)}{\max(x) - \min(x)}$$ 3. Utilisez `map()` pour appliquer cette normalisation à toutes les valeurs. ```python # Données d'exemple expression = [10.0, 25.0, 30.0, 15.0, 50.0] ``` <details> <summary>💡 Correction</summary> ```python def normalize(values): min_v = min(values) max_v = max(values) return list(map(lambda x: round((x - min_v) / (max_v - min_v), 2), values)) expression = [10.0, 25.0, 30.0, 15.0, 50.0] normalized = normalize(expression) print("Valeurs d'origine :", expression) print("Valeurs normalisées :", normalized) ``` **Sortie attendue :** ``` Valeurs d'origine : [10.0, 25.0, 30.0, 15.0, 50.0] Valeurs normalisées : [0.0, 0.38, 0.5, 0.13, 1.0] ``` </details> --- ## 🧫 Exercice 3 — Associer les séquences à leurs identifiants avec `zip` **Contexte :** En bioinformatique, les séquences sont souvent associées à des identifiants uniques. **Consigne :** On dispose de deux listes : une liste d’identifiants et une liste de séquences. Combinez-les en une liste de tuples. ```python ids = ["seq1", "seq2", "seq3", "seq4"] sequences = ["ATGCGC", "TTTTAA", "GCGCGC", "ATATAT"] ``` <details> <summary>💡 Correction</summary> ```python paired = list(zip(ids, sequences)) print(paired) ``` </details> --- ## 🧠 Exercice 4 — Utiliser `lambda` pour transformer des données **Contexte :** Un biologiste souhaite convertir des niveaux d’expression génique exprimés en log2 vers une échelle linéaire. **Consigne :** ```python log_expr = [1.0, 2.5, -1.0, 0.0] # convertir chaque valeur : valeur = 2**x ``` <details> <summary>💡 Correction</summary> ```python log_expr = [1.0, 2.5, -1.0, 0.0] linear_expr = list(map(lambda x: 2 ** x, log_expr)) print(linear_expr) ``` </details> --- ## 🧍‍♀️ Exercice 5 — Combiner `zip`, `map` et `lambda` **Contexte :** On dispose de deux jeux de données d’expression génique (deux expériences). On souhaite calculer **l’expression moyenne par gène**. **Consigne :** ```python genes = ["geneA", "geneB", "geneC"] expr1 = [10.0, 5.0, 12.0] expr2 = [8.0, 7.0, 9.0] ``` <details> <summary>💡 Correction</summary> ```python genes = ["geneA", "geneB", "geneC"] expr1 = [10.0, 5.0, 12.0] expr2 = [8.0, 7.0, 9.0] averages = list(map(lambda x: (x[0] + x[1]) / 2, zip(expr1, expr2))) for g, avg in zip(genes, averages): print(f"{g}: {avg}") ``` </details> ---