Compteur ou len() ?
Résolu/Fermé
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
-
Modifié par MickaToast le 26/07/2014 à 19:56
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 - 27 juil. 2014 à 21:28
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 - 27 juil. 2014 à 21:28
A voir également:
- Compteur ou len() ?
- Compteur électrique - Guide
- Comment ralentir un compteur linky forum - Accueil - Objets connectés
- Compteur communicant - Guide
- Compteur de contractions - Télécharger - Santé & Bien-être
- Voici l'arme secrète d'Enedis pour surveiller les compteurs Linky à distance - Guide
15 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
26 juil. 2014 à 23:47
26 juil. 2014 à 23:47
Bonjour,
Je ne connais pas spécifiquement le Python, mais de manière générale, le premier est meilleur. à condition d'être sûr que "append" rajoute bien un élément à chaque fois, si "append" venait à parfois ne pas rajouter d'éléments (doublons par exemple), alors il faudrait utiliser "len" pour savoir réellement où on en est.
Attention quand même au nombre de calculs nécessaires pour obtenir le résultat de "len". Soit la taille est directement stockée indépendamment des données et il n'y a aucun problème à utiliser "len" à tour de bras, soit la taille doit être calculée à chaque appel de "len" et dans ce cas les performances du deuxième codes vont être largement dégradées.
Je ne connais pas spécifiquement le Python, mais de manière générale, le premier est meilleur. à condition d'être sûr que "append" rajoute bien un élément à chaque fois, si "append" venait à parfois ne pas rajouter d'éléments (doublons par exemple), alors il faudrait utiliser "len" pour savoir réellement où on en est.
Attention quand même au nombre de calculs nécessaires pour obtenir le résultat de "len". Soit la taille est directement stockée indépendamment des données et il n'y a aucun problème à utiliser "len" à tour de bras, soit la taille doit être calculée à chaque appel de "len" et dans ce cas les performances du deuxième codes vont être largement dégradées.
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
27 juil. 2014 à 00:06
27 juil. 2014 à 00:06
J'ai compris, merci beaucoup pour cette réponse!
Utilisateur anonyme
27 juil. 2014 à 12:08
27 juil. 2014 à 12:08
Je pense en fait que ni un ni l'autre n'est correct, clairement l'utilisation de la boucle for est bien plus adaptée...
C'est bien plus simple d'écrire
que de jouer avec les index comme c'est fait ci-dessus...
C'est bien plus simple d'écrire
for entree in grille: # code
que de jouer avec les index comme c'est fait ci-dessus...
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
Modifié par MickaToast le 27/07/2014 à 13:20
Modifié par MickaToast le 27/07/2014 à 13:20
Pas faux fred1599, je suis juste un habitué des boucles while et je n'ai pas vraiment l'habitude de faire des boucles for.
Pourrait tu me faire un exemple d'utilisation de boucle for dans mon cas de code stp? Car je ne vois pas vraiment comment faire
Pourrait tu me faire un exemple d'utilisation de boucle for dans mon cas de code stp? Car je ne vois pas vraiment comment faire
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
27 juil. 2014 à 13:42
27 juil. 2014 à 13:42
Difficile de savoir avec si peu de code, mais je dirais que tu travailles avec Tkinter, je me trompe ?
Faudrait avoir l'initialisation de la variable entree (dictionnaire, liste, ...)
Dans ton cas de figure, j'ai l'impression que tu as plusieurs widgets Entry dont tu essaies de récupérer la valeur de chacun, c' est ça ?
Faudrait avoir l'initialisation de la variable entree (dictionnaire, liste, ...)
Dans ton cas de figure, j'ai l'impression que tu as plusieurs widgets Entry dont tu essaies de récupérer la valeur de chacun, c' est ça ?
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
Modifié par MickaToast le 27/07/2014 à 15:55
Modifié par MickaToast le 27/07/2014 à 15:55
Exactement, entree est une liste qui comporte 81 valeurs. Les valeurs sont comme ça:
Le script du dessus est répété 81 fois
En gros, le code qui est tout en haut de ce sujet consiste à récupérer 1 par 1 la valeur mise dans le widget Entry correspondant. J'ajoute la valeur du widget Entry si il n'est pas vide dans la liste grille, sinon j'ajoute "None" dans la liste grille.
entree.append(Entry(canvas, width=3, textvariable=grille_var[curseur_ajout])) #Ajout d'une case de saisi dans la liste "entree"
Le script du dessus est répété 81 fois
En gros, le code qui est tout en haut de ce sujet consiste à récupérer 1 par 1 la valeur mise dans le widget Entry correspondant. J'ajoute la valeur du widget Entry si il n'est pas vide dans la liste grille, sinon j'ajoute "None" dans la liste grille.
Utilisateur anonyme
Modifié par fred1599 le 27/07/2014 à 16:39
Modifié par fred1599 le 27/07/2014 à 16:39
Il existe des méthodes toutes faîtes pour faire ce genre de choses, mais j'avoue qu'elles ne sont pas intuitives et réservées à des utilisateurs expérimentés.
Dans ton cas, car je n'ai pas beaucoup d'éléments
Explication:
root est le nom de la variable donnée par la fenêtre principale, c'est une instance Tk
Sans doute nommée autrement dans ton code...
winfo_children() est une méthode permettant de récupérer tous les widgets contenus dans root
winfo_class() est une méthode me donnant le nom de la classe du widget, ce qui nous intéresse se sont les widgets Entry
Si il se trouve une valeur dans ton Entry, alors on ajoute cette valeur dans grille, sinon on ajoute None
Code non testé, tu t'en doutes bien ;)
EDIT: Je considère que tu travailles en python 3.x
Dans ton cas, car je n'ai pas beaucoup d'éléments
for widget in root.winfo_children(): if widget.winfo_class() == 'Entry': res = widget.get() if res: grille.append(res) else: grille.append(None)
Explication:
root est le nom de la variable donnée par la fenêtre principale, c'est une instance Tk
root = Tk()
Sans doute nommée autrement dans ton code...
winfo_children() est une méthode permettant de récupérer tous les widgets contenus dans root
winfo_class() est une méthode me donnant le nom de la classe du widget, ce qui nous intéresse se sont les widgets Entry
Si il se trouve une valeur dans ton Entry, alors on ajoute cette valeur dans grille, sinon on ajoute None
Code non testé, tu t'en doutes bien ;)
EDIT: Je considère que tu travailles en python 3.x
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
27 juil. 2014 à 17:19
27 juil. 2014 à 17:19
Avec quelques modification de ton code ça fonctionne bien, merci :-) !
Utilisateur anonyme
27 juil. 2014 à 17:42
27 juil. 2014 à 17:42
Ok :)
Juste pour savoir, tu as modifié à quel niveau dans mon code ?
Juste pour savoir, tu as modifié à quel niveau dans mon code ?
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
Modifié par MickaToast le 27/07/2014 à 17:55
Modifié par MickaToast le 27/07/2014 à 17:55
Je l'ai modifié comme ceci:
Juste le nom "canvas" ainsi que int() on été rajouté.
for widget in canvas.winfo_children(): if widget.winfo_class() == "Entry": res = widget.get() if res: grille.append(int(res)) else: grille.append(None)
Juste le nom "canvas" ainsi que int() on été rajouté.
Utilisateur anonyme
27 juil. 2014 à 18:27
27 juil. 2014 à 18:27
Tu as mis des widgets Entry dans un widget Canvas ? Surprenant ! Pourquoi avoir fait cela ?
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
Modifié par MickaToast le 27/07/2014 à 18:37
Modifié par MickaToast le 27/07/2014 à 18:37
J'ai préféré faire dans la facilité et donc placer là où je voulais mes Entry. De plus, si je dois arranger mon interface d'une autre façon, j'aurais juste à déplacer le canvas et non pas toutes les Entry !
Utilisateur anonyme
27 juil. 2014 à 19:01
27 juil. 2014 à 19:01
En effet ça permet d'éviter de placer souvent trop symétriquement les widgets d'une fenêtre... Par contre c'est pas plus simple, gestion plus difficile, mais peut-être plus esthétique.
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
27 juil. 2014 à 20:25
27 juil. 2014 à 20:25
Moi je trouve que ce n'est pas plus difficile, il faut juste faire .place() avec les coordonnées x/y après avoir fait un .pack(), pas trop de difficulté à faire ça ;-)
En gros, voilà mon code pour placer les Entry:
(Oui je sais, la code à partir de "if curseur_ajout%9 == 0:" n'est pas du tout optimisé!)
Mais en tout cas, ça me donne quelque chose de très jolie:
En gros, voilà mon code pour placer les Entry:
fenetre = Tk() #Master canvas = Canvas(fenetre, width=225, height=250) #Canvas canvas.pack() global grille_var curseur_ajout, entree, x, y, grille_var = 0, [], 0, 0, [] while curseur_ajout < 81: #Ajout cases grille_var.append(StringVar()) entree.append(Entry(canvas, width=3, textvariable=grille_var[curseur_ajout])) #Ajout d'une case de saisi dans la liste "entree" if curseur_ajout%9 == 0: x = 0 if curseur_ajout%27 == 0: y += 25 #Saut de ligne +5 else: y += 20 #Saut de ligne normal elif curseur_ajout%3 == 0: x += 5 #Saut de ligne verticale x += 20 #Deplacement de case vers la droite entree[curseur_ajout].pack() entree[curseur_ajout].place(x=x, y=y) #Placement de la case de saisi curseur_ajout += 1
(Oui je sais, la code à partir de "if curseur_ajout%9 == 0:" n'est pas du tout optimisé!)
Mais en tout cas, ça me donne quelque chose de très jolie:
Utilisateur anonyme
27 juil. 2014 à 20:53
27 juil. 2014 à 20:53
On peut utiliser place sans placer des widgets dans un Canvas ;)
MickaToast
Messages postés
142
Date d'inscription
mercredi 19 février 2014
Statut
Membre
Dernière intervention
23 juillet 2015
24
27 juil. 2014 à 21:28
27 juil. 2014 à 21:28
Je sais bien, mais le jour où j'aurais besoin de déplacer cette grille, j'aurais juste à déplacer le canvas au lieu des widgets en eux même ;)