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

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.

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

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.

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

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 ?

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

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 ?

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

Bonjour,

J’aimerais comprendre mon code ne marche pas. Dans UpyLaB, j’ai :

Bon résultat pour est_adn('CTTCTAC') : True

alors que je n’ai pas « G » et :

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.

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

Bonjour,

Voici ce que je reçois comme erreur dans Upylab :

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 ?

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

Bonjour,

Je ne comprends pas pourquoi mon code ne retourne pas les valeurs attendues. Pouvez-vous m’aider s’il vous plaît ?

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

Bonjour,

Mon programme est_adn(chaine) marche avec PyCharm mais ici, dans ce Mooc, le compilateur me renvoie l’erreur :

Erreur serveur: 'NoneType' object has no attribute 'gather_results'

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

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…).

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

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.

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.

Réponse de SYLVAIN

Ah oui merci.

MARC

Bonjour,

Doit-on utiliser le module datetime pour réaliser cet exercice ?

Réponse de l’équipe

Bonjour MARC,

Non, il est conseillé de faire soi-même les calculs, sans ce module.

JULIE

Bonjour,

Lorsque je teste l’appel :

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.

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

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

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 :

x1 = p1[0]
y1 = p1[1]

ou plus simplement, par l’opération nommée unpacking :

x1, y1 = p1

Réponse d’HÉLÈNE

Merci.

RAOUL

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 :

Traceback (most recent call last): File "", line 1, in ValueError: too many values to unpack (expected 4)

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).

Réponse de RAOUL

Merci.

UpyLaB 5.5

VINCENT

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 ?

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.

Réponse de VINCENT

C’est tout simple. Merci Lucie.

MELANIE

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 !

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 ?

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

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.

Réponse de l’équipe

Bonjour Nathan,

On est d’accord qu’il peut y avoir plus de deux longueurs à additionner ?

Réponse de NATHAN

Effectivement je ne testais qu’avec trois points. Merci pour l’éclairage.

GILLES

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.

Réponse de l’équipe

Bonjour Gilles,

Attention, si ta fonction est bien définie par :

def longueur(*points):
    # corps de la fonction

Alors ton appel correspond à :

>>> 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 :

>>> longueur((0,0), (0,1), (0,2))

Là nous avons bien points qui correspond à un tuple de 3 tuples (les 3 points).

Réponse de GILLES

Oh je vois ! C’est subtil. Mais merci, l’exercice est résolu.

UpyLaB 5.6

ESTELLE

Bonjour,

comment je peut faire pour recréer ma chaine de caractères ?

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

Bonjour,

je n’arrive pas à comprendre le souci « Résultat attendu pour transcription_arn(“”) : «  », pouvez-vous m’éclairer s’il vous plaît ?

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

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 :

Ligne 51: IndexError: string index out of range

Réponse de l’équipe

Bonjour Sarah,

As-tu testé ta fonction en lui passant une chaîne vide ?

Réponse de Sarah

Effectivement, ce cas renvoie une erreur, mais je n’arrive pas à la résoudre.

Réponse de l’équipe

En testant d’abord si la liste est non vide ?

MICKAËL

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.

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.

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.

s = "hello"
s = s.title()
print(s)

J’espère que cela répond à ta question.

UpyLaB 5.7

EMILIE

Bonjour,

Aux tests d’UpyLab j’ai 4 sur 5, un test ne passe pas :

Résultat attendu pour plus_grand_bord('babababababbbbbaaabaababab') : 'babab'

Pourtant c’est "bababa" le plus grand bord non ?

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".

Réponse d’EMILIE

Mais bien sûr ! Merci.

LAURENT

Bonsoir,

J’essaie de transformer une chaine en liste. J’ai essayé

chaine = "addddda"
maListe = chaine.split(',')

mais cela ne donne pas : ['a', 'd', 'd', 'd', 'd', 'd', 'a']

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.

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

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 ?

Réponse de l’équipe

Oui.

UpyLaB 5.8

MARTINE

Bonjour,

Mon exercice fonctionne parfaitement dans PyCharm et aussi dans UpyLaB, mais j’ai une erreur que je n’arrive pas à identifier :

Votre programme a été interrompu par une exception: Ligne 4: TypeError: unorderable types: str() < int()

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.

Réponse de MARTINE

C’est compris. Merci.

UpyLaB 5.9

NICOLE

Bonjour,

Est-ce qu’une âme charitable pourra me dire ce que représente le X dans :

Résultat attendu pour anagrammes('ironique', 'Xnirique') : False

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 ?

Réponse de NICOLE

Ah d’accord, au temps pour moi, je n’y étais pas du tout.

ARMAND

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?

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” ?

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

Bonjour,

Je ne parviens pas à trouver comment résoudre l’erreur :

Ligne 51: UnboundLocalError: local variable 'res' referenced before assignment

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

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 ?

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

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 » )?

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

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.

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

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.

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 ?

l = [1, 3, 5]
print(my_insert(l, 4)) #doit afficher [1, 3, 4, 5]
print(l) #doit afficher [1, 3, 5]

JEAN-PAUL

Bonjour,

Je reçois l’anomalie suivante :

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 ?

Réponse de l’équipe

Bonjour Jean-Paul,

As-tu bien pris en compte cette partie de la consigne ?

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

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 ?

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

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.

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 :

