{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A.e - Correction de l'interrogation \u00e9crite du 6 novembre 2015\n", "\n", "listes et dictionnaires"]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Enonc\u00e9 1"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q1\n", "\n", "Le programme suivant provoque une erreur de temps en temps, pourquoi ?"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["import random\n", "l = [0, 1, 2, 3, 4]\n", "i = random.randint(0, 5)\n", "del l[i] # d\u00e9clenche une exception de temps en temps"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pour le faire planter de fa\u00e7on quasi syst\u00e9mtique, on l'ins\u00e8re dans une boucle :"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"ename": "IndexError", "evalue": "list assignment index out of range", "output_type": "error", "traceback": ["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0ml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mi\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[1;32mdel\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mIndexError\u001b[0m: list assignment index out of range"]}], "source": ["import random\n", "for i in range(0,100):\n", " l = [0, 1, 2, 3, 4]\n", " i = random.randint(0, 5)\n", " del l[i] # d\u00e9clenche une exception quasi s\u00fbrement"]}, {"cell_type": "markdown", "metadata": {}, "source": ["L'erreur vient du faire que la fonction [randint](https://docs.python.org/3.4/library/random.html#random.randint) tire un nombre entre 0 et 5 inclus. La liste ne contient que 5 \u00e9l\u00e9ments. Le dernier a pour indice 4."]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q2\n", "\n", "A votre avis, qu'a voulu dire l'auteur de ces lignes ? Corriger ce programme."]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"ename": "NameError", "evalue": "name 'j' is not defined", "output_type": "error", "traceback": ["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mmat\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mj\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mmat\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'j' is not defined"]}], "source": ["mat = {}\n", "for i in range(0,3) and j in range(0,3): # d\u00e9clenche une exception\n", " mat[i,j] = 0"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est une erreur que je vois souvent chez ceux d\u00e9butent en programmation. On souhaite ici faire une double boucle imbriqu\u00e9e pour remplir le dictionnaire ``mat`` de 0."]}, {"cell_type": "code", "execution_count": 5, "metadata": {"collapsed": true}, "outputs": [], "source": ["mat = {}\n", "for i in range(0,3):\n", " for j in range(0,3):\n", " mat[i,j] = 0"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q3\n", "\n", "Ecrire une fonction qui met en majuscule les voyelles d'un mot. \n", "\n", "Exemple : python $\\rightarrow$ pYthOn\n", "\n", "Il n'existe pas une seule solution pour faire ceci. En voici quelques unes."]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/plain": ["'pYthOn'"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["def maj_voy(mot):\n", " l = []\n", " for c in mot:\n", " if c in \"aeiouy\":\n", " l.append(c.upper())\n", " else:\n", " l.append(c)\n", " return \"\".join(l)\n", "\n", "maj_voy(\"python\")"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/plain": ["'pYthOn'"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["def maj_voy(mot):\n", " return \"\".join(map(lambda c: c.upper() if c in \"aeiouy\" else c, mot))\n", "\n", "maj_voy(\"python\")"]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"text/plain": ["'pYthOn'"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["def maj_voy(mot):\n", " return \"\".join( c.upper() if c in \"aeiouy\" else c for c in mot )\n", "\n", "maj_voy(\"python\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Enonc\u00e9 2"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q1\n", "\n", "La variable ``i`` est soit 1, soit 2. Que fait le code suivant et comment le simplifier en une ligne ?"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["1\n"]}], "source": ["i = 2\n", "if i == 2:\n", " i = 1\n", "else:\n", " i = 2\n", " \n", "print(i)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["L'\u00e9nonc\u00e9 \u00e9tait un peu ambig\u00fc mais il fallait que le code fonctionne dans les deux cas : ``i==1`` et ``i==2``"]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["2\n"]}], "source": ["i = 3-i\n", " \n", "print(i)"]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["1\n"]}], "source": ["i = i%2 + 1\n", "\n", "print(i)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q2\n", "\n", "Le programme suivant produit une erreur. Modifier le programme pour qu'il ne la produise plus."]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"ename": "TypeError", "evalue": "unhashable type: 'dict'", "output_type": "error", "traceback": ["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mj\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'dict'"]}], "source": ["l = {{}} # d\u00e9clenche une exception\n", "for i,j in zip(range(0,3), range(0,3)):\n", " l[i,j] = 1"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La premi\u00e8re ligne contient des doubles accolades sans raison."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": ["l = {}\n", "for i,j in zip(range(0,3), range(0,3)):\n", " l[i,j] = 1"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Q3\n", "\n", "Ecrire une fonction qui double toutes les voyelles.\n", "\n", "Exemple : python $\\rightarrow$ pyythoon"]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"data": {"text/plain": ["'pyythoon'"]}, "execution_count": 15, "metadata": {}, "output_type": "execute_result"}], "source": ["def double_voy(mot):\n", " l = []\n", " for c in mot:\n", " if c in \"aeiouy\":\n", " l.append(c*2)\n", " else:\n", " l.append(c)\n", " return \"\".join(l)\n", "\n", "double_voy(\"python\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ou plus court encore :"]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"data": {"text/plain": ["'pyythoon'"]}, "execution_count": 16, "metadata": {}, "output_type": "execute_result"}], "source": ["def double_voy(mot):\n", " return \"\".join(map(lambda c: c*2 if c in \"aeiouy\" else c, mot))\n", "\n", "double_voy(\"python\")"]}, {"cell_type": "code", "execution_count": 16, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1"}}, "nbformat": 4, "nbformat_minor": 2}