Help python

Ayaaaao
2021-03-18 21:21:47

je dois créer des fonction, une qui convertit le temps en seconde et une autre qui convertit les seconde en jours/heure/minutes/secondes

#temps[0] : jours, temps[1]: heures, temps[2]: minutes, temps[3]: secondes

def tempsEnSeconde(temps):
""" Renvoie la valeur en seconde de temps donné comme jour, heure, minute, seconde."""
print(temps[0] *86400 + temps[1] * 3600 + temps[2] * 60 + temps[3])
pass

temps = (3,23,1,34)
print(type(temps))
print(tempsEnSeconde(temps))

def secondeEnTemps(seconde):
"""Renvoie le temps (jour, heure, minute, seconde) qui correspond au nombre de seconde passé en argument"""

i = int(seconde/86400)
reste = seconde
if i >= 1:
temps[0] = int(seconde/86400)
reste = reste%86400
elif int(reste/3600) >= 1:
temps[1] = int(reste/3600)
reste = reste%3600
elif int(reste/60) >= 1:
temps[2] = int(reste/60)
reste = reste%60
temps[3] = reste
pass
temps = secondeEnTemps(100000)
print(temps[0],"jours",temps[1],"heures",temps[2],"minutes",temps[3],"secondes")

la première fonction fonctionne mais pas la seconde :(
ca me met ce message "TypeError: 'tuple' object does not support item assignment "https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

Ayaaaao
2021-03-18 21:26:43

https://image.noelshack.com/fichiers/2018/10/7/1520802278-3.png

Ayaaaao
2021-03-18 21:30:08

https://image.noelshack.com/fichiers/2016/39/1474977832-sadchanclaloop.gif

Aldnoah
2021-03-18 21:30:22

Mets global temps en haut de ton code et juste au début de ta fonction si tu fais pas de return

Stanton_dowd
2021-03-18 21:30:32

Utilise a//b pour la division euclidienne plutôt que int(a/b)

1m63maisdeter
2021-03-18 21:32:35

temps = (3,23,1,34) est un tuple, et un tuple ne peut pas être modifié
donc tu ne peux pas faire temps[0] = int(seconde/86400) par la suite

Cisblanc
2021-03-18 21:32:56

Tu dois pouvoir trouver tout ce qu’il faut avec le module datetime, mais ça m’a tout l’air d’être un devoir scolaire :(

Aldnoah
2021-03-18 21:33:28

Le 18 mars 2021 à 21:32:35 1m63maisdeter a écrit :
temps = (3,23,1,34) est un tuple, et un tuple ne peut pas être modifié
donc tu ne peux pas faire temps[0] = int(seconde/86400) par la suite

Oui aussi
Fais un tableau ou une liste plutôt

1m63maisdeter
2021-03-18 21:33:47

Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

EconomisteDeter
2021-03-18 21:36:05

Ca peut être utile de lire les erreurs hein :hap:

On te dit là que le tuple n'est pas alterable, c'est effectivement sa particularité. Crée une liste plutôt

1m63maisdeter
2021-03-18 21:36:49

Aussi, tu fais
temps = secondeEnTemps(100000)
sauf que ta fonction secondeEnTemps ne retourne (mot clé return) aucune valeur, donc ta variable temps vaut None et tu ne peux pas faire temps[0] dans le print.
Il faut juste appeler ta fonction secondeEnTemps qui s'occupe de modifier ta variable globale "temps".

Ayaaaao
2021-03-18 21:37:47

Le 18 mars 2021 à 21:33:47 1m63maisdeter a écrit :
Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

Merci, donc je peux peut pas faire ca avec un tuple?https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

EconomisteDeter
2021-03-18 21:39:11

Voici ton code fonctionnel, comme l'a dit un VDD il fallait aussi ajouter un 'return', sinon ta fonction ne sait pas quoi renvoyer

EDIT : il faudrait aussi modif la première fonction, en ajoutant le bon return si tu veux pouvoir stocker dans une variable.

def tempsEnSeconde(temps):
""" Renvoie la valeur en seconde de temps donné comme jour, heure, minute, seconde."""
print(temps[0] *86400 + temps[1] * 3600 + temps[2] * 60 + temps[3])
pass

temps = [3,23,1,34]
print(type(temps))
print(tempsEnSeconde(temps))

def secondeEnTemps(seconde):
"""Renvoie le temps (jour, heure, minute, seconde) qui correspond au nombre de seconde passé en argument"""

i = int(seconde/86400)
reste = seconde
if i >= 1:
temps[0] = int(seconde/86400)
reste = reste%86400
elif int(reste/3600) >= 1:
temps[1] = int(reste/3600)
reste = reste%3600
elif int(reste/60) >= 1:
temps[2] = int(reste/60)
reste = reste%60
temps[3] = reste
return(temps)

temps = secondeEnTemps(100000)
print(temps[0],"jours",temps[1],"heures",temps[2],"minutes",temps[3],"secondes")

1m63maisdeter
2021-03-18 21:39:16

Le 18 mars 2021 à 21:37:47 Ayaaaao a écrit :

Le 18 mars 2021 à 21:33:47 1m63maisdeter a écrit :
Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

Merci, donc je peux peut pas faire ca avec un tuple?https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

Non, tu ne peux pas modifier un tuple après sa création. Tu peux regarder les structures de données en Python pour voir rapidement les particularités des différentes structures.

Aldnoah
2021-03-18 21:39:16

Le 18 mars 2021 à 21:36:49 1m63maisdeter a écrit :
Aussi, tu fais
temps = secondeEnTemps(100000)
sauf que ta fonction secondeEnTemps ne retourne (mot clé return) aucune valeur, donc ta variable temps vaut None et tu ne peux pas faire temps[0] dans le print.
Il faut juste appeler ta fonction secondeEnTemps qui s'occupe de modifier ta variable globale "temps".

Si sa variable est globale il fait ce qu’il vaut sans return

chaudpenhauer
2021-03-18 21:40:04

Le 18 mars 2021 à 21:37:47 Ayaaaao a écrit :

Le 18 mars 2021 à 21:33:47 1m63maisdeter a écrit :
Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

Merci, donc je peux peut pas faire ca avec un tuple?https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

c'est pas modifiable les tuples igo , t'es en L1 info ?

Ayaaaao
2021-03-18 21:43:41

Le 18 mars 2021 à 21:39:11 EconomisteDeter a écrit :
Voici ton code fonctionnel, comme l'a dit un VDD il fallait aussi ajouter un 'return', sinon ta fonction ne sait pas quoi renvoyer

EDIT : il faudrait aussi modif la première fonction, en ajoutant le bon return si tu veux pouvoir stocker dans une variable.

def tempsEnSeconde(temps):
""" Renvoie la valeur en seconde de temps donné comme jour, heure, minute, seconde."""
print(temps[0] *86400 + temps[1] * 3600 + temps[2] * 60 + temps[3])
pass

temps = [3,23,1,34]
print(type(temps))
print(tempsEnSeconde(temps))

def secondeEnTemps(seconde):
"""Renvoie le temps (jour, heure, minute, seconde) qui correspond au nombre de seconde passé en argument"""

i = int(seconde/86400)
reste = seconde
if i >= 1:
temps[0] = int(seconde/86400)
reste = reste%86400
elif int(reste/3600) >= 1:
temps[1] = int(reste/3600)
reste = reste%3600
elif int(reste/60) >= 1:
temps[2] = int(reste/60)
reste = reste%60
temps[3] = reste
return(temps)

temps = secondeEnTemps(100000)
print(temps[0],"jours",temps[1],"heures",temps[2],"minutes",temps[3],"secondes")

Merci khey j'ai comprishttps://image.noelshack.com/fichiers/2016/30/1469541952-risitas182.png

EconomisteDeter
2021-03-18 21:43:53

Aussi khey, tu peux rendre ton code plus élégant en modifiant les print de cette manière (exemple sur la dernière ligne de ton code :

print(f'Il y a {temps[0]} jour(s), {temps[1]} heure(s), {temps[2]} minute(s), {temps[3]} seconde(s).')

Tu ajoutes un 'f' au début de ta chaîne de caractères, et tu ajoutes la variable à afficher entre crochets.

Ayaaaao
2021-03-18 21:44:17

Le 18 mars 2021 à 21:40:04 chaudpenhauer a écrit :

Le 18 mars 2021 à 21:37:47 Ayaaaao a écrit :

Le 18 mars 2021 à 21:33:47 1m63maisdeter a écrit :
Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

Merci, donc je peux peut pas faire ca avec un tuple?https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

c'est pas modifiable les tuples igo , t'es en L1 info ?

Ouihttps://image.noelshack.com/fichiers/2018/10/1/1520256134-risitasue2.png

newfag113701
2021-03-18 21:44:40

Le 18 mars 2021 à 21:37:47 Ayaaaao a écrit :

Le 18 mars 2021 à 21:33:47 1m63maisdeter a écrit :
Utilise plutôt une liste qui est modifiable.
temps = [3,23,1,34]
temps[0]=5

Merci, donc je peux peut pas faire ca avec un tuple?https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

Tu peux recréer un nouveau tuple.
Et évite d'utiliser des variables globales pour rien

Infos
Gestion du forum

contact@geevey.com

API disponible. Utilisez le paramètre "api" en GET, peu importe le contenu, sur une page du site.

Notes

    Partenaire: JVFlux
    Ce site n'est pas associé à Jeuxvideo.com ou Webedia. Nous utilisons seulement des archives publiques.
    Il est inutile de me spammer par e-mail pour supprimer un topic. Au contraire, en conséquence, je mettrais votre topic dans le bloc ci-dessous.
Non-assumage
    Personne n'a pas assumé de topic pour le moment.