Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices du cours Python / postez ici !

    29 juin 2020 à 20:23:29

    L'erreur était de suivre le TP :)

    Si tu essais la correction et les exemple de manipulation fournis (legumes + fruits) , tu verras que la correction est buggé . La fonction add de la correction ne fonctionne pas .

    if type(autre_objet) is type(self)

    is signifie que tu verifies qu'il pointe vers la même réference .  Dans ce cas ,il pointe vers la meme reference  .

    Je t'ai apporté ma petite correction ci dessous . On ne peux pas ajouter le meme dictionnaire ou un dictionnaire avec autre chose .



    def __add__(self, autre_objet):
            """On renvoie un nouveau dictionnaire contenant les deux
            dictionnaires mis bout à bout (d'abord self puis autre_objet)"""
           
            if autre_objet is self or type (autre_objet) != type (self)  :
                raise TypeError( \
                    "Impossible de concaténer {0} et {1}".format( \
                    type(self), type(autre_objet)))
            else:
                nouveau = DictionnaireOrdonne()
               
                # On commence par copier self dans le dictionnaire
                for cle, valeur in self.items():
                    nouveau[cle] = valeur
               
                # On copie ensuite autre_objet
                for cle, valeur in autre_objet.items():
                    nouveau[cle] = valeur
                return nouveau
    


    -
    Edité par ChFzaf 29 juin 2020 à 20:24:32

    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2020 à 20:58:38

      Mecri  ChFzaf,

      A la base je voulais juste tester si l'objet ajouté était bien un dictionnaire ordonné voici ce que j'avais fait, en partant toujours de la correction mais ça ne marche pas non plus car not in sert à voir si un objet se trouve dans un conteneur...

      def __add__(self, objet_ajoute):
      	
      	#vérification du type de dictionnaire(ne fonctionne pas)
      		if type(objet_ajoute) not in type(DictOrdo):
      			
      			raise TypeError("l'objer à ajouter doit être un dictionnaire un dictionnaire ordonné")
      			
      		else:
      			nveau_dico = DictOrdo()
      		
      			for cle, valeur in zip(self._index, self._value):
      							
      				nveau_dico[cle]=valeur
      			
      			for cle, valeur in objet_ajoute.items():
      			
      				nveau_dico[cle]=valeur
      			
      		return nveau_dico				

      Ton explication est quand même bien plus claire en tout cas

      • Partager sur Facebook
      • Partager sur Twitter
        30 juin 2020 à 18:50:16

        Salut à tous, 

        Je suis confronté à quelque chose d'étrange que je n'arrive pas solutionner...

        L'exercice consiste à faire la somme des chiffres d'un nombre quelconque et le retourner comme ceci :

        16 --> 1 + 6 = 7

        942 --> 9 + 4 + 2 = 15 --> 1 + 5 = 6

        132189 --> 1 + 3 + 2 + 1 + 8 + 9 = 24 --> 2 + 4 = 6

        493193 --> 4 + 9 + 3 + 1 + 9 + 3 = 29 --> 2 + 9 = 11 --> 1 + 1 = 2

        Mon code est le suivant, il semble fonctionner car le print() précédant le return m'indique la bonne valeur. Par contre le return me renvoit None dès que la fonction a été utilisé plus d'une fois (si la somme du nombre est supérieur à 10 dès la première itération)

        def digital_root(n):
            n=str(n)
            somme=0
        
            for i in range(len(n)):
                somme+=int(n[i])
        
            if len(str(somme))>1:
                digital_root(somme)
            else:
                print(somme)
                return somme

        Merci pour votre aide!

        Etienne

        -
        Edité par EtienneDubs 30 juin 2020 à 18:51:04

        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2020 à 22:49:11

          def digital_root(n):
              
              n=str(n)
              somme=0
          
              for i in range(len(n)):
          
                  somme += int(n[i]) #n [0]
          
              
                  
                  
           
              if len(str(somme))> 1:
                  return digital_root(somme)
          
              if len(str(somme))== 1:
                  return somme
                  
          Ce code devrait recoudre ton problème EtienneDubs .
          Tu avais un probleme dans ta recursion . Ton premier appel de la fonction digital_root renvoie logiquement none vu qu'il est dans le cas de if len(str(somme))>1 et que tu n'as pas renvoyer de "return" . 
          Effectivement , in n'est pas adapté vu que c'est un conteneur

          -
          Edité par ChFzaf 30 juin 2020 à 22:52:07

          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2020 à 10:42:52

            Salut ChFzaf,

            Merci pour ta réponse, en effet ça fonctionne.

            Je ne comprends pas pourquoi par contre dans le code que je propose (je le remets ci-dessous) :

            Le print(somme) me renvoit bien la valeur de la somme (un entier) alors que le return dans la même boucle (else) me renvoit None. La variable existe pour un print mais pas pour un return ?

            De plus, pourquoi faut-il mettre un 'return' devant l'appel de la fonction digital-root ?

            def digital_root(n):
                n=str(n)
                somme=0
             
                for i in range(len(n)):
                    somme+=int(n[i])
             
                if len(str(somme))>1:
                    digital_root(somme)
                else:
                    print(somme)
                    return somme

            Merci !

            • Partager sur Facebook
            • Partager sur Twitter
              1 juillet 2020 à 12:43:09

              edit :
              Je reprends pas a pas ton code comme lirai l'interpreteur de python .
              1-1) digital_root(555) #j'essaie ta fonction avec le parametre 555 (n)
              1-2)Ta boucle fait somme = 5+5+5 ce qui donne somme = 15
              1-3)Tu es dans le cas de if len(str(somme))>1 car len (str (15)) = 2 .Tu executes ta deuxième fonction digital _root (15) (premiere ligne du if)
              
              2-1)La boucle de la deuxieme fonction digital_root fait somme = 1 +5 ce qui donne somme =6
              2-2) Tu es dans le cas de else car len (str (6)) = 1 .Ta deuxieme fonction affiche 6 et ta deuxieme fonction retourne 6
              1-4) L’interpréteur python a terminé la ligne 9 digital_root(somme) dans ta premiere fonction , il attaque la prochaine ligne mais il n'y en a pas . (else ne s'execute pas vu que tu es dans le cas de if).
              1-5) Ta première fonction n'a pas de return donc elle retourne "none"
               
              Ton print correspond à la deuxieme fonction et non la première .
              Ta deuxieme fonction retourne la bonne valeur  mais la premiere ne retourne rien (none)
               
              Si tu veux que ta premiere fonction retourne la valeur de ta deuxieme fonction ,tu dois le specifier .
              https://code.tutsplus.com/fr/tutorials/demystifying-python-recursion--cms-30418
              






              -
              Edité par ChFzaf 1 juillet 2020 à 18:01:53

              • Partager sur Facebook
              • Partager sur Twitter
                1 juillet 2020 à 18:13:31

                Merci pour le détail de l'explication, je comprends mieux. C'est subtil l'imbrication de fonction !

                @+

                • Partager sur Facebook
                • Partager sur Twitter
                  4 juillet 2020 à 11:12:17 - Message modéré pour le motif suivant : Aucune précision sur le problème


                    5 juillet 2020 à 10:26:43 - Message modéré pour le motif suivant : Aucune précision sur le problème


                      5 juillet 2020 à 14:35:30

                      Bonjour,

                      Je repost ma question, au cas où ...

                      Samy A. SAAD a écrit:

                      Bonjour :D

                      Dans ce cours, il faut faire pleins de test avec pytest.

                      Le code à tester:

                      class Agent:
                          def __init__(self, position, **properties):
                              self.position = position
                              for property_name, property_value in properties.items():
                                  setattr(self, property_name, property_value)



                      On cherche à voir si il y a bien un dictionnaire qui est assigné en tant qu'attribut de classe.

                      D'après le cours, voici le code qui permet de tester à l'aide de pytest:

                      import ~nom_du_programme~ as script
                      
                      #assigner un dictionnaire en tant qu'attributs
                      def test_set_agent_attributes():
                          agent = script.Agent(3, agreeableness=1)
                          assert agent.agreeableness == 1

                      Ma question est la suivante:
                      En quoi ce teste vérifie qu'il s'agisse bien d'un dict ?

                      A mon sens, on regarde uniquement que sa valeur ==1

                      Et ce que j'ai tord, et pourquoi ?

                      -
                      Edité par Samy A. SAAD 26 juin 2020 à 19:46:46



                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juillet 2020 à 16:07:11

                        class Agent:
                            def __init__(self, position, **properties):
                                self.position = position
                                for property_name, property_value in properties.items():
                                    setattr(self, property_name, property_value)
                        def test_set_agent_attributes():
                            agent = Agent(3, agreeableness=1)
                            assert agent.agreeableness == 1



                        Cela vérifie bien que c'est un dictionnaire .

                        1)Le paramatre **properties  de la classe Agent signifie que tu attends un dictionnaire (property [0], property [1],...) .Ce champs est optionnelle . Tu pourrais ne pas renseigner de parametre tel Agent (3)

                        Par contre ca buggerai à la ligne setattr(self, property_name, property_value) :)

                        2)

                        setattr(self, property_name, property_value)

                        setattr modifie la valeur de ton attribut issue d'Agent . dans le cas ou l'attribut n'existe pas , il le crée .

                        setattr attend trois paramètres (la classe ou l'objet, l'attribut et sa valeur)

                        3) Si ce n'est pas un dictionnaire tu aurais une erreur . Donc si agent.agreeableness == 1 ,c'est que c'est un dictionnaire

                        -
                        Edité par ChFzaf 5 juillet 2020 à 16:12:28

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juillet 2020 à 14:00:48

                          Merci ChFzaf!

                          Mais si je bidouille les entrés, que je force les propriétés de l'agent, de sorte à ne rentrer qu'une liste (au lieu d'un dictionnaire).

                          J'ai l'impression que le test n'échouerais pas.
                          Je me trompe ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 juillet 2020 à 17:54:53

                            Samy A. SAAD a écrit:

                            Merci ChFzaf!

                            Mais si je bidouille les entrés, que je force les propriétés de l'agent, de sorte à ne rentrer qu'une liste (au lieu d'un dictionnaire).

                            J'ai l'impression que le test n'échouerais pas.
                            Je me trompe ?

                            Heu , je n'ai pas  compris ce que tu voulais dire par forcer les propriétés Agent ....

                            Quand tu fais agent.agreeableness ,tu vérifies que l'attribut agreableness existe et qui vaut 1 . Si tu rentre un liste au lieu d'un dictionnaire dans le second paramètre d'Agent,ca va bugger à la fonction setattr donc l'attribut agreableness ne sera jamais crée .

                            C'est peut etre moi qui n'a rien compris  .Tu aurais un exemple ou le test n’échoue pas sans dictionnaire ?




                            -
                            Edité par ChFzaf 6 juillet 2020 à 17:57:36

                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 juillet 2020 à 18:08:55

                              Non, je n'ai pas d'exemple, parce que tu as raison ChFzaf!

                              Merci encore pour tes réponses.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 juillet 2020 à 19:50:17 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                                  13 juillet 2020 à 15:13:01

                                  j'essaye d'enregistrer mon programme que j'ai établit dans l'interpreteur python au niveau de mon bloc note mais quand je click dessus pour exécuter rien n'affiche
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    25 juillet 2020 à 9:31:04

                                    Bonjour,  j'ai un petit soucis avec un fichier à télécharger pour le cours "perfectionnez vous en python". Je dois avoir un fichier nommé syceronbrut.xml or le lien mis dans le cours m'amène un dossier zippé qui ne contient pas ce fichier. J'ai fait un petit tour sur le github du cours aussi mais je ne vois pas ce fichier. Si quelqu'un peut m'aider à l'obtenir pour ainsi continuer ce cours ce serait génial.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 août 2020 à 8:25:57

                                      Bonjour,

                                      Dans apprennez à programmer en Python, je suis sur le chapitre des Expression Regulière.

                                      Il est dit que normalement que lorsque la méthode search ne trouve rien elle renvoi NONE. Je ne dois pas faire ce qu'il faut elle ne revoie rien lorsqu'elle ne trouve pas l'expression demandée.

                                      C'est à ce niveau du cours:

                                      >>> re.search(r"abc", "abcdef")
                                      <_sre.SRE_Match object at 0x00AC1640>
                                      >>> re.search(r"abc", "abacadaeaf")
                                      >>> re.search(r"abc*", "ab")
                                      <_sre.SRE_Match object at 0x00AC1800>
                                      >>> re.search(r"abc*", "abccc")
                                      <_sre.SRE_Match object at 0x00AC1640>
                                      >>> re.search(r"chat*", "chateau")
                                      <_sre.SRE_Match object at 0x00AC1800>
                                      >>>

                                      Et voici ce que j'obtiens :

                                      >>> re.search(r"abc", "toto")
                                      >>>

                                      Est ce que je suis passé à côté de quelque chose?

                                      Merci d'avance


                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 août 2020 à 1:10:49

                                        moije suis sur l,exercice de python pour le Zcasino mais mon programme indique une erreur qui est :TypeError: '<' not supported between instances of 'str' and 'int' =
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          3 août 2020 à 6:31:44

                                          ProsperOubo a écrit:

                                          moije suis sur l,exercice de python pour le Zcasino mais mon programme indique une erreur qui est :TypeError: '<' not supported between instances of 'str' and 'int' =


                                          Vérifie les types de tes variables dans ton opération de comparaison, tu as deux types qui ne sont pas compatibles pour faire cela.

                                          C'est comme si tu faisais "ab" < 3 ça n'est pas cohérent.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                            29 septembre 2020 à 11:53:03 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


                                              30 septembre 2020 à 15:52:56

                                              j

                                              -
                                              Edité par Eythannnn 30 septembre 2020 à 16:12:27

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                30 septembre 2020 à 16:12:11

                                                Eythannnn a écrit:

                                                bonjour je débute en programmation et j aurai besoin d être éclairé.

                                                J'ai un exercice : assigné la valeur 4 à a et 0.5 à x

                                                ensuit je dois calculer a*x, le soucis est que quand je fais somme = int(a)*int(x), le résultat revient toujours à 0 . Quelqu'un peut m aider svp 


                                                salut faut que tu fasse int(a)*float(x) car x est égale  à 0.05et 0.5 ce n'est pas un nombre entier donc faut utiliser float

                                                int=ENTIER

                                                float=Décimaux/nombre a virgule si tu préfere

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  3 octobre 2020 à 10:01:51

                                                  Salut ! 

                                                  j'apprend python sur oc la formation de 40 heures, 

                                                  je suis un peut bloqué sur le fait que je ne trouve pas vraiment la nécessité dans mes projets d'utiliser les metaclass  , du coups je me demande vraiment dans quel cas peut il bien servir, quel type d projet fairai obligatoirement appel aux metaclass

                                                  merci

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    3 octobre 2020 à 10:10:50

                                                    C'est normal, en pratique elles ne sont presque jamais utiles. Il y a un adage qui dit : si tu te demandes si tu as besoin d'une métaclasse c'est que tu n'en as pas besoin, quand tu en as besoin d'une tu le sais.

                                                    Il ne faut surtout pas vouloir à tout prix en utiliser dans tes projets.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      3 octobre 2020 à 12:00:32

                                                      entwanne a écrit:

                                                      C'est normal, en pratique elles ne sont presque jamais utiles. Il y a un adage qui dit : si tu te demandes si tu as besoin d'une métaclasse c'est que tu n'en as pas besoin, quand tu en as besoin d'une tu le sais.

                                                      Il ne faut surtout pas vouloir à tout prix en utiliser dans tes projets.


                                                      Merci
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        7 octobre 2020 à 12:23:36 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                                                          9 octobre 2020 à 13:09:41

                                                          Hello !

                                                          Je suis en train de lire le chapitre sur les générateurs. L'exemple du cours est celui d'un générateur qui renvoie dans l'ordre croissant les entiers strictement compris entre deux bornes. Pour tester l'échange des données entre le générateur et la boucle, je souhaitais donner la possibilité d'envoyer un booléen au générateur à tout moment depuis la boucle afin d'inverser l'ordre de renvoi.

                                                          def rangein(minimum, maximum):
                                                              value = minimum + 1
                                                              isreverse = False
                                                              while value in range(minimum + 1, maximum):
                                                                  reverse = (yield value)
                                                                  # Get the value sent by the loop and update isreverse
                                                                  if reverse is not None and isinstance(reverse, bool):
                                                                      isreverse = reverse
                                                                  value += (1 if not isreverse else -1)
                                                          
                                                          gen = rangein(2,8)
                                                          for i in gen:
                                                              if i == 6:
                                                                  gen.send(True)
                                                              print(i)

                                                          Le résultat renvoyé est le suivant :

                                                          3
                                                          4
                                                          5
                                                          6
                                                          4
                                                          3

                                                          Alors que j'attends bien 3 4 5 6 5 4 3. Je ne comprends pas vraiment d'où vient l'erreur, sachant que quelques print() judicieusement placés dans le générateur me renvoient bien les bonnes valeurs...

                                                          Merci d'avance pour votre aide :)

                                                          -
                                                          Edité par maciozik 9 octobre 2020 à 13:11:48

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            9 octobre 2020 à 13:21:04

                                                            Salut,

                                                            Le soucis c'est que send fait aussi avancer le générateur, et renvoie lui-même une valeur que tu ne traites pas (5). Une idée serait alors de yielder à nouveau cette valeur par exemple. J'en parle ici et illustre le problème avec une solution, si ça t'intéresse : https://zestedesavoir.com/tutoriels/954/notions-de-python-avancees/3-further/1-generators/#2-2-send

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Exercices du cours Python / postez ici !

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            • Editeur
                                                            • Markdown