[Débutants] Exemple de simplification de code (+ exemple poo)

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 12:55

dyox a écrit :
mar. 30 juil. 2019 11:38
Merci Bud de prendre le temps de bien expliquer.
Francois a écrit :
lun. 5 août 2019 17:58
merci pour cet exemple pas à pas ;)
C’est toujours avec plaisir ;)
Ps : Excuse-moi Dyox, je viens seulement de voir que tu étais intervenu au début du topic.

Maintenant que le programme a été simplifié, on va passer un cran au-dessus pour ceux qui veulent aller plus loin et aussi pour apporter une réponse à l’auteur ‘original’ qui m’a demandé un exemple avec des listes et des itérations.

Jusque-là, je n’ai fait que supprimer ce qui n’était pas forcement utile dans le programme original mais fondamentalement, je ne lui ai rien ajouté de plus. Maintenant, si on raisonne autrement, on peut dire que chaque led a 2 valeurs. Elle a un n° GPIO et une valeur de seuil. Python, comme tous les autres langages, permet de regrouper plusieurs valeur en une seule et c’est ce que nous allons faire. La façon la plus simple de le faire avec python, c’est d’utiliser des ‘tuples’. Voyons ça pour l’instant comme de simples variables composées que l’on va définir comme ça :
led = (n° gpio , seuil )

soit avec un noms explicite des vraies valeurs :
ledCpu1 = (11,20)

L’ordre et les valeurs sont fixes dans un tuple et on les compte à partir de 0 depuis la gauche (led ([0],[1],[2] ….)Si par exemple je veux récupérer le n° de gpio de ledCpu1, j’appellerais sa valeur 0. La syntaxe est la suivante

Print (ledCpu1[0]) affichera 11 à l’écran
et pour son seuil :
Print (ledCpu1[1]) affichera 20

Si pour une raison quelconque j’ai besoin d’autres propriétés pour la led, je peux les ajouter au tuple
ledCpu1 = (11,20, ‘’vert’’, ‘’ronde’’)
Print (ledCpu1[3]) affichera ronde


Mes led sont désormais des entités à part entière qui peuvent contenir une multitude de paramètre et chacun de ses paramètres a une place bien définie dans cette entité.

Plutôt que d’écrire
GPIO.output (11, cpuPercent >= 20)
Je peux maintenant ecrire
GPIO.output (ledCpu1[0], cpuPercent >= ledCpu1[1])

Voilà ce que ça pourrait donner pour le bargraph Cpu
tuple#1.png
tuple#1.png (12.51 Kio) Vu 5425 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 13:16

Nos leds étant identifiées, on va pourvoir maintenant en faire de meme pour le bargraph. Qu’est le bargraph si ce n’est qu’une liste de chose. De la meme façon que l’on a défini les différentes propriétés des leds, on va définir les différentes propriétés du bargraph qui lui contient … des leds.
La syntaxe est la meme ou chaque valeur est séparé par une ‘,’:

bargraphCpu = (ledCpu1 ,ledCpu2 , ledCpu3, ledCpu4 ,ledCpu5)

On va donc pouvoir écrire :

GPIO.output(bargraphCpu[x][y],cpuPercent >= bargraphCpu[x][z])

Ou x est la place de la led dans le tuple bargraphCpu, y est la place du n° de gpio dans le tuple de la led et z est la place du seuil dans le tuple de la led.

Ce qui donne :
tuple#2.png
tuple#2.png (14 Kio) Vu 5424 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 13:36

Alors bien sûr, tout ça donne l’impression d’avoir beaucoup plus de code, mais c’est ce qui va nous amener à pouvoir simplifier le code exécuté dans une itération. Plutôt que de traiter une à une les leds du bargraphe ligne par ligne, on va faire une itération qui va se charger de la faire pour nous. Ici, Le programme sait déjà combien il y a de led dans bargraphCpu et l’ordre n’a aucune importance puisque chaque état de led est traité de façon exclusive (allumé ou éteinte en une seul instruction). Il suffit donc de définir une variable d’itération et on balaye tous les éléments du bargraph pour attribuer le bon état à chaque led qu’il contient. Voila ce que ca donne en code :
tuple#3.png
tuple#3.png (12.22 Kio) Vu 5423 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: [Débutants] Exemple de simplification de code

Message par dyox » mar. 6 août 2019 13:51

Pas de problèmes Bud.

En faisant mes courses sur Aliexpress, je suis tombé sur ce genre de bargraph tout fait (10 leds), pour ceux que cela intéresse.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 14:05

dyox a écrit :
mar. 6 août 2019 13:51
En faisant mes courses sur Aliexpress, je suis tombé sur ce genre de bargraph tout fait (10 leds), pour ceux que cela intéresse.
Très pratique ces petits trucs. J'en utilise depuis très longtemps, par contre je ne savait pas qu'ils existaient en multicolore
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Frédéric
Messages : 17
Enregistré le : lun. 29 juil. 2019 19:47

Re: [Débutants] Exemple de simplification de code

Message par Frédéric » mar. 6 août 2019 14:07

En fait bargraphCpu est un tuple de tuples?
Merci

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 14:56

Frédéric a écrit :
mar. 6 août 2019 14:07
En fait bargraphCpu est un tuple de tuples?
Merci
Exactement. Un tuple contiens des éléments et parmi ces éléments, il peut y figurer toute sorte de type, y compris des tuples.
A savoir qu'Il existe d'autre type le liste en python comme les List et les Dictionary, mais ici les tuples était les plus simple et suffisant.

Voila le code final avec ces itération dans des tuples :
tuple#4.png
tuple#4.png (34 Kio) Vu 5411 fois
Ca fait évidement plus de ligne que le code précédent, mais qui a dit qu'un programme plus court était mieux ? Celui la est bien plus évolué. Déjà, on a moins de code dans la partie 'active' du programme (plus facile a debugger) du fait que l'on a défini nos valeurs la ou elles doivent se trouver, c'est à dire dans la partie déclarative. Avec ce code, je peux modifier les n° de GPIOs ou les seuils et meme ajouter ou supprimer des leds à mes bargraphes sans modifier quoi que ce soit dans la partie active et ca, c'est très important. Ca signifie entre autre que je pourrais très facilement définir tout ca dans un fichier de config que je pourrais modifier a souhait sans avoir a retoucher quoi que ce soit dans le code ;)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Frédéric
Messages : 17
Enregistré le : lun. 29 juil. 2019 19:47

