Ce sera la troisième édition de notre jardin ancestral ce printemps et il comportera deux nouveautés, soit une section herboristerie et un système électronique. Ce dernier sera conçu avec un RasberryPi et nous permettra de surveiller l’humidité du sol, afficher les prévisions météo, faire défiler de la poésie autochtone et photographier le jardin. Le RasberryPi permet de faire tout cela, à condition de savoir souder et programmer en Python. Nous verrons la soudure dans un futur article et nous présenterons le code dans un autre encore. Mais pour comprendre ce dernier, il faut connaître Python.
Nous avons déjà vu les bases de Python. Quelques notions supplémentaires sont nécessaires. Dans le précédent article sur Python, nous avions une ligne dans notre petit programme qui demandait l’âge et ensuite comparait cet âge au nombre 40 pour déterminer lequel de deux messages afficher: if int(monAge) <= 40:) (où <= veut dire plus petit ou égal à). Il y a plusieurs autres opérateurs de comparaison. ==
: égal à!=
: pas égal à<
: plus petit que>
: plus grand que>=
: plus grand que ou égal à
= est différent de ==. Le premier nous sert à définir une variable. Le second est un opérateur de comparaison. Testons-en quelques-uns dans la console.
>>>30 == 30
True
>>>5!=7
True
>>> 7!=7
False
>>> ‘courge’==’courge’
True
>>> ‘Courge’==’courge’
False
L’opérateur considère la différence de casse.
>>> True!=False
True
>>> 35==35.0
True
Même s’il s’agit techniquement de deux types différents de valeur (un nombre entier et un nombre décimal), leur valeur est quand même identique.
>>> 37 == ’37’
False
Faux car on compare ici un nombre entier et une chaîne de caractères (signifiée par les apostrophes).
>>> courge = 77
>>> 76 < courge
True
Les opérateurs booléens (and
, or
, et not
) peuvent être utilisés avec les opérateurs de comparaison.
>>> (3 < 4) and (6 < 9)
True
Comme en mathématiques, l’ordinateur considère d’abord les chiffres entre parenthèses et ensuite les compare entre eux.
Python fonctionne avec des blocs de code et l’indentation est importante. Par exemple, dans notre programme nous avions un premier contrôle de flux, suivi d’une indentation, puis un second et une nouvelle indentation. On a donc deux blocs de code.
monAge = input() if int(monAge) <= 40: print('tu es encore jeune, '+ monNom) else: print('vive les vieux!')
En plus de else et if, il y a elif (contraction des deux précédents). C’est un peu comme si on disait «sinon, mais seulement si…» Exemple:
if int(monAge) <= 40: print('tu es encore jeune, '+ monNom) elif int (monAge) == 42: print('tu ne les fais pas!') else: print('vive les vieux!')
L’opérateur while
, lui, nous permet de créer des boucles.
courge = 0 while courge < 5: print('Bonjour, Antoine!') courge = courge + 1
On aurait pu simplifier la dernière ligne par courge+=1. Le programme imprime 5 fois «Bonjour, Antoine!», car l’opérateur while lui dit de le faire tant que la valeur de courge sera inférieure à 5. La valeur de courge est elle-même majorée de 1 après chaque exécution de la boucle. Deux instructions utiles quand on écrit des boucles sont break et continue. Dans le programme suivant, on crée une boucle pour demander à l’utilisateur son mot de passe.
while True: print('Qui va là?') nom = input() if nom != 'Antoine': continue print('Salut, Antoine! Quel est le mot de passe? (Indice: c\'est un légume.)') password = input() if password == 'courge': break print('Bienvenue dans le jardin!')
On peut tester le code dans Trinket. Donc, tant que le nom n’est pas Antoine et tant que le mot de passe n’est pas courge, le programme continue à répéter la question «Qui va là?» parce que l’instruction while le ramène au début de la boucle. Si, au contraire, le nom et le mot de passe sont bons, le programme casse (break) la boucle et souhaite la bienvenue à Antoine dans le jardin. Pour mettre fin à une boucle: Ctrl+C.
On peut également faire des boucles avec l’instruction for et la fonction range. Nous avons déjà vu cette fonction dans l’article précédent. Une fois associée à une autre fonction (list), elle permet par exemple d’énumérer l’intervalle couvert par le chiffre 14.
>>> list(range(14))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
On aurait pu obtenir le même résultat sans la fonction list en écrivant une boucle:
>>> for i in range(14):
print(i)
On s’en souvient, i est notre index et celui-ci se déplace de 1 après chaque exécution de la boucle jusqu’au chiffre 14, mais sans inclure ce dernier. Mettons tout ceci en application dans un petit programme amusant qui combine ce que l’on avait déjà vu sur le module random:
import random nombreSecret = random.randint(1, 20) print('Je pense à un nombre entre 1 et 20.') # On demande au joueur de deviner en 6 tentatives. for tentatives in range(1, 7): print('Prends une chance.') tentative = int(input()) if tentative < nombreSecret: print('Trop bas.') elif tentative > nombreSecret: print('Trop haut.') else: break # Parce que c'est le bon nombre. if tentative == nombreSecret: print('Bravo! Tu as deviné en ' + str(tentatives) + ' tentatives!') else: print('Je pensais au nombre ' + str(nombreSecret))
Vous pouvez tester le jeu dans Trinket.
On a vu comment définir des variables. Mais il faut encore préciser qu’il y a des variables définies globalement et d’autres localement. La différence se traduit dans l’indentation. Exemple:
def courge(): haricot = 31337 courge() print(haricot)
Ce code va générer le message d’erreur suivant:
Traceback (most recent call last):
File « C:/Users/lant1301/AppData/Local/Programs/Python/Python37-32/test55.py », line 4, in
print(haricot)
NameError: name ‘haricot’ is not defined
Le fait est qu’haricot est défini localement, à l’intérieur de la variable courge. Mais il n’existe pas globalement. Les variables définies localement ne peuvent pas non plus être reconnues ailleurs dans les autres variables locales. Autrement dit, ce qui est local dans une variable existe seulement dans cette variable. Par contre, les variables globales peuvent être utilisées localement. Pour éviter toute confusion, on devrait donner des noms différents aux variables locales et globales.
Dans Python, il y a aussi des dictionnaires. Comme les listes, les dictionnaires sont des collections de valeurs, mais celles-ci peuvent être des données de différents types. Définissons par exemple une variable par un dictionnaire contenant trois clés:
>>> Jardin = {‘grandeur’: ‘moyenne’, ‘type’: ‘ancestral’, ‘fonction’: ‘pédagogique’}
Les clés sont grandeur, type et fonction. Les valeurs de ces clés sont moyenne, ancestral et pédagogique. On peut accéder aux valeurs par leurs clés:
>>> Jardin[‘grandeur’]
‘moyenne’
Dans une liste, les éléments sont ordonnés. Dans un dictionnaire, ils ne le sont pas. Si on peut sélectionner un élément dans une liste par son index, on ne peut pas dans un dictionnaire car il n’y a pas de premier ou second élément. Mais on peut par contre (et c’est là l’avantage des dictionnaires sur les listes) interroger notre dictionnaire avec les clés. Voyons ce que cela donne avec un exemple concret.
semences = {'courge': 'algonquine', 'haricot': 'mohawk', 'maïs': 'petit maïs blanc canadien'} while True: print('Entrer le nom du légume au singulier pour connaître la variante semée ou laisser vide pour quitter') nom = input() if nom == '': break if nom in semences: print(nom + ' : ' + semences[nom]) else: print('Je n\'ai pas d\'information pour ' + nom) print('Quelle variante a-t-on utilisée?') nouvSemence = input() semences[nom] = nouvSemence print('La base de données du jardin a été mise à jour.') print(semences)
On peut tester le programme dans Trinket. Non seulement le code nous permet d’interroger le dictionnaire, mais ce dernier peut aussi être enrichi de nouvelles clés avec leurs valeurs. Si on demande quelle est la variante semée pour tabac, le programme nous répond qu’il ne le sait pas et nous demande d’ajouter une valeur, disons sacré. Si on redemande quelle est la variante de tabac, le programme nous dit maintenant: sacré. Pour preuve, le programme imprime le dictionnaire mis à jour.
Ces notions seront utiles pour comprendre la suite de notre projet de jardin ancestral.
3 commentaires
3 Pingbacks