<jupyter_start><jupyter_text>1A.e - Correction de l'interrogation écrite du 6 novembre 2015listes et dictionnaires<jupyter_code>from jyquickhelper import add_notebook_menu
add_notebook_menu()<jupyter_output><empty_output><jupyter_text>Enoncé 1  Q1Le programme suivant provoque une erreur de temps en temps, pourquoi ?<jupyter_code>import random
l = [0, 1, 2, 3, 4]
i = random.randint(0, 5)
del l[i]  # déclenche une exception de temps en temps<jupyter_output><empty_output><jupyter_text>Pour le faire planter de façon quasi systémtique, on l'insère dans une boucle :<jupyter_code>import random
for i in range(0,100):
    l = [0, 1, 2, 3, 4]
    i = random.randint(0, 5)
    del l[i]  # déclenche une exception quasi sûrement<jupyter_output><empty_output><jupyter_text>L'erreur vient du faire que la fonction [randint](https://docs.python.org/3.4/library/random.htmlrandom.randint) tire un nombre entre 0 et 5 inclus. La liste ne contient que 5 éléments. Le dernier a pour indice 4.  Q2A votre avis, qu'a voulu dire l'auteur de ces lignes ? Corriger ce programme.<jupyter_code>mat = {}
for i in range(0,3) and j in range(0,3): # déclenche une exception
    mat[i,j] = 0<jupyter_output><empty_output><jupyter_text>C'est une erreur que je vois souvent chez ceux débutent en programmation. On souhaite ici faire une double boucle imbriquée pour remplir le dictionnaire ``mat`` de 0.<jupyter_code>mat = {}
for i in range(0,3):
    for j in range(0,3):
        mat[i,j] = 0<jupyter_output><empty_output><jupyter_text>Q3Ecrire une fonction qui met en majuscule les voyelles d'un mot. Exemple :  python $\rightarrow$ pYthOnIl n'existe pas une seule solution pour faire ceci. En voici quelques unes.<jupyter_code>def maj_voy(mot):
    l = []
    for c in mot:
        if c in "aeiouy":
            l.append(c.upper())
        else:
            l.append(c)
    return "".join(l)

maj_voy("python")
def maj_voy(mot):
    return "".join(map(lambda c: c.upper() if c in "aeiouy" else c, mot))

maj_voy("python")
def maj_voy(mot):
    return "".join( c.upper() if c in "aeiouy" else c for c in mot )

maj_voy("python")<jupyter_output><empty_output><jupyter_text>Enoncé 2  Q1La variable ``i`` est soit 1, soit 2. Que fait le code suivant et comment le simplifier en une ligne ?<jupyter_code>i = 2
if i == 2:
    i = 1
else:
    i = 2
    
print(i)<jupyter_output>1<jupyter_text>L'énoncé était un peu ambigü mais il fallait que le code fonctionne dans les deux cas : ``i==1`` et ``i==2``<jupyter_code>i = 3-i
    
print(i)
i = i%2 + 1

print(i)<jupyter_output>1<jupyter_text>Q2Le programme suivant produit une erreur. Modifier le programme pour qu'il ne la produise plus.<jupyter_code>l = {{}}  # déclenche une exception
for i,j in zip(range(0,3), range(0,3)):
    l[i,j] = 1<jupyter_output><empty_output><jupyter_text>La première ligne contient des doubles accolades sans raison.<jupyter_code>l = {}
for i,j in zip(range(0,3), range(0,3)):
    l[i,j] = 1<jupyter_output><empty_output><jupyter_text>Q3Ecrire une fonction qui double toutes les voyelles.Exemple : python $\rightarrow$ pyythoon<jupyter_code>def double_voy(mot):
    l = []
    for c in mot:
        if c in "aeiouy":
            l.append(c*2)
        else:
            l.append(c)
    return "".join(l)

double_voy("python")<jupyter_output><empty_output><jupyter_text>Ou plus court encore :<jupyter_code>def double_voy(mot):
    return "".join(map(lambda c: c*2 if c in "aeiouy" else c, mot))

double_voy("python")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11712485681557847, 'fraction_numerical': 0.021191294387170677, 'mean_word_length': 4.423913043478261, 'pattern_counts': {'":': 2, '<': 47, '<?xml version=': 0, '>': 47, 'https://': 1, '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': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '550655', 'license': 'MIT', 'n_tokens_mistral': 1394, 'n_tokens_neox': 1368, 'n_words': 381, 'path': '_doc/notebooks/exams/interro_rapide_20_minutes_2015_11.ipynb', 'repo_name': 'Jerome-maker/ensae_teaching_cs', 'size': '3492'}