Re: [Débutants] Exemple de simplification de code

Message par Frédéric » mar. 6 août 2019 15:24

Oui ton code a une très bonne modularité.
Pour info: peut on imbriquer une infinité de tuples (1er dans 2eme, 2eme dans 3eme, etc...)?
L intérêt est moindre mais c est juste pour savoir ;)

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 6 août 2019 21:06

Frédéric a écrit :
mar. 6 août 2019 15:24
Pour info: peut on imbriquer une infinité de tuples (1er dans 2eme, 2eme dans 3eme, etc...)?
Bien sûr, mais attention ! Des listes qui contiennent des listes qui elles meme contiennent des listes … ect, ça fonctionne, mais coté lisibilité, on a vite fait de s’y perdre. Si on regarde le code avec les tuples, on a déjà perdu beaucoup en lisibilité pour un débutant. Exemple :
Quand on écrit …
GPIO.output(led[0], cpuPercent >= led[1])
… c’est bien, mais ce n’est déjà plus trop lisible. Il faut se souvenir que led[0] correspond au n° de GPIO et que led[1] correspond au seuil. Quand en plus on implique ça dans une itération, je comprends que le débutant soit perdu. En me mettant à sa place, je comprendrais plus facilement le code simplifié précédent qui est lui parfaitement compréhensible.

Il existe toutefois un artefact magique pour pouvoir faire ça en écrivant du code exécutif ‘lisible’. Ça s’appelle ‘Object’ (que l’on traduit par ‘objet’) et qui met en œuvre une méthode de programmation que l’on appelle ‘POO’ et qui signifie tout simplement ‘Programmation Orientée Objet’. Si la flemme ne s’empare as de moi, j’en ferais peut etre la démonstration avec ces bargraphes ;)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: [Débutants] Exemple de simplification de code

Message par dyox » mar. 6 août 2019 21:39

Bud, ne peut-on pas mettre l'attribution/initialisation des GPIO avec un "for" ?
Comme ça, cela simplifie encore et je trouve que cela ne complique pas trop. Et de plus avec cet exemple concret et facilement à mettre en oeuvre, un débutant voit plein de choses.

Alors je ne sais pas si la syntaxe est correcte, ça serait du genre :

Code : Tout sélectionner

Liste_de_GPIO = [32, 33, 35, 38, 22, 11, 13, 15, 12, 16]
for x in Liste_de_GPIO
	GPIO.setup(x, GPIO.OUT, initial=GPIO.LOW)

Répondre

Retourner vers « Python »