Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simplifier le code

simple

    12 août 2010 à 15:40:30

    Bonjour, j'apprecie bcp le fait que vous portiez une grande attention au debutant. Parrelelement au cours de 6pri1 et prolixe je lis un bouquin qui s'intitule Apprendre a programmer en Python.
    Ce livre est formidable et me permet de mieux comprendre le tuto de 6pri1 et prolixe.
    Le livre contient des exercices et voici un que j'ai realise
    #!/usr/bin/python
    # -*- coding: Utf-8 -*-
    
    # Ceci est l'exercice 4.6 du livre
    # Ce programme consiste a convertir une quantite entiere en annee, mois, jour, minutes et en secondes
    # Il est conseille d'avoir l'interpreteur python2.6 pour que vous n'ayez pas de probleme de compatibilite.
    # Je n'ai pas encore migre, desole!
    
    """Ce programme fonctionne sur des principes de division et de modulo.
    On sait que 60 sec = 1 min, 3600 sec = 1 heure, 86400 sec = 1 jour, 2592000 sec = 1 mois
    et enfin 31104000 sec = 1 an.  Donc le programme analyse la valeur entree par l'utilisateur
    pour savoir s'il doit commencer la conversion a partir d'annee, de mois, de jour,
    d'heure ou de minutes.  Ou s'il ne lui faut rien convertir.  Si vous avez un interpreteur python 2.6
    mon script devrais marcher sur votre ordi.  A+.
    """
    
    tourneProgramme = 1
    while tourneProgramme:
    	valeur = input("Donnez une grande valeur entiere : ")
    	if valeur < 60:
    		seconde = valeur
    		print 'Vous avez', seconde, 'seconde(s)'
    	elif valeur >= 60 and valeur < 3600:
    		minutes = valeur / 60
    		seconde = valeur % 60
    		print 'Vous avez', minutes, 'mn(s) et', seconde, 'sec(s)'
    	elif valeur >= 3600 and valeur < 86400:
    		heure = valeur / 3600
    		reste = valeur % 3600
    		minut = reste / 60
    		secon = reste % 60
    		print 'Vous avez', heure, 'hr(s),', minut, 'min(s) et', secon, 'sec(s)'
    	elif valeur >= 86400 and valeur < 2592000:
    		jour = valeur / 86400
    		reste = valeur % 86400
    		heure = reste / 3600
    		reste1 = reste % 3600
    		min = reste1 / 60
    		sec = reste1 % 60
    		print jour,'jr(s)', heure,'hre(s)', min,'min(s)', sec, 'sec(s)'
    	elif valeur >= 2592000 and valeur < 31104000:
    		mois = valeur / 2592000
    		reste = valeur % 2592000
    		jour = reste / 86400
    		reste1 = reste % 86400
    		heure = reste1 / 3600
    		reste2 = reste1 % 3600
    		min = reste2 / 60
    		sec = reste2 % 60
    		print mois, 'mois', jour, 'jour(s)', heure, 'hre(s)', min, 'mn(s)', sec, 'sec(s)'
    	elif valeur > 31104000:
    		an = valeur / 31104000
    		reste = valeur % 31104000
    		mois = reste / 2592000
    		reste1 = reste % 2592000
    		jour = reste1 / 86400
    		reste2 = reste1 % 86400
    		heure = reste2 / 3600
    		reste3 = reste2 % 3600
    		min = reste3 / 60
    		sec = reste3 % 60
    		print an, 'an(s)', mois, 'mois', jour, 'jr(s)', heure, 'hre(s)', min, 'min(s)', sec, 'sec(s)'
    	refaire = raw_input("Voulez-vous quitter le programme(o/n)")
    	if refaire == 'o' or refaire == 'O':
    		tourneProgramme = 0
    	else:
    		tourneProgramme = 1
    

    Ce programme fait la conversion de secondes en annee, jour, mois, heure et minutes.
    Je pense que mon code est trop long pour cette tache simple. Alors si vous avez des idees pour reduire le code ce serait super.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      12 août 2010 à 16:04:04

      Bonjour,

      Tu trouveras un corrigé de l'exercice en annexe B du livre (ou pdf). Étant donné que cet exercice est au début du livre, il est possible que les réponses que te donneront les Zéros qui ne suivent pas ce cours ne soient pas de ton niveau.

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        12 août 2010 à 16:34:32

        En effet, il y a des solutions beaucoup plus efficaces par la suite, en voila une qui simplifie grandement la vie

        >>> import datetime
        >>> str(datetime.timedelta(seconds=123456789765))
        '1428898 days, 0:42:45'


        Sinon pour ta méthode on peut simplifier avec la fonction divmod qui te donne l'entier et le reste de ta division

        >>> heure, minute=divmod(80, 60)
        >>> print heure, minute
        1 20


        • Partager sur Facebook
        • Partager sur Twitter
          12 août 2010 à 18:04:47

          En fait tu te compliques la vie, je vais faire un exemple sur tes 2 premiers if :
          if valeur < 60:
          	seconde = valeur
          	print 'Vous avez', seconde, 'seconde(s)'
          elif valeur >= 60 and valeur < 3600:
          	minutes = valeur / 60
          	seconde = valeur % 60
          	print 'Vous avez', minutes, 'mn(s) et', seconde, 'sec(s)'
          

          Supposons par exemples que j'envoie une valeur inférieure à 60 dans le premier elif , que se passe-t-il ?
          minutes = valeur / 60 # ici minutes vaudra 0 car on fait des divisions entières
          seconde = valeur % 60 # et ici seconde vaudra valeur vu que si valeur < 60, valeur%60 = valeur
          # On se retrouve dans le cas du premier if
          

          Donc en fait je peux regrouper le if et le premier elif ensemble en faisant ainsi :
          if valeur < 3600:
              minutes = valeur / 60
              seconde = valeur % 60
              print 'Vous avez',minutes,'mn(s) et',second,'sec(s)'
          

          Certes tu te retrouves à dire "Vous avez 0 minute(s)" si valeur < 60, mais tu as économisé un if , et si tu regardes toute ta série de elif , tu devrais voir que tu peux tous les simplifier de la même manière pour arriver à un seul ;)
          • Partager sur Facebook
          • Partager sur Twitter
            12 août 2010 à 19:04:46

            Du coup j'ai eu envie de m'amuser moi aussi :-°

            def myconvert(seconds):
                periods = (year, month, day, hour, minute, second) = range(6)
            
                period_in_seconds = {year: 31104000,
                                     month: 2592000,
                                     day: 86400,
                                     hour: 3600,
                                     minute: 60,
                                     second: 1}
            
                result = list()
                remainder = seconds
                for k in periods:
                    x, remainder = divmod(remainder, period_in_seconds[k])
                    result.append(x)
            
                return result
            

            Le coup de l'enum bricolée (première ligne de la fonction), c'est pas forcément super clair, mais je pouvais pas utiliser un dict à cause de l'ordre à conserver (j'aurais pu utiliser une liste de tuples par contre...).

            C'est pas encore super beau, je pense qu'on doit pouvoir faire bien mieux que ça.
            • Partager sur Facebook
            • Partager sur Twitter

            Blond, bouclé, toujours le sourire aux lèvres...

              12 août 2010 à 20:52:32

              Citation

              En fait tu te compliques la vie, je vais faire un exemple sur tes 2 premiers if :

              Code : Python
              1
              2
              3
              4
              5
              6
              7 if valeur < 60:
              seconde = valeur
              print 'Vous avez', seconde, 'seconde(s)'
              elif valeur >= 60 and valeur < 3600:
              minutes = valeur / 60
              seconde = valeur % 60
              print 'Vous avez', minutes, 'mn(s) et', seconde, 'sec(s)'


              Si une valeur inferieur a 60 est donnée le programme l'affecte immediatement a seconde.
              tu as vu
              7 if valeur < 60:
              	seconde = valeur
              	print 'Vous avez', seconde, 'seconde(s)'
              

              C'est simple!
              • Partager sur Facebook
              • Partager sur Twitter
                13 août 2010 à 2:19:12

                Simple mais moche et lourd.
                • Partager sur Facebook
                • Partager sur Twitter

                Blond, bouclé, toujours le sourire aux lèvres...

                  13 août 2010 à 15:13:17

                  LoupSolitaire : en python3, tu as les odict, qui sont des dictionnaires triés, que tu peux avoir en faisant from collections import OrderedDict as odict . Par contre, il faut mettre les clés à la main, soit directement, soit en itérant sur une liste de tuples.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 août 2010 à 16:10:11

                    J'ai regardé vite fait ouais, faut que je teste ça...

                    EDIT : Effectivement, c'est mieux

                    from collections import OrderedDict as odict
                    
                    def convertpy3k(seconds):
                        periods_in_seconds = odict([("year", 31104000),
                                                    ("month", 2592000),
                                                    ("day", 86400),
                                                    ("hour", 3600),
                                                    ("minute", 60),
                                                    ("second", 1)])
                    
                        result = dict()
                        remainder = seconds
                        for k, v in periods_in_seconds.items():
                            x, remainder = divmod(remainder, v)
                            result[k] = x
                    
                        return result
                    

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Blond, bouclé, toujours le sourire aux lèvres...

                      13 août 2010 à 17:21:28

                      Vous n'avez pas un code a me proposer qui soit en python 2.6.
                      Les dictionnaires marcheront surement mais comment les faires en 2.6
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 août 2010 à 17:28:19

                        LoupSolitaire a déjà posté un code équivalent en python 2.6 plus tôt...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Simplifier le code

                        × 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