.. |nbsp| unicode:: 0xA0 :trim: ======================================== Foire aux questions du Module 5 ======================================== FAQ générale du Module 5 ======================================== Cette section comprend les questions posées et réponses au sujet de la matière abordée dans le module 5 du cours. UpyLaB du Module 5 ======================================== UpyLaB 5.1 ----------------------- **ALEXANDRE** .. topic:: Bonjour, Je ne comprends pas mon erreur. Le résultat obtenu dans Pycharm est le même que celui attendu dans Upylab mais Upylab me retourne une erreur. Pouvez-vous m'aider ? Merci. .. topic:: Réponse de l'équipe Bonjour Alexandre, Il y a deux soucis dans ta fonction. Le premier, c'est que la fonction ne doit pas afficher le résultat, elle doit le retourner. Quelle instruction faut-il utiliser par conséquent ? Le deuxième est que l'objet que la fonction doit retourner est une chaîne de caractères, et l'on désigne de tels objets en les entourant par des apostrophes ou guillemets. Ces apostrophes ou guillemets ne font pas partie de la chaîne elle-même, il ne faut donc pas les rajouter. **DELPHINE** .. topic:: Bonjour, Je ne comprends pas comment écrire la fonction. J'ai bien vu la vidéo qui explique comment accéder aux composants du tuple et j'ai fais pareil mais j'ai toujours l'erreur qui m'indique que je n'ai qu'un argument en paramètre: TypeError: signature() takes 1 positional argument but 2 were given Pouvez-vous m'aider? Merci. .. topic:: Réponse de l'équipe Bonjour Delphine, La fonction ne doit en effet accepter qu'un seul paramètre. Quand tu l'appelles, il ne faut donc passer qu'un seul argument, mais rien n'empêche celui-ci d'être un tuple. Il faut toutefois être vigilant aux parenthèses. Si tu écris : ``signature("Massart", "Thierry")``, tu passes deux arguments à la fonction, ce qui occasionne une erreur telle que décrite dans ton message. Par contre, si tu écris ``signature(("Massart", "Thierry"))``, alors un seul argument est passé, le tuple ``("Massart", "Thierry")``. **KARIM** .. topic:: Bonjour, J'ai essayé plusieurs codes pour introduire une espace entre le nom et le prénom sans y arriver. Franchement je suis à cours d’idée. Comment faire s'il vous plaît ? .. topic:: Réponse de l'équipe Bonjour Karim, Il ne faut pas chercher à compliquer les choses. Ici, on nous demande de créer une chaîne composée de trois parties, le prénom (issu du paramètre), une espace, le nom (issu du paramètre). Comment peux-tu concaténer ces trois chaînes ? **ANATOLE** .. topic:: Bonjour, Je n'arrive pas à definir un tuple avec 2 indices. Quand on écrit ``def signature(identite)``, comment on montre ensuite au code que ``signature`` comprend 2 composantes ? .. topic:: Réponse de l'équipe Bonjour Anatole, On n'a pas à le lui montrer ; la fonction accepte un paramètre qui est un tuple, donc, sauf si le code appelant ne respecte pas cela, ce qui occasionnera une erreur à l'exécution, mais dont on n'a pas à se préoccuper ici (UpyLaB testera la fonction avec des arguments "valides"), ``identite`` désigne un tuple dans le code de ta fonction. La question est maintenant d'arriver à accéder aux composantes de ce tuple, mais cela est vu dans les vidéos précédentes. UpyLaB 5.2 ----------------------- **NADIA** .. topic:: Bonjour, J'aimerais comprendre mon code ne marche pas. Dans UpyLaB, j'ai : .. code-block:: python Bon résultat pour est_adn('CTTCTAC') : True alors que je n'ai pas "G" et : .. code-block:: python Résultat attendu pour est_adn('ACGTGATTCGF') : False alors que j'ai bien "ACGT". Je n'ai pas compris ce qui est est demandé ? Merci de m'éclairer. .. topic:: Réponse de l'équipe Bonjour Nadia, Pour être considérée comme une possible représentation d'un brin d'ADN, la chaîne doit contenir des caractères qui font tous partie des quatre ``'A'``, ``'C'``, ``'G'`` et ``'T'``, mais il n'y a aucune obligation à ce qu'ils y soient tous présents. C'est la cas du premier exemple. Mais le deuxième est refusé car il contient le caractère "invalide" ``'F'``. J'espère que c'est plus clair. **DAVID** .. topic:: Bonjour, Voici ce que je reçois comme erreur dans Upylab : .. code-block:: Votre programme a été interrompu par une exception: Ligne 51: UnboundLocalError: local variable 'res' referenced before assignment. Tout les reste semble ok. Pouvez-vous m'aider s'il vous plaît ? .. topic:: Réponse de l'équipe Bonjour David, Ce message d'erreur signifie que dans certains cas, la variable ``res`` n'est pas définie lorsque tu cherches à accéder à sa valeur. Je t'invite donc à envisager tous les cas possibles. Ici, il y a bien un cas particulier, lorsque la chaîne passée en argument est une chaîne vide. Bon débogage ! **ADELINE** .. topic:: Bonjour, Je ne comprends pas pourquoi mon code ne retourne pas les valeurs attendues. Pouvez-vous m'aider s'il vous plaît ? .. topic:: Réponse de l'équipe Bonjour Adeline, Tu es sur la bonne voie, mais il y a un petit souci de logique. En effet, si tu trouves à un moment un caractère invalide, alors la valeur à retourner doit être ``False``, même si le caractère suivant est valide. La valeur de ta variable ``res`` ne devrait pas être modifiée une seconde fois. Une solution consiste à supposer la chaîne "correcte" dès le départ, et à ne modifier cette variable ``res`` que si tu rencontres un caractère invalide. Bon courage ! **MAËL** .. topic:: Bonjour, Mon programme ``est_adn(chaine)`` marche avec PyCharm mais ici, dans ce Mooc, le compilateur me renvoie l'erreur : .. code-block:: python Erreur serveur: 'NoneType' object has no attribute 'gather_results' .. topic:: Réponse de l'équipe Bonjour Maël, Cette erreur peut survenir si le code que tu soumets ne contient pas uniquement la définition de la fonction. On est d'accord que tu ne fais pas d'appels aux fonctions ``print`` et ``input`` dans le code que tu soumets à UpyLaB ? **CHANTAL** .. topic:: Bonjour, Je comprends que mon code ne vérifie que la première lettre à chaque fois malgré mon ``for``. Comment arriver à faire boucler sur toute la séquence (j'ai essayé avec des "while" sans succès...). .. topic:: Réponse de l'équipe Bonjour Chantal, Je n'ai pas consulté ton code, mais n'aurais-tu pas demandé à ta fonction de retourner la valeur ``True`` dès qu'un caractère valide est trouvé ? L'instruction ``return`` met fin à l'exécution de la fonction. Dans le cas où la chaîne est valide, il faut donc veiller à ne l'utiliser qu'après avoir parcouru tous les caractères. UpyLaB 5.3 ----------------------- **SYLVAIN** .. topic:: Bonjour, J'ai défini deux formules : une pour les heures et l'autre pour les minutes. En faisant appel aux tuples, je soustrais de ma variable ``heure_fin`` ma variable ``heure_debut``; idem pour les minutes. Puis je rajoute 24 au résultat des heures s'il est négatif et 60 à celui des minutes. Mon résultat est toujours correct pour les minutes mais pas pour les heures. .. topic:: Réponse de l'équipe Bonjour SYLVAIN, Attention au fait que lorsque tu ajoutes 60 au résultat des minutes, il faut retirer 1 heure : 3h30 - 2h40 = 0h50 et non 1h50. .. topic:: Réponse de SYLVAIN Ah oui merci. **MARC** .. topic:: Bonjour, Doit-on utiliser le module ``datetime`` pour réaliser cet exercice ? .. topic:: Réponse de l'équipe Bonjour MARC, Non, il est conseillé de faire soi-même les calculs, sans ce module. **JULIE** .. topic:: Bonjour, Lorsque je teste l'appel : .. code-block:: python duree((3, 45), (13, 22)) dans mon IDE j'ai le bon résultat : ``[9, 37]`` Pourtant UpyLaB me répond que c'est faux. .. topic:: Réponse de l'équipe Bonjour JULIE, Attention il s'agit de retourner un tuple, et non une liste. La bonne réponse pour ton exemple est ``(9, 37)``. UpyLaB 5.4 ----------------------- **HÉLÈNE** .. topic:: Bonjour, J'ai bien compris que UpyLaB entrait les valeurs par couple (x,y). Donc impossible de rentrer la fonction sous la forme de 4 variables (x1,y1,x2,y2). Mais où puis-je trouver des informations complémentaires pour définir les données d'entrée pour des tuples ? Upylab me renvoie bien entendu que l'entête de la fonction n'est pas correct. Difficile pour une vraie débutante qui n'a pas encore toutes les ficelles. Merci .. topic:: Réponse de l'équipe Bonjour Hélène, La fonction ne doit accepter que deux paramètres, p1 et p2. Ces deux paramètres seront eux-mêmes deux tuples à deux composantes. Si tu veux pouvoir récupérer leurs composantes, tu peux utiliser les index : .. code-block:: python x1 = p1[0] y1 = p1[1] ou plus simplement, par l'opération nommée *unpacking* : .. code-block:: python x1, y1 = p1 .. topic:: Réponse d'HÉLÈNE Merci. **RAOUL** .. topic:: Bonsoir, Je ne trouve pas de solution pour déclarer un tuple en input pour la fonction. J'ai essayé ``(x1,y1,x2,y2) = tuple(input())`` et je saisis 0,0,0,100 à la demande, il y a un message d'erreur : .. code-block:: python Traceback (most recent call last): File "", line 1, in ValueError: too many values to unpack (expected 4) .. topic:: Réponse de l'équipe Bonjour Raoul, Est expliquée un petit peu plus loin dans le cours la façon dont on peut saisir un tuple en input. Cela dit, pour cette activité, il n'y a pas d'entrée à lire. On nous demande seulement d'écrire une fonction qui prend **deux** paramètres (qui seront des tuples représentant deux points). .. topic:: Réponse de RAOUL Merci. UpyLaB 5.5 ----------------------- **VINCENT** .. topic:: Bonjour, Je bloque sur la consigne de cet exercice. De ce que j'ai compris, il faut additionner les longueurs des segments obtenus à partir de plusieurs points afin d'avoir la longueur finale. Par exemple, avec 4 points A, B, C, D j'ai essayé d'additionner les longueurs de [AB], [AC] et [AD] mais ce n'est pas bon. J'aimerais donc savoir quels segments doit on additionner ? .. topic:: Réponse de LUCIE Bonjour VINCENT, Si tes 4 points sont, dans l'ordre, A, B, C, D alors tu dois effectuer la somme des distances AB + BC + CD. .. topic:: Réponse de VINCENT C'est tout simple. Merci Lucie. **MELANIE** .. topic:: Bonjour, Je ne comprends pas pourquoi mon script ne fonctionne pas avec ``for i in range (len(points)):`` ! J'ai tenté pendant des heures de faire autrement mais je n'arrive à rien ! .. topic:: Réponse de l'équipe Bonjour Mélanie, Dans ta boucle tu dois traiter un point et son suivant. Mais alors quand tu arrives au dernier point quel est le suivant ? .. topic:: Réponse de Mélanie Ah oui effectivement il n'y en a pas. Je dois donc m'arrêter à l'avant-dernier point. Merci. **NATHAN** .. topic:: Bonjour, J'ai réussi l'exercice calcul de distance. Dans cet exercice, mon programme fonctionne avec Pycharm mais ne me renvoie pas les même valeurs que dans UpyLaB. Je ne comprends pourquoi. .. topic:: Réponse de l'équipe Bonjour Nathan, On est d'accord qu'il peut y avoir plus de deux longueurs à additionner ? .. topic:: Réponse de NATHAN Effectivement je ne testais qu'avec trois points. Merci pour l'éclairage. **GILLES** .. topic:: Bonjour, J'ai une question similaire : dans Python tutor, j'appelle le code par : ``points = ((0,0),(0,1),(0,2))`` et dans ma fonction, ``for i in range(len(points))`` si j'imprime ``points[i]``, j'obtiens ``((0, 0), (0, 1), (0, 2))`` C'est gênant car je souhaiterais travailler sur chaque point, pas sur tous. .. topic:: Réponse de l'équipe Bonjour Gilles, Attention, si ta fonction est bien définie par : .. code-block:: python def longueur(*points): # corps de la fonction Alors ton appel correspond à : .. code-block:: >>> longueur(((0,0), (0,1), (0,2))) Et donc la variable locale ``points`` est un tuple, contenant 1 seul tuple (lui même étant composé de 3 tuples). Ce qui est différent de cet appel : .. code-block:: python >>> longueur((0,0), (0,1), (0,2)) Là nous avons bien ``points`` qui correspond à un tuple de 3 tuples (les 3 points). .. topic:: Réponse de GILLES Oh je vois ! C'est subtil. Mais merci, l'exercice est résolu. UpyLaB 5.6 ----------------------- **ESTELLE** .. topic:: Bonjour, comment je peut faire pour recréer ma chaine de caractères ? .. topic:: Réponse de l'équipe Bonjour Estelle, La concaténation te permet de construire une chaîne de caractères petit à petit. Mais certaines méthodes sur les chaînes de caractères peuvent aussi être utiles si tu veux prendre un peu d'avance sur le contenu du cours. En particulier, la méthode ``join`` permet de créer une chaîne à partir des composantes d'une liste. **MOUNIR** .. topic:: Bonjour, je n'arrive pas à comprendre le souci "Résultat attendu pour transcription_arn('') : "", pouvez-vous m'éclairer s'il vous plaît ? .. topic:: Réponse de l'équipe Bonjour Mounir, As-tu testé ta fonction en lui passant une chaîne vide ? Il est attendu que la fonction retourne une chaîne vide dans ce cas. **SARAH** .. topic:: Bonjour, Pourriez-vous me débloquer s'il vous plaît? Mon programme marche sur mon éditeur et sur python tutor. Par contre, Upylab me dit qu'il y a l'erreur : .. code-block:: python Ligne 51: IndexError: string index out of range .. topic:: Réponse de l'équipe Bonjour Sarah, As-tu testé ta fonction en lui passant une chaîne vide ? .. topic:: Réponse de Sarah Effectivement, ce cas renvoie une erreur, mais je n'arrive pas à la résoudre. .. topic:: Réponse de l'équipe En testant d'abord si la liste est non vide ? **MICKAËL** .. topic:: Bonjour, si j'ai bien compris, pour modifier une chaine de caractères, il faut en créer une autre. Mais je ne vois pas comment mettre cette nouvelle chaine dans le 'brin' proposé . Pouvez-vous me donner quelques tuyaux ? Merci. .. topic:: Réponse de l'équipe Bonjour Mickaël, Effectivement, modifier une chaîne nécessite d'en créer une autre. Mais pour récupérer cette chaîne modifiée, il suffit de la stocker dans une variable. .. code-block:: python s = "hello" s.title() #transforme la chaîne mais on ne fait rien de l'objet créé print(s) t = s.title() #transforme la chaîne et stocke le résultat dans la variable t print(t) Et si on n'a pas besoin de conserver une référence à la chaîne initiale, on peut même assigner le résultat de la transformation à la variable elle-même. .. code-block:: python s = "hello" s = s.title() print(s) J'espère que cela répond à ta question. UpyLaB 5.7 ----------------------- **EMILIE** .. topic:: Bonjour, Aux tests d'UpyLab j'ai 4 sur 5, un test ne passe pas : .. code-block:: none Résultat attendu pour plus_grand_bord('babababababbbbbaaabaababab') : 'babab' Pourtant c'est ``"bababa"`` le plus grand bord non ? .. topic:: Réponse de l'équipe Et non. Attention le préfixe doit se retrouver comme suffixe tel quel, sans retournement. Ainsi ``"bababa"`` ne se retrouve pas à la fin puisque la longue chaîne se termine par ``"babab"``. .. topic:: Réponse d'EMILIE Mais bien sûr ! Merci. **LAURENT** .. topic:: Bonsoir, J'essaie de transformer une chaine en liste. J'ai essayé .. code-block:: python chaine = "addddda" maListe = chaine.split(',') mais cela ne donne pas : ``['a', 'd', 'd', 'd', 'd', 'd', 'a']`` .. topic:: Réponse de Florence Si tu essaies de découper une chaîne de caractères en précisant que le séparateur est la virgule, il faut que ta chaîne comporte effectivement des virgules. Ainsi, ta chaîne d'origine aurait dû être : ``"a,d,d,d,d,d,a"`` pour obtenir la liste souhaitée. Cela dit, pour cet exercice tu n'as pas besoin de passer par une liste. L'opérateur crochets ``[ ]`` que ce soit pour accéder à un élément ou pour du *slicing* fonctionne aussi avec les chaînes de caractères. .. topic:: Réponse de LAURENT Ah oui ``chaine[:i]`` me donne bien la sous-chaîne de caractères de ``chaine`` jusqu'à l'indice ``i`` **exclu**. Merci j'ai réussi l'exercice. **TOM** .. topic:: Bonjour, Est-ce que le préfixe et le suffixe peuvent se chevaucher ? Par exemple le plus grand bord de ``aaaaa`` est-il bien ``aaaa`` ? .. topic:: Réponse de l'équipe Oui. UpyLaB 5.8 ----------------------- **MARTINE** .. topic:: Bonjour, Mon exercice fonctionne parfaitement dans PyCharm et aussi dans UpyLaB, mais j'ai une erreur que je n'arrive pas à identifier : .. code-block:: none Votre programme a été interrompu par une exception: Ligne 4: TypeError: unorderable types: str() < int() .. topic:: Réponse de l'équipe Bonjour MARTINE, Il est demandé de tester le type des arguments en entrée. UpyLaB testera ta fonction avec des arguments ayant le mauvais type, comme des ``str``. D'où les erreurs. .. topic:: Réponse de MARTINE C'est compris. Merci. UpyLaB 5.9 ----------------------- **NICOLE** .. topic:: Bonjour, Est-ce qu'une âme charitable pourra me dire ce que représente le X dans : .. code-block:: none Résultat attendu pour anagrammes('ironique', 'Xnirique') : False .. topic:: Réponse de l'équipe Bonjour NICOLE, Il s'agit simplement de la lettre 'X'. On demande simplement : est-ce que les mots `'ironique'` et `'Xnirique'` sont anagrammes l'un de l'autre ? .. topic:: Réponse de NICOLE Ah d'accord, au temps pour moi, je n'y étais pas du tout. **ARMAND** .. topic:: Bonjour, Je pense ne pas être loin du résultat. je ne sais pas ce qui bloque. J'ai utilisé la comparaison de la valeur des 2 chaines de caractères. Peut-être y avait-il plus simple? .. topic:: Réponse de l'équipe Bonjour Armand, Parce qu'additionner les codes ascii des caractères ne suffit pas à s'assurer que les chaînes sont formées de caractères identiques. As-tu testé ce que donne ta fonction ascii pour les chaînes 'ad' et 'bc' ? .. topic:: Réponse d'ARMAND Je viens de tester en effet... Ce n'était donc pas une si bonne méthode que cela. UpyLaB 5.10 ----------------------- **NATHALIE** .. topic:: Bonjour, Je ne parviens pas à trouver comment résoudre l'erreur : .. code-block:: none Ligne 51: UnboundLocalError: local variable 'res' referenced before assignment .. topic:: Réponse de l'équipe Bonjour Nathalie, Cette erreur signifie qu'il y a des cas pour lesquels la variable ``res`` n'est pas définie lorsque tu cherches à accéder à sa valeur. En particulier, si tu définis cette variable à l'intérieur d'une boucle, que se passe-t-il si aucune itération n'est exécutée, ce qui sera le cas si l'argument passé est une chaîne vide ? Bon débogage ! **THOMAS** .. topic:: Bonjour, J'ai l'impression que dans mon code, quand le premier caractère est répété, ça se passe bien. Mais quand c'est le second caractère qui est répété, ça tourne au vinaigre et ça me retourne ``False``. Pourriez-vous m'expliquer où se trouve le souci ? .. topic:: Réponse de l'équipe Bonjour Thomas, L'instruction ``return`` met fin à l'exécution de la fonction, même si elle est à l'intérieur d'une boucle. Ton code actuel met donc fin à la fonction à la première itération de la boucle, ce qui n'est pas ce que tu veux. Le souci se pose pour ton instruction ``return False``. Actuellement, si la première composante de la chaîne n'est pas dupliqué, ta fonction retourne ``False`` sans regarder ce qu'il se passe par la suite. Et s'il se trouve qu'il y a une composante dupliquée dans le reste de la séquence, ta fonction retourne par conséquent un mauvais résultat. Cette instruction ne doit donc être écrite qu'après avoir parcouru toute la séquence, autrement dit, après ta boucle for. Au passage, nos enseignants ont expliqué qu'ils estimaient qu'un "bon" code ne devait comporter qu'une seule instruction return. Crois-tu que tu pourrais réécrire ton code de sorte à n'en avoir qu'une ? Bon courage ! UpyLaB 5.11 ----------------------- **DYLAN** .. topic:: Bonjour, J'ai un problème de compréhension de l'énoncé de l'exercice UpyLaB 5.11 sur les intersections de mots. La consigne est de trouver "la plus grande partie commune à ces deux mots". Par exemple, l’intersection de « programme » et « grammaire » est « gramm ». Mais, par ailleurs, on nous dit "Si plusieurs solutions sont possibles, la fonction retournera la sous-chaîne d’indice minimal dans v. Par exemple, ``intersection('bbaacc', 'aabb')`` renvoie ``'bb'``." Dans l'exemple 1, si l'appel de la fonction est bien ``intersection('programme', 'grammaire')``, alors la sous-chaine commune d'indice minimal dans ``v`` n'est-elle pas ``"r"`` (et non pas ``"gramm"``, comme indiqué dans l'exemple" )? .. topic:: Réponse de l'équipe Bonjour Dylan, L'exercice a pour but de retourner la plus grande chaîne commune. Lorsque la consigne dit "Si plusieurs solutions sont possibles", cela concerne les cas où il y a deux chaînes communes de même taille (maximale). Dans "programme" et "grammaire", il n'y a qu'une seule chaîne commune de taille maximale : "gram", quelle que soit sa place dans les deux mots. Dans "bbaacc" et "aabb", il y a deux chaînes communes de taille maximale : "bb" et "aa". Dans ces cas-ci, on prend celle qui arrive en premier dans le premier mot. J'espère que c'est plus clair. **MARC** .. topic:: Bonjour, Je suis en train de peiner fort sur l'intersection en 5.11, et j'ai beau gratter partout comme dans un escape game, je n'ai pas encore trouvé l'indice pour me débloquer. .. topic:: Réponse de l'équipe Bonjour Marc, Pour l'exercice 5.11, voici comment on pourrait procéder avec le premier exemple donné : 'programme' et 'grammaire'. 'programme' se trouve dans 'grammaire' : non 'programm' de 'rogramme' se trouvent dans 'grammaire' : non 'program', 'rogramm', 'ogramme' se trouvent dans 'grammaire' : non etc... et on s'arrête dès qu'une réponse est oui. Sinon, la réponse est la chaîne vide. En espérant que ça te mette sur une piste possible. UpyLaB 5.12 ----------------------- **SYLVIE** .. topic:: Bonjour, Je ne comprends pas l'erreur dans mon programme, dans la mesure où sur PyCharm le programme renvoie les bonnes valeurs. Pourriez vous m'éclairer ? Merci. .. topic:: Réponse de l'équipe Bonjour Sylvie, Pour cet exercice, la fonction ne doit pas modifier la liste d'origine. As-tu vérifié que c'est bien le cas ? .. code-block:: python l = [1, 3, 5] print(my_insert(l, 4)) #doit afficher [1, 3, 4, 5] print(l) #doit afficher [1, 3, 5] **JEAN-PAUL** .. topic:: Bonjour, Je reçois l'anomalie suivante : .. code-block:: Votre programme a été interrompu par une exception: Ligne 6: TypeError: unorderable types: str() <= int() mais je ne sais pas ce qu'UpyLaB teste. Pouvez-vous m'aider ? .. topic:: Réponse de l'équipe Bonjour Jean-Paul, As-tu bien pris en compte cette partie de la consigne ? .. code-block:: none Vous pouvez supposer que le premier paramètre sera bien une liste triée d’entiers, mais si le deuxième paramètre n’est pas du bon type, la fonction retourne ``None``. UpyLaB va tester ce point, en passant à ta fonction des arguments de types divers, dont des chaînes de caractères par exemple. Cela ne doit pas occasionner d'erreur. Bon débogage ! **ANNIE** .. topic:: Bonjour, Comme pour d'autres apprenants, mon code vérifié dans UpyLaB renvoie un message d'erreur pour les valeurs négatives, alors que cela fonctionne dans PyCharm ou Python Tutor. J'ai parcouru le forum et les réponses trouvées ne me permettent pas de comprendre. Pouvez vous formuler ce qui est attendu et l'expliquer ? .. topic:: Réponse de l'équipe Bonjour Jean-Paul, Il est attendu que la fonction retourne ``None`` si l'argument n'est pas un nombre entier. Elle n'a donc pas à le faire si l'argument passé est un nombre entier négatif. J'espère que c'est plus clair. UpyLaB 5.13 ----------------------- **PIERRE** .. topic:: Bonjour, Je ne comprends pas comment modifier la liste passée en paramètre ? Tout ce qu'on fait dans la fonction est "local" et ne se répercute pas sur la valeur "globale" de la liste. .. topic:: Réponse de l'équipe Bonjour PIERRE, Lorsqu'on passe un argument à une fonction, on crée en fait une variable locale qui pointe vers l'objet pointé lui-même par la variable qui a servi à l'appel. Comme les listes sont mutables, modifier la liste référencée par la variable locale à la fonction revient en fait à modifier l'objet référencé par la variable passée au moment de l'appel. Voici un petit code pour tester cela : .. code-block:: python def func(s): s[0] = 0 l = [1, 2, 3] print("Liste avant fonction", l) func(l) print("Liste après fonction", l) .. topic:: Réponse de PIERRE Merci. Je pense avoir compris : mon exercice est validé. UpyLaB 5.14 ----------------------- **ELLIOT** .. topic:: Bonjour, Dans cet exercice, il faut faire une correspondance terme à terme entre deux listes et compter le nombre de différences ; ce que je ne parviens pas à dire dans le langage Python. .. topic:: Réponse de l'équipe Bonjour ELLIOT, Ce qui fait le lien entre les deux listes ici, ce sont les indices des éléments. En utilisant une boucle ``for`` pour parcourir les indices de ``0`` à ``_dernier indice_`` tu devrais pouvoir manipuler les éléments en correspondance dans chacune des listes. **LUCIE** .. topic:: Bonsoir, Je ne comprends pas toutes les réponses attendues de l'exercice : .. code-block:: none fail Résultat attendu pour distance_mots('cochai', 'chuter') : 5 Or, ici il y a 2 lettres communes donc pour moi la réponse est : 4 lettres à changer et non 5. .. topic:: Réponse de l'équipe Bonsoir LUCIE Attention, les lettres doivent coïncider sur la même position. Dans l'exemple que tu donnes, seul le premier ``c`` coïncide. Le ``h`` qui est la 2e lettre commune ne se trouve pas au même endroit dans les deux mots : il ne compte donc pas comme correct. UpyLaB 5.15 ----------------------- **QUENTIN** .. topic:: Bonjour Le programme test réalisé dans PyCharm fonctionne très bien mais dans UpyLaB j'obtiens le message suivant : .. code-block:: none Votre programme a été interrompu par une exception : Ligne 51: IndexError: string index out of range .. topic:: Réponse de l'équipe Bonjour QUENTIN, Il faut faire attention dans cet exercice au fait que les mots peuvent être de longueurs différentes. Si vous utilisez votre fonction de l'exercice précédent sans précaution vous risquez effectivement d'essayer d'accéder à un caractère au-delà de la longueur du mot, provoquant l'exception de votre exemple. .. topic:: Réponse de QUENTIN Merci, j'ai rajouté un test d'égalité sur les longueurs avant d'appeler ma fonction ``distance_mots``. Cela fonctionne. UpyLaB 5.16 ----------------------- **SOPHIE** .. topic:: Bonjour, Dans la fonction ``my_pow``, je ne passe pas les trois derniers tests. Ai-je oublié des cas particuliers ? merci. .. topic:: Réponse de l'équipe Bonjour SOPHIE, Il est demandé de gérer les cas où les arguments ne sont pas du bon type. .. topic:: Réponse de SOPHIE Oui j'ai utilisé des ``assert``. .. topic:: Réponse de l'équipe ``assert`` ne sera pas l'instruction à utiliser ici. Si l'argument n'est pas du type attendu, cela va occasionner une erreur alors que nous voulons simplement retourner ``None`` dans ces cas-là. .. topic:: Réponse de SOPHIE Effectivement, j'ai remplacé par l'utilisation de la fonction ``type`` et un test et cela fonctionne. Merci. **CHRISTIAN** .. topic:: Bonjour, Dans PyCharm, tout fonctionne bien, mais UpyLaB me dit que c'est faux. Par exemple : .. code-block:: python >>>my_pow(3, 7.0) [1, 7.0, 49.0] .. topic:: Réponse de l'équipe Bonjour CHRISTIAN, Attention le type de ton premier élément n'est pas correct : tu as l'entier 1 au lieu du float 1.0. C'est pourquoi UpyLaB n'est pas satisfait. .. topic:: Réponse de CHRISTIAN Effectivement, dans ma façon de faire j'initialisais la liste résultat avec des 1. J'ai changé en mettant des 1.0, cela fonctionne maintenant. .. topic:: Réponse de l'équipe Très bien. Cela dit, ce n'est pas la seule façon de faire : on peut, par exemple, initialiser avec une liste vide, qu'on remplit au fur et à mesure. **MARTIN** .. topic:: Bonjour, Je teste bien le type des arguments, pourtant j'ai des croix rouges dans UpyLaB : .. code-block:: python if type(m) is int() and type(b) is float(): Qu'est-ce qui cloche ? .. topic:: Réponse de l'équipe Bonjour MARTIN, Attention vous confondez le nom du type par exemple ``int`` avec la fonction de *cast* ``int()``. .. topic:: Réponse de MARTIN Merci, ça fonctionne après correction. UpyLaB 5.17 ----------------------- **PAULINE** .. topic:: Bonjour, Je cherche désespérément la syntaxe pour instancier l'élément 2 du tuple par l'élément 1. Si je fais élément1 * élément2, il me calcule le résultat de la multiplication qu'il met dans une liste (avec votre exemple) : ``[4, 4, 'testtest', 9, 'bonjour']`` Si je fais élément1 * [élément2], il me fait l'instanciation mais dans une sous-liste : ``[[1, 1, 1, 1], [2, 2], ['test', 'test'], [3, 3, 3], ['bonjour']]`` Une petit aide s'il vous plaît ? .. topic:: Réponse de l'équipe Bonjour PAULINE, Effectivement ta première idée ne peut pas fonctionner, comme tu le démontres avec l'exemple. Ta deuxième idée est bonne (même si on peut aussi faire autrement, sans utiliser la concaténation multiple, attention ici ce n'est pas une multiplication comme tu le dis). Par contre, tu sembles utiliser un ``append`` pour construire la liste résultat finale. Peut-être devrais-tu envisager une autre méthode des listes : ``extend``? .. topic:: Réponse de PAULINE Merci, ça fonctionne. UpyLaB 5.18 ----------------------- **VALÉRIE** .. topic:: Bonjour, J'avoue que je suis un peu perdue. Je ne vois pas comment comparer chaque contrainte issue de ``f`` pour les valeurs de ma liste ? J'ai utilisé une boucle pour parcourir chaque élément ``lst[i]`` de la liste ``lst``, puis un ``if`` mais je ne vois pas comment comparer ``f`` et ``lst[i]``. Pouvez-vous m'éclairer sur ce sujet ? .. topic:: Réponse de l'équipe, Bonjour Valérie, Il ne s'agit pas de comparer ``f`` et ``lst[i]`` mais d'appeler ``f`` avec ``lst[i]`` et de ne garder que ceux qui retournent ``True``. **HUBERT** .. topic:: Bonjour, Je n'ai pas compris comment insérer la fonction lambda : doit-on écrire pour l'appel de la fonction : .. code-block:: python my_filter(liste, lambda e: e > 2) Puis, quand on introduit le test : ``lambda(x)`` simplement ? En tout cas cela ne fonctionne pas chez moi et ce n'est pas faute d'essayer ! .. topic:: Réponse de l'équipe, Ton appel à la fonction ``my_filter`` est un exemple correct, mais on est d'accord qu'un appel de ce type sera réalisé par UpyLaB, ou par nous dans PyCharm pour tester notre solution mais pas dans le code que l'on soumet à UpyLaB. Pour la suite, non, ``lambda(x)`` ne fonctionne pas car ``lambda`` n'est pas le nom de la fonction. Dans notre code, le deuxième paramètre de la fonction ``my_filter`` s'appelle ``f`` et l'appel que nous utilisons est simplement ``f(x)`` UpyLaB 5.19 ----------------------- **MARIE-JEANNE** .. topic:: Bonjour, Sur cet exercice je coince apparemment sur la déclaration de l'origine des fichiers. Cela fonctionne bien en local sur mon pc, mais impossible de la faire fonctionner dans UpyLab. J'ai bien essayé plusieurs chemins, sans succès. Merci de votre retour. Voici le message d'erreur que je reçois : .. code-block:: Votre programme a été interrompu par une exception: Ligne 1: FileNotFoundError: [Errno 2] No such file or directory: 'c:/Users/mariejeanne/Desktop/Python/' .. topic:: Réponse de l'équipe, Bonjour Marie-Jeanne, UpyLaB n'a pas accès à ta machine ; il ne peut donc accéder à ce répertoire. Il n'y a pas lieu de chercher à faire cela, UpyLaB passera en argument à la fonction des fichiers qui lui sont accessibles, en précisant lui-même le chemin pour y accéder. De la même manière, il ne faut pas chercher à appeler la fonction sur un fichier spécifique ; le code que l'on soumet ne doit contenir que la définition de la fonction. N'hésite pas à revoir l'exemple de fonction travaillant sur des fichiers passés en paramètres donné en section 5.8.4. **SAMUEL** .. topic:: Bonjour, J'ai enregistré les fichiers au niveau des scratchs dans Pycharm mais quand j'essaie de les ouvrir, j'ai le message d'erreur : .. code-block:: python [Errno 2] No such file or directory: 'acro2.txt' Comment puis-je tester ma fonction ? .. topic:: Réponse de l'équipe, Bonjour Samuel, Il faut enregistrer ces fichiers dans le même répertoire que celui qui contient ton script, ou indiquer le chemin vers ces fichiers lorsque tu fais appel à la fonction. **SYLVAIN** .. topic:: Bonjour, Mon code retourne seulement le première lettre la dernière ligne des acrostiches sur PyCharm. J'ai pourtant bien utilisé une instruction ``for ... in ...``, qui je pensais faisait appel directement à toutes les lignes... .. topic:: Réponse de l'équipe, Bonjour Sylvain, Concernant cet exercice, l'idée est de stocker les premiers caractères de chaque ligne dans une chaîne. Actuellement, ton code récupère le premier caractère de chaque, mais n'en fait rien, et l'itération suivante vient écraser la valeur précédente. Il faut donc que tu stockes ces différents caractères dans une chaîne au fur et à mesure. Pense à la concaténation. **ANASTASIA** .. topic:: Bonjour, Mon code retourne seulement le première lettre la dernière ligne des acrostiches sur PyCharm. J'ai pourtant bien utilisé une instruction ``for ... in ...``, qui je pensais faisait appel directement à toutes les lignes... .. topic:: Réponse de l'équipe, Bonjour Anastasia, L'instruction ``return`` met fin à l'exécution de la fonction. Dans ton cas, à la première itération de la boucle, donc seule la première ligne du fichier est lue. Attention donc à ne pas utiliser cette instruction trop tôt dans le code ! UpyLaB 5.20 ----------------------- **YOUSSEF** .. topic:: Bonjour, je ne vois pas pourquoi mon code est rejeté pour le texte 2. Tout est ok sur Pycharm pourtant... .. topic:: Réponse de l'équipe Bonjour Youssef, La différence entre les deux textes est que le deuxième contient plusieurs lignes. Or, ton programme ne fait actuellement écrire qu'une seule ligne dans le fichier. **NINA** .. topic:: Bonjour, j'ai un sérieux problème avec ces fichiers. Je ne comprends pas ce qui bloque. .. topic:: Réponse de l'équipe Le souci est que tu demandes à ta fonction d'ouvrir des fichiers spécifiques, dont les noms sont '/pub/data/histoire_1.txt' et 'nouvelle_histoire_1.txt'. Mais la fonction doit pouvoir faire son travail avec n'importe quel fichier, et non seulement ceux-ci. Les noms des fichiers sont passés en argument à la fonction, et c'est lorsqu'on appellera la fonction qu'on lui indiquera ainsi sur quels fichiers travailler. Dans le code de la fonction, il faut utiliser ses paramètres qui désignent ces fichiers. Par ailleurs, indiquer un fichier spécifique comme tu l'as fait va poser souci si tu utilises ta fonction sur un autre système, car ce fichier '/pub/data/histoire_1.txt' n'existe pas partout. L'as-tu essayé localement ? Bon courage ! .. topic:: Réponse de NINA Désolée mais je ne comprends pas la différence par rapport à ce qui est demandé depuis des semaines. .. topic:: Réponse de l'équipe Justement, il n'y a pas de différence. Il nous est demandé d'écrire une fonction qui reçoit des paramètres et qui fait un traitement à partir de ceux-là. C'est lorsque l'on appelle la fonction qu'on précise la valeur de ceux-ci. Si je reprends par exemple la fonction ``anagrammes`` de l'exercice 5.9, elle accepte deux paramètres qui sont des chaînes de caractères. Ce n'est qu'au moment où on appelle la fonction qu'on lui précise la valeur de celles-ci ; la fonction ne doit pas toujours travailler avec les chaînes ``"marion"`` et ``"romina"`` du premier exemple. Ici, c'est exactement pareil, sauf que les valeurs que l'on manipule sont des noms de fichiers que la fonction doit ouvrir. Mais encore une fois, la fonction ne doit pas chercher à travailler avec des fichiers spécifiques, mais avec ceux désignés par ses paramètres. J'espère que c'est un peu plus clair. **ADAM** .. topic:: Bonjour, Mon programme copie correctement le texte d'un fichier vers l'autre, mais ne remplace pas les prénoms. Pouvez-vous m'aider à voir pourquoi ? Merci. .. topic:: Réponse de l'équipe Bonjour Adam, Attention aux méthodes sur les chaînes de caractères, qui ne transforment pas l'objet mais en créent un nouveau. C'est le cas de la méthode ``replace``. Il ne suffit donc pas de l'appeler, il faut aussi récupérer son résultat. **VICTORIA** .. topic:: Bonjour, PyCharm me retourne le message d'erreur suivant que je ne comprends pas : .. code-block:: python AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'. .. topic:: Réponse de l'équipe Bonjour Victoria, La méthode ``replace`` doit s'appliquer sur une chaîne de caractères, donc ici, au contenu du fichier, et non au fichier lui-même. Bon débogage ! UpyLaB 5.21 ----------------------- **EVAN** .. topic:: Bonjour, Pourriez-vous me donner un indice pour savoir ce qui fait que mon code n'est pas approprié pour le deuxième test fait sur tout le texte du Petit Prince ? Je vous remercie d'avance. .. topic:: Réponse de l'équipe Bonjour Nathan, Il y a bien plus de séparateurs possibles que les trois avec lesquels tu utilises la méthode ``split``. Bon courage ! **SOPHIA** .. topic:: Bonjour, "N'était-ce" correspond-il à un seul mot, ou à trois mots ? Merci .. topic:: Réponse de l'équipe Bonjour Sophia, "n'était-ce" comporte bien trois mots ; "n'", "était" et "ce". Bon courage ! **NATHAN** .. topic:: Bonjour, Je suis bloqué à cet exercice et j'aimerais obtenir quelques indices pour m'aider à me débloquer. J'arrive à obtenir la bonne liste pour les 2 premiers tests mais pas pour le dernier. L'un des mots manquants est "ajoutais" avec un s à la fin. Or, quand je regarde le fichier texte, le ""ajoutais"" apparait dans "ajoutaisTu". Est-ce que cela veut dire qu'il faut considerer les majuscules comme des séparateurs ? .. topic:: Réponse de l'équipe Bonjour Nathan, Non, les majuscules ne sont pas des séparateurs. Mais il n'y a pas de tel mot dans le texte original ; les deux sont en effet séparés par un retour à la ligne. N'aurais-tu pas malencontreusement supprimé ceux-ci dans ton code par un appel à strip par exemple ? .. topic:: Réponse de Nathan Merci beaucoup pour ton aide, j'ai réussi à valider l'exercice. C'était bien un problème avec le retour à la ligne. **ANISSA** .. topic:: Bonjour, Je souhaiterais avoir de l'aide sur le remplacement des séparateurs par une espace (pour ensuite faire un split global) si vous le voulez bien. Comment puis-je intégrer tous les séparateurs dans un seul ``replace`` ? Merci d'avance pour votre aide car cela va m'aider sur plusieurs exercices ! .. topic:: Réponse de l'équipe Bonjour Anissa, Cela n'est pas possible avec la méthode ``replace`` sur les chaînes de caractères. Tu pourrais t'en sortir avec la méthode ``sub`` du module re, mais cela n'est pas introduit dans ce cours et nécessite de connaître la syntaxe des expressions régulières. Ce que tu peux faire, c'est itérer sur une chaîne formée par les différents séparateurs et appliquer la méthode ``replace`` à chacun de ses caractères. Bon courage ! UpyLaB 5.22 ----------------------- **VICTOR** .. topic:: Bonjour, Malgré tous mes efforts, je n'arrive pas à tomber sur le bon nombre de caractères. Pourtant ce n'est pas la partie la plus difficile de l'exercice ; je parcours chaque caractère de la chaîne de caractères ``f.read()``. .. topic:: Réponse de l'équipe Attention à comment vous avez récupéré le fichier texte. Si vous avez des résultats erronés sur le nombre de caractères des fichiers téléchargés sur le site du cours, veillez à bien enregistrer votre copie du fichier en UTF8. Pour cela, il faut commencer par faire un clic droit sur le lien du fichier et choisir : ``Enregistrer la cible du lien sous...`` .. topic:: Réponse de VICTOR Après un copier-coller des différents fichiers dans mon éditeur de texte et avoir fait enregistrer sous, j'obtiens le bon nombre de caractères. Merci. **STÉPHANIE** .. topic:: Bonjour, Mon PyCharm ne trouve pas les fichiers texte pourtant enregistrés dans mon espace de travail. J'ai la même réponse dans UpyLab : .. code-block:: none Ligne 23: FileNotFoundError: [Errno 2] No such file or directory: 'nomfichier.txt' Alors que j'ai bien demandé à ouvrir avec la fonction ``open`` et _encoding_ en utf-8. Merci mille fois de votre aide. .. topic:: Réponse de l'équipe Bonjour STÉPHANIE, Attention il semblerait que vous confondiez le paramètre de la fonction ``wc`` : ``monfichier`` et le nom du fichier qui est enregistré sur votre disque : ``zola.txt`` ou ``le petit prince.txt`` ou encore, pourquoi pas ``monfichier.txt``. Vous devez appeler la fonction ``open`` avec la variable ``monfichier`` qui vaudra la chaîne de caractères correspondant au fichier à traiter : ``'zola.txt'`` ou ``'le petit prince.txt'`` ou ``'monfichier.txt'``. .. topic:: Réponse de STÉPHANIE Ah je comprends. Donc dans mon code j'ai : .. code-block:: python def wc(monfichier): # ici ma fonction et que j'appelle par exemple comme ceci : .. code-block:: python wc('monfichier.txt') .. topic:: Réponse de l'équipe C'est exactement ça. **PAUL** .. topic:: Bonjour, J'ai enfin compris mon erreur, j'avais oublié des séparateurs : les tabulations et les points que je ne retirais pas. .. topic:: Réponse de l'équipe Bonjour PAUL, Bravo pour avoir résolu l'exercice. Ici, il est plus simple de trouver les séparateurs par négation de ce qui est un caractère alphanumérique en utilisant la méthode ``isalnum()`` que d'essayer de les lister tous. UpyLaB 5.23 ----------------------- **LUCIE** .. topic:: Bonjour, Quand je teste mon programme d'initialisation des matrices à 0, cela fonctionne notamment sur pythontutor. Mais UpyLaB indique que les résultats ne sont pas ceux attendus. Or j'ai testé mon programme avec les tests de UpyLaB, et j'obtiens sur pythontutor les résultats attendus (une liste de listes de 0). Où se trouve alors le problème ? .. topic:: Réponse de l'équipe Attention avec les listes de listes, si on ne prend pas garde à comment on construit ces objets, on peut obtenir des structures qui ne sont pas correctes et que UpyLaB détecte. Visuellement vous aurez bien une liste de listes de 0 mais la structure ne sera pas bonne. Si vous exécutez le code ci-dessous : .. code-block:: python >>> m = init_mat(2, 3) >>> m[0][0] = 1 La matrice m devrait être : .. code-block:: python [[1, 0, 0], [0, 0, 0]] Et non .. code-block:: python [[1, 0, 0], [1, 0, 0]] UpyLaB 5.24 ----------------------- **CLAIRE** .. topic:: Bonjour, J'ai du mal : dans cet exercice, l'affichage attendu ne comprend pas le format d'une liste (sans crochet et sans virgule) et ma fonction laisse apparaitre ces caractères. .. topic:: Réponse de l'équipe Bonjour CLAIRE, Effectivement, si on a : .. code-block:: python L = [1, 2, 3] et qu'on fait : .. code-block:: python print(L) on obtiendra cela comme affichage : .. code-block:: python [1, 2, 3] Pour cette liste nous aimerions obtenir cet affichage : .. code-block:: none 1 2 3 C'est aussi ce qu'on veut pour chaque ligne de notre matrice. Il s'agit donc de parcourir ces lignes pour en afficher les éléments comme dans l'exemple précédent. **MARC** .. topic:: Bonjour, J'ai testé ma fonction sur mon IDE qui fonctionne mais je ne comprends pas où ajouter les deux lignes demandées : .. code-block:: python m = eval(input()) print_mat(m) .. topic:: Réponse de l'équipe Bonjour MARC, Il s'agit du programme principal donc à rajouter après la définition de ta fonction ``print_mat``. UpyLaB 5.25 ----------------------- **JULIE** .. topic:: Bonsoir, Mon programme a été interrompu par une exception : .. code-block:: python Ligne 4: IndexError: list index out of range Quel est le problème...sauf ça, tout est bon ? Merci par avance pour votre aide. .. topic:: Réponse de l'équipe Bonsoir Julie, Ne serait-ce pas le cas de la matrice vide ? UpyLaB 5.26 ----------------------- **EDITH** .. topic:: Bonsoir, Pourquoi la matrice ci-dessous n'est-elle pas antisymétrique ? .. code-block:: python [[0, -8], [8, -1]] Merci par avance pour votre aide. .. topic:: Réponse de l'équipe Bonsoir EDITH, La définition dit qu'une matrice est antisymétique si les éléments sont tels que m_ij = -m_ji. Donc si i = j on obtient m_ii = -m_ii. Et donc que m_ii = 0. Ainsi, la conséquence de la définition c'est que tous les éléments de la première diagonale sont nuls. .. topic:: Réponse de EDITH Merci pour cette explication. UpyLaB 5.27 ----------------------- **PAUL** .. topic:: Bonjour, Pourquoi est-ce que j'obtiens ``[None, None, None]`` en utilisant une compréhension de liste ? .. topic:: Réponse de l'équipe Bonjour Paul, Les méthodes sur les listes comme ``append`` ou ``extend`` modifient directement l'objet auquel on les applique, et retournent ``None``. Elles ne sont pas à utiliser lorsqu'on écrit des compréhensions de liste. **GAÏA** .. topic:: Bonjour, J'ai un petit souci avec cette fonction qui semble correspondre à ce qui est demandé (en tout cas sur une matrice nxn). Quand ma fonction fait : .. code-block:: python ma_matrice = A return ma_matrice ``print(symetrie_horizontale)`` imprime la matrice ``A``. Mais si je rajoute entre les deux lignes ``ma_matrice = ma_matrice.reverse()``, je vois l'inversion s'effectuer sur Pythontutor mais la fonction me renvoie ``None``. D'où ma question : que fait exactement ``reverse`` ? .. topic:: Réponse de l'équipe Bonjour Gaïa, La méthode ``reverse``, comme son nom l'indique, renverse la liste à laquelle on l'applique, mais elle le fait en place, c'est-à-dire qu'elle modifie directement la liste. Elle ne retourne donc rien, il ne faut pas chercher à récupérer son résultat, qui est ``None``. Dans ton exemple, il faudrait écrire : .. code-block:: python ma_matrice.reverse() return ma_matrice Cela dit, utiliser la méthode ``reverse`` ici va modifier la matrice initiale. Ce n'est peut-être pas souhaitable. Pour éviter cela, il est possible de créer une nouvelle matrice en utilisant un slice. Je te laisse trouver lequel. Bon courage !