Partage
  • Partager sur Facebook
  • Partager sur Twitter

Des questions sur le Python

[Exercices] Grand-écart et triangle de Pascal

Sujet résolu
    23 juillet 2010 à 18:51:30

    Plus personne intéressé par le tableau de Pascal ? :'(
    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2010 à 21:43:09

      Ma petite contribution qui a pour but de faire servir un peu les "list comprehensions" :

      def grandecart( liste ):
         return max( abs(a-b) for a,b in zip( liste[:-1], liste[1:] ) )
      
      def pascal( n ):
      	if n <= 0:
      		return []
      	else:
      		p = pascal( n-1 )
      		return [1] + [ a+b for a,b in zip( p[1:],p ) ] + [1]
      


      (on peut remplacer zip par itertools.izip)
      • Partager sur Facebook
      • Partager sur Twitter
        23 juillet 2010 à 21:53:03

        Merci de ta contribution :D
        Mais pour la syntaxe du tableau de Pascal ?
        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2010 à 22:21:31

          Pour avoir un joli affichage :

          tu sais que :

          print "%4d" % n
          


          affiche l'entier n aligné à droite sur 4 chiffres... donc essaie :

          print "".join( ("%4d"%x) for x in liste )
          print ("%4d" * len(liste)) % tuple( liste )
          


          Sinon un commentaire sur ton code

          while i<long:
          		r = base[i] + base[i+1]
          		liste[i+1] = r
          		i+=1
          	liste.append(1)
          

          Déjà mets le i=0 au-dessus c'est plus clair, et aussi en python quand tu construis une liste il est en général très pratique de faire :

          liste = [ base[i] + base[i+1] for i in xrange( len(base)-1 ) ]
          
          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2010 à 23:55:56

            Citation : Lord Casque Noir


            tu sais que :

            print "%4d" % n
            



            affiche l'entier n aligné à droite sur 4 chiffres... donc essaie :



            En Python 3, ca donne quoi car je n'ai pas du tout appris les %4d..

            Citation : Lord Casque Noir


            Déjà mets le i=0 au-dessus c'est plus clair


            Regarde mon pst, j'ai un "nouveau" code en secret, que j'ai rajouté après avoir optimisé l'ancien code.

            Citation : Lord Casque Noir


            liste = [ base[i] + base[i+1] for i in xrange( len(base)-1 ) ]
            

            Merci, mais j'ai encore un peu de mal avec les compréhension de liste.
            Ca calcule donc le résultat. Ce dernier prend sa place grâce à la variable i ? Qui est ajouté dans liste tant qu'on est pas arrivé au dernier nombre
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 juillet 2010 à 0:15:39

              Citation

              En Python 3, ca donne quoi car je n'ai pas du tout appris les %4d..



              >>> tab=[1, 12, 123, 1234, 12345]
              >>> for i in tab:
                      print "%4d" %i
              
                      
                 1
                12
               123
              1234
              12345
              • Partager sur Facebook
              • Partager sur Twitter
                24 juillet 2010 à 0:23:43

                En Python 3.1.2 ?

                Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on
                win32
                Type "help", "copyright", "credits" or "license" for more information.
                >>> tab=[1, 12, 123, 1234, 12345]
                >>> for i in tab:
                ...     print "%4d" %i
                  File "<stdin>", line 2
                    print "%4d" %i
                              ^
                SyntaxError: invalid syntax
                >>>
                


                Edit : il manquait juste les () au print !
                Merci ;)

                J'ai quand même beaucoup de mal avec ces codes :
                print "".join( ("%4d"%x) for x in liste )
                print ("%4d" * len(liste)) % tuple( liste )
                


                liste = [ base[i] + base[i+1] for i in xrange( len(base)-1 ) ]
                
                • Partager sur Facebook
                • Partager sur Twitter
                  24 juillet 2010 à 1:32:29

                  > J'ai quand même beaucoup de mal avec ces codes

                  C'est le "%4d" ou le reste qui pose problème ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 juillet 2010 à 10:54:00

                    Donc j'ai compris ça. C'est plutôt ce code :
                    print ("%4d" * len(liste)) % tuple( liste )
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juillet 2010 à 14:41:25

                      OK. Je les reprends dans l'ordre :

                      [ ("%4d"%x) for x in liste ]
                      


                      correspond à <pour tous les éléments x de la liste, on formate l'élément avec "%4d"%x càd entier justifié à droite sur 4 caractères avec des espaces à gauche et on fourre le résultat dans une liste>

                      c'est un "list comprehension" c'est-à-dire :

                      [ machin(x) for x in liste ]
                      


                      donne pour liste = [1,2,3]

                      [ machin(1), machin(2), machin(3) ]
                      


                      c'est une façon pratique de manipuler des listes en python...

                      si tu remplaces les [] par des () tu obtiens un "generator comprehension" c'est-à-dire que ça ne créé pas une liste mais un générateur qui ne sera donc utilisable qu'une fois et qui ne créé pas de liste temporaire, ce qui est mieux quand tu comptes t'en servir une seule fois, ce qui est le cas ici.

                      print ("%4d" * len(liste)) % tuple( liste )
                      


                      Autre variante :
                      "%4d" % 1 donne "   1"
                      "%4d%4d" % (1,275) donne "   1 275"
                      


                      Là on construit une chaîne de fomat qui contient "%4d" autant de fois qu'il y a d'entiers à formater (en python tu peux multiplier une chaîne par un entier ce qui donne une répétition de la chaîne) et puis on donne cette chaîne de format à l'opérateur %. Le "tuple" est nécessaire car "%" veut un tuple pour la liste d'arguments mais liste est... une liste.

                      Plus clair ?

                      Note que quand tu comprends pas un truc, mets le en pièces détachées dans la console :

                      >>> l = range(5)
                      >>> l
                      [0, 1, 2, 3, 4]
                      >>> "%04d " % 2
                      '0002 '
                      >>> "%04d " * len(l)
                      '%04d %04d %04d %04d %04d '
                      >>> ("%04d " * len(l)) % l
                      Traceback (most recent call last):
                        File "<stdin>", line 1, in <module>
                      TypeError: %d format: a number is required, not list
                      >>> ("%04d " * len(l)) % tuple(l)
                      '0000 0001 0002 0003 0004 '
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 juillet 2010 à 19:23:48

                        Merci pour tes explications, claires et précise.
                        Cependant, il y a toujours un truc que je ne comprends pas :

                        % tuple( liste )
                        


                        Pourquoi on fait cette opération :o
                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 juillet 2010 à 12:09:02

                          Parce que la commande 'print' qu'il t'a montrée prend un tuple comme paramétre, et non une liste...
                          essaye en remplaçant tuple(liste) par liste, et tu verras.

                          la commande
                          tuple(liste)
                          
                          génére un tuple ayant les mêmes valeurs que ta liste.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juillet 2010 à 17:10:41

                            En fait c'est l'opérateur "%" qui a besoin d'un tuple à sa droite, mais sinon c'est exactement ça. Si tu as python3 et que tu utilises format() c'est différent.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 juillet 2010 à 23:09:55

                              "%" doit obligatoirement avoir un tuple pour effectuer l'opération ?

                              Mais pour on fait un modulo entre "%4d" * len(liste)) et tuple( liste )
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2010 à 23:18:50

                                Vas-y étape par étape :

                                # Ça, c'est simple, on écrit une chaine dans le but de la formater plus tard
                                print("%4d")
                                
                                # On peut multiplier une chaîne par un nombre pour la répéter
                                # Admettons que len(liste) vaut 6, on pourrait écrire l'instruction comme ceci :
                                # print("%4d%4d%4d%4d%4d%4d")
                                print("%4d" * len(liste))
                                
                                # tuple(liste) crée un tuple pour chaque valeur dans la liste :
                                >>> tuple(liste)
                                (0, 1, 2, 3, 4, 5)
                                
                                # Finalement, on réunit toutes ces opérations :
                                print ("%4d" * len(liste)) % tuple( liste )
                                
                                # Si les valeurs étaient connues, on aurait pu écrire cette instruction comme ceci par exemple :
                                print("%4d%4d%4d%4d%4d%4d") % (0, 1, 2, 3, 4, 5)
                                
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 juillet 2010 à 23:21:30

                                  Citation : nicodec57

                                  Mais pour on fait un modulo



                                  nombre % nombre c'est le modulo mais string % arguments c'est l'opérateur de formatage...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 juillet 2010 à 11:21:41

                                    Citation : Lord Casque Noir

                                    nombre % nombre c'est le modulo mais string % arguments c'est l'opérateur de formatage...



                                    Ha ! o_O Mais je savais pas ça. C'est dans quel chapitre du tutoriel officiel ?

                                    Citation : Fayden


                                    # Ça, c'est simple, on écrit une chaine dans le but de la formater plus tard
                                    print("%4d")
                                    
                                    # On peut multiplier une chaîne par un nombre pour la répéter
                                    # Admettons que len(liste) vaut 6, on pourrait écrire l'instruction comme ceci :
                                    # print("%4d%4d%4d%4d%4d%4d")
                                    print("%4d" * len(liste))
                                    
                                    # tuple(liste) crée un tuple pour chaque valeur dans la liste :
                                    >>> tuple(liste)
                                    (0, 1, 2, 3, 4, 5)
                                    
                                    # Finalement, on réunit toutes ces opérations :
                                    print ("%4d" * len(liste)) % tuple( liste )
                                    
                                    # Si les valeurs étaient connues, on aurait pu écrire cette instruction comme ceci par exemple :
                                    




                                    Oui je comprends bien
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 juillet 2010 à 12:58:57

                                      Citation : nicodec57

                                      Ha ! o_O Mais je savais pas ça. C'est dans quel chapitre du tutoriel officiel ?



                                      Ah, j'en sais rien, mais note que c'est python 2.x, en python 3 il vaut mieux utiliser format() qui est plus propre.

                                      >>> 10%3
                                      1
                                      >>> "%8.02f" % 1.23
                                      '    1.23'

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 juillet 2010 à 17:29:34

                                        S'il n'est pas dans le tutoriel, c'est pour justement privilégier format(), donc autant l'utiliser plutôt que de recourir à des méthodes qui vont être supprimées.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 juillet 2010 à 20:54:57

                                          Ok, d'accord.
                                          Format() s'utilise de la même manière ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            31 juillet 2010 à 17:56:13

                                            C'est dans le tuto donc bon.
                                            >>> print("Salut {0} qui a {1} ans et {2} jours".format("Jean michemiche Jarre", 35, 12))
                                            Salut Jean michemiche Jarre qui a 35 ans et 12 jours
                                            
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              31 juillet 2010 à 21:00:34

                                              Oui je sais bien, mais je sais pas trop comment l'utiliser avec %4d.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                31 juillet 2010 à 23:09:47

                                                Bonjour,

                                                La documentation officielle est une très bonne source de renseignement. :p
                                                Même si tu ne parle pas l'anglais, il y a plein d'exemples pour t'aider à comprendre !

                                                @+
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  31 juillet 2010 à 23:24:36

                                                  Merci à tous pour les réponses ;)
                                                  Sujet résolu !
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Des questions sur le Python

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown