<jupyter_start><jupyter_text>Boucle non bornée - **while**  1 - Somme des nombres d'une liste (encore) Voici une implémentation d'un élève de la fonction `somme(valeurs)` en utilisant une boucle **while**.<jupyter_code>def somme(valeurs):
    s = 0
    i = 1 # rôle d'index
    while i < len(valeurs)
        s += valeur
    return s<jupyter_output><empty_output><jupyter_text>Cette implémentation comporte quatres erreurs (syntaxe ou «logique»). *Les trouver et les corriger*. Voici les erreurs:- **syntaxe** - manque `:` en fin de ligne `while`,- **«logiques»** - boucle infini: la condition de boucle ne varie pas elle vaudra donc toujours `True`- **syntaxe** - `valeur` n'est pas défini; semble désigner une valeur particulière de la liste `valeurs`,- **«logiques»** - l'index `i` devrait être initialisé à zéro pour parcourir toute la liste```pythondef somme(valeurs):    s = 0    i = 0 4    while i < len(valeurs): 1        valeur = valeurs[i] 3        s += valeur        i += 1 2    return s```  2 - Lire une liste en commençant par la fin La fonction `droite_vers_gauche(xs)`, *qui ne renvoie rien*, **affiche** les valeurs de la liste `xs` de la droite vers la gauche (les derniers en premier). Par exemple:- `droite_vers_gauche([1, 2, 3])` affiche 3, 2, 1.Implémenter cette fonction en utilisant une bouche non bornée.<jupyter_code>def droite_vers_gauche(xs):
    i = len(xs) - 1 # index de la dernière valeur de xs
    while i >= 0: # tant que l'index est valide
        print(xs[i])
        i -= 1

droite_vers_gauche([1, 2, 3])<jupyter_output><empty_output><jupyter_text>3 - Demander un nombre d'un intervalle donnéImplémenter la fonction `saisir_nb_dans(a, b)`:- Elle est chargée de demander à l'utilisateur un nombre et de s'assurer qu'il est bien dans l'intervalle $[a, b]$. - Si l'utilisateur donne un nombre incorrect, elle lui indique et lui redemande un nombre. - Finalement, elle renvoie toujours un nombre situé dans cet intervalle (ou produit une erreur si l'utilisateur saisi autre chose qu'un nombre).<jupyter_code>def saisir_nb_dans(a, b):
    # si les nombres ne sont pas dans le bon ordre, les échanger
    if b < a:
        a, b = b, a
    
    while True:
        nb = input(f"Nombre entre {a} et {b}? ") # attention nb est une str donc conversion:
        nb = float(nb) # risque de produire une erreur si l'utilisateur saisi "q" par ex.
        if a <= nb <= b:
            return nb
        print("Ce nombre n'est pas dans l'intervalle...")

v = saisir_nb_dans(5, 10)
assert 5 <= v <= 10<jupyter_output><empty_output><jupyter_text>4 - Écriture binaire d'un nombreSouvenez-vous de l'algorithme qui consiste à diviser successivement un nombre pour trouver son écriture binaire. Voici un exemple pour vous rafraîchir la mémoire:        34 | 0        17 | 1        8  | 0       donc 34 = 100010        4  | 0        2  | 0        1  | 1 Implémenter la fonction `dec_vers_bin(nb)` qui renvoie l'écriture binaire de `nb` sous la forme d'une chaîne de caractère. Par exemple:- `dec_vers_bin(34)` renvoie `"100010"`.<jupyter_code>def dec_vers_bin(nb):
    q, r = nb, 0 # q pour quotient, r pour reste
    res = ""
    while q > 0:
        r = q % 2 # attention de calculer le reste avant de modifier le quotient
        q = q // 2
        res = str(r) + res # concaténation...
    return res

assert dec_vers_bin(34) == "100010"<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10345846881466154, 'fraction_numerical': 0.02157848063848655, 'mean_word_length': 3.310828025477707, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '43593', 'license': 'CC0-1.0', 'n_tokens_mistral': 1256, 'n_tokens_neox': 1213, 'n_words': 439, 'path': '00_bases_python/12_exercices_boucle_while.ipynb', 'repo_name': 'efloti/cours-nsi-premiere', 'size': '3383'}