def func(s):
    s[0] = 0

l = [1, 2, 3]
print("Liste avant fonction", l)
func(l)
print("Liste après fonction", l)

Réponse de PIERRE

Merci. Je pense avoir compris : mon exercice est validé.

UpyLaB 5.14

ELLIOT

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.

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

Bonsoir,

Je ne comprends pas toutes les réponses attendues de l’exercice :

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.

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

Bonjour

Le programme test réalisé dans PyCharm fonctionne très bien mais dans UpyLaB j’obtiens le message suivant :

Votre programme a été interrompu par une exception :

Ligne 51: IndexError: string index out of range

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.

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

Bonjour,

Dans la fonction my_pow, je ne passe pas les trois derniers tests. Ai-je oublié des cas particuliers ? merci.

Réponse de l’équipe

Bonjour SOPHIE,

Il est demandé de gérer les cas où les arguments ne sont pas du bon type.

Réponse de SOPHIE

Oui j’ai utilisé des assert.

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à.

Réponse de SOPHIE

Effectivement, j’ai remplacé par l’utilisation de la fonction type et un test et cela fonctionne. Merci.

CHRISTIAN

Bonjour,

Dans PyCharm, tout fonctionne bien, mais UpyLaB me dit que c’est faux. Par exemple :

>>>my_pow(3, 7.0)
[1, 7.0, 49.0]

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.

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.

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

Bonjour,

Je teste bien le type des arguments, pourtant j’ai des croix rouges dans UpyLaB :

if type(m) is int() and type(b) is float():

Qu’est-ce qui cloche ?

Réponse de l’équipe

Bonjour MARTIN,

Attention vous confondez le nom du type par exemple int avec la fonction de cast int().

Réponse de MARTIN

Merci, ça fonctionne après correction.

UpyLaB 5.17

PAULINE

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 ?

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?

Réponse de PAULINE

Merci, ça fonctionne.

UpyLaB 5.18

VALÉRIE

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 ?

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

Bonjour,

Je n’ai pas compris comment insérer la fonction lambda : doit-on écrire pour l’appel de la fonction :

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 !

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

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 :

Votre programme a été interrompu par une exception: Ligne 1: FileNotFoundError: [Errno 2] No such file or directory: 'c:/Users/mariejeanne/Desktop/Python/'

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

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 :

[Errno 2] No such file or directory: 'acro2.txt'

Comment puis-je tester ma fonction ?

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

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…

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

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…

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

Bonjour,

je ne vois pas pourquoi mon code est rejeté pour le texte 2. Tout est ok sur Pycharm pourtant…

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

Bonjour,

j’ai un sérieux problème avec ces fichiers. Je ne comprends pas ce qui bloque.

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 !

Réponse de NINA

Désolée mais je ne comprends pas la différence par rapport à ce qui est demandé depuis des semaines.

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

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.

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

Bonjour,

PyCharm me retourne le message d’erreur suivant que je ne comprends pas :

AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'.

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

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.

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

Bonjour,

« N’était-ce » correspond-il à un seul mot, ou à trois mots ? Merci

Réponse de l’équipe

Bonjour Sophia,

« n’était-ce » comporte bien trois mots ; « n” », « était » et « ce ».

Bon courage !

NATHAN

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 ?

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 ?

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

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 !

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

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().

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...

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

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 :

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.

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'.

Réponse de STÉPHANIE

Ah je comprends. Donc dans mon code j’ai :

def wc(monfichier):
    # ici ma fonction

et que j’appelle par exemple comme ceci :

wc('monfichier.txt')

Réponse de l’équipe

C’est exactement ça.

PAUL

Bonjour,

J’ai enfin compris mon erreur, j’avais oublié des séparateurs : les tabulations et les points que je ne retirais pas.

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

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 ?

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 :

>>> m = init_mat(2, 3)
>>> m[0][0] = 1

La matrice m devrait être :

[[1, 0, 0], [0, 0, 0]]

Et non

[[1, 0, 0], [1, 0, 0]]

UpyLaB 5.24

CLAIRE

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.

Réponse de l’équipe

Bonjour CLAIRE,

Effectivement, si on a :

L = [1, 2, 3]

et qu’on fait :

print(L)

on obtiendra cela comme affichage :

[1, 2, 3]

Pour cette liste nous aimerions obtenir cet affichage :

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

Bonjour,

J’ai testé ma fonction sur mon IDE qui fonctionne mais je ne comprends pas où ajouter les deux lignes demandées :

m = eval(input())
print_mat(m)

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

Bonsoir,

Mon programme a été interrompu par une exception :

Ligne 4: IndexError: list index out of range

Quel est le problème…sauf ça, tout est bon ? Merci par avance pour votre aide.

Réponse de l’équipe

Bonsoir Julie,

Ne serait-ce pas le cas de la matrice vide ?

UpyLaB 5.26

EDITH

Bonsoir,

Pourquoi la matrice ci-dessous n’est-elle pas antisymétrique ?

[[0, -8],
 [8, -1]]

Merci par avance pour votre aide.

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.

Réponse de EDITH

Merci pour cette explication.

UpyLaB 5.27

PAUL

Bonjour,

Pourquoi est-ce que j’obtiens [None, None, None] en utilisant une compréhension de liste ?

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

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 :

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 ?

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 :

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 !