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.
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.
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
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.
LoupSolitaire : en python3, tu as les odict, qui sont des dictionnaires triés, que tu peux avoir en faisant fromcollectionsimportOrderedDictasodict. Par contre, il faut mettre les clés à la main, soit directement, soit en itérant sur une liste de tuples.
LoupSolitaire a déjà posté un code équivalent en python 2.6 plus tôt...
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.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...