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
Bonjour,

Je me pose une question, qu'est-ce qui est le mieux à faire niveau syntaxe/logique/code sur ce type de ligne:

La version compteur:
    while curseur_case < 81:
        if entree[curseur_case].get() != "":
            grille.append(int(entree[curseur_case].get()))
        else:
            grille.append(None)
        curseur_case += 1


La version len():
    while len(grille) < 81:
        if entree[len(grille)].get() != "":
            grille.append(int(entree[len(grille)].get()))
        else:
            grille.append(None)


Du coup, c'est quelle version la meilleur?

Merci !
A voir également:

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
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.
1
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
J'ai compris, merci beaucoup pour cette réponse!
0
Utilisateur anonyme
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

for entree in grille:
    # code


que de jouer avec les index comme c'est fait ci-dessus...
0
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
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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 ?
0
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
Exactement, entree est une liste qui comporte 81 valeurs. Les valeurs sont comme ça:

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.
0
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

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
0
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
Avec quelques modification de ton code ça fonctionne bien, merci :-) !
0
Utilisateur anonyme
27 juil. 2014 à 17:42
Ok :)

Juste pour savoir, tu as modifié à quel niveau dans mon code ?
0
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
Je l'ai modifié comme ceci:
    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é.
0
Utilisateur anonyme
27 juil. 2014 à 18:27
Tu as mis des widgets Entry dans un widget Canvas ? Surprenant ! Pourquoi avoir fait cela ?
0
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
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 !
0
Utilisateur anonyme
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.
0
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
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:
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:
0
Utilisateur anonyme
27 juil. 2014 à 20:53
On peut utiliser place sans placer des widgets dans un Canvas ;)
0
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
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 ;)
0