.. _interrorapide20minutes201511rst: ============================================================== 1A.e - Correction de l’interrogation écrite du 6 novembre 2015 ============================================================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/exams/interro_rapide_20_minutes_2015_11.ipynb|*` listes et dictionnaires .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: Enoncé 1 ~~~~~~~~ Q1 ^^ Le programme suivant provoque une erreur de temps en temps, pourquoi ? .. code:: ipython3 import random l = [0, 1, 2, 3, 4] i = random.randint(0, 5) del l[i] # déclenche une exception de temps en temps Pour le faire planter de façon quasi systémtique, on l’insère dans une boucle : .. code:: ipython3 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 :: --------------------------------------------------------------------------- IndexError Traceback (most recent call last) in () 3 l = [0, 1, 2, 3, 4] 4 i = random.randint(0, 5) ----> 5 del l[i] IndexError: list assignment index out of range L’erreur vient du faire que la fonction `randint `__ tire un nombre entre 0 et 5 inclus. La liste ne contient que 5 éléments. Le dernier a pour indice 4. Q2 ^^ A votre avis, qu’a voulu dire l’auteur de ces lignes ? Corriger ce programme. .. code:: ipython3 mat = {} for i in range(0,3) and j in range(0,3): # déclenche une exception mat[i,j] = 0 :: --------------------------------------------------------------------------- NameError Traceback (most recent call last) in () 1 mat = {} ----> 2 for i in range(0,3) and j in range(0,3): 3 mat[i,j] = 0 NameError: name 'j' is not defined 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. .. code:: ipython3 mat = {} for i in range(0,3): for j in range(0,3): mat[i,j] = 0 Q3 ^^ Ecrire une fonction qui met en majuscule les voyelles d’un mot. Exemple : python :math:`\rightarrow` pYthOn Il n’existe pas une seule solution pour faire ceci. En voici quelques unes. .. code:: ipython3 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") .. parsed-literal:: 'pYthOn' .. code:: ipython3 def maj_voy(mot): return "".join(map(lambda c: c.upper() if c in "aeiouy" else c, mot)) maj_voy("python") .. parsed-literal:: 'pYthOn' .. code:: ipython3 def maj_voy(mot): return "".join( c.upper() if c in "aeiouy" else c for c in mot ) maj_voy("python") .. parsed-literal:: 'pYthOn' Enoncé 2 ~~~~~~~~ Q1 ^^ La variable ``i`` est soit 1, soit 2. Que fait le code suivant et comment le simplifier en une ligne ? .. code:: ipython3 i = 2 if i == 2: i = 1 else: i = 2 print(i) .. parsed-literal:: 1 L’énoncé était un peu ambigü mais il fallait que le code fonctionne dans les deux cas : ``i==1`` et ``i==2`` .. code:: ipython3 i = 3-i print(i) .. parsed-literal:: 2 .. code:: ipython3 i = i%2 + 1 print(i) .. parsed-literal:: 1 Q2 ^^ Le programme suivant produit une erreur. Modifier le programme pour qu’il ne la produise plus. .. code:: ipython3 l = {{}} # déclenche une exception for i,j in zip(range(0,3), range(0,3)): l[i,j] = 1 :: --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 l = {{}} 2 for i,j in zip(range(0,3), range(0,3)): 3 l[i,j] = 1 TypeError: unhashable type: 'dict' La première ligne contient des doubles accolades sans raison. .. code:: ipython3 l = {} for i,j in zip(range(0,3), range(0,3)): l[i,j] = 1 Q3 ^^ Ecrire une fonction qui double toutes les voyelles. Exemple : python :math:`\rightarrow` pyythoon .. code:: ipython3 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") .. parsed-literal:: 'pyythoon' Ou plus court encore : .. code:: ipython3 def double_voy(mot): return "".join(map(lambda c: c*2 if c in "aeiouy" else c, mot)) double_voy("python") .. parsed-literal:: 'pyythoon'