On continue notre série de tutoriels sur le langage de programmation Python sur le Raspberry Pi.
Je dois dire que pour le moment on ne fera rien qui soit spécifique au Raspberry Pi, et donc on peut suivre le tutoriel sur n'importe quel ordinateur, après avoir installé Python 2.7 et l’éditeur geany (ou un autre éditeur configuré comme il se doit).
Le premier tutoriel a établi une base sur les modes d’opérations du programme python et comment installer et utiliser geany. Toutefois, nous n'avons pas configuré geany. Il faut tout d'abord s'occuper d'un concept bien important, l'indentation.
Sur un clavier d'ordinateur, il y a une touche [TAB]. C'est un vestige des bonnes vieilles machine a écrire, et ca signifie "tabulation stop". C'est que sur les machines a écrire, on pouvait mettre a certains endroits, des arrêts d'indentations, bien pratique pour avoir la première ligne d'un paragraphe indenté (C'est la norme en typographie française, mais pas en anglais - alors sur le web on ne voit pas cela beaucoup):
L'indentation nous permet de voir clairement ou commence un paragraphe, mais pas ou il finit. Avec python, l'indentation est inversée par rapport aux normes de typographie française (la première ligne n'est pas indentée, toutes les autres le sont), et on ne parle pas d'un paragraphe, mais plutôt d'un bloc de code. Par exemple:
Cela définit un bloc de code pour une boucle while qui inclut 2 lignes, print(b) et b += 1, car on y trouve une indentation vers la droite, par rapport a la ligne précédente. La ligne b = 0 ne fait pas partie de cela.
Pour s'assurer que tout fonctionne correctement avec python, il faut s'assurer de toujours utiliser, soit les espaces blancs, soit le caractère TAB. Si on mélange les deux, on va avoir tout plein de problèmes.
Ma suggestion? Configurer son éditeur pour une indentation de 4 espaces blancs. Et voila.
Et comment fait-on cela avec geany? Menu Edit -> Preferences, et la, on choisit Editor sur la colonne de gauche, et Indentation sur la rangée en haut:
Sur Width, on choisit 4, pour Type, Spaces et il faut avoir le Tab key indents coché. Il y a beaucoup d'autres options, mais c'est un minimum pour commencer.
Avec python et les types intégrés, on peut utiliser des nombres entiers, réels, de très grandes valeurs ou bien complexes. On peut les utiliser dans des équations, des conditions ou les assigner a des variables ou des constantes.
On met tout en majuscule pour indiquer que c'est une constante. Si on va changer le nombre de jantes sur le taxi, on l'indiquerais comme une variable, en lettres minuscules:
Cette capacitee est une constante, car elle ne peut changer (a moins d'y faire un trou, et dans ce cas, ce sera une capacitee de 0 litres...)
Il y a une différence entre le type de nombre pour JANTES et RESERVOIR.
En effet, 4 est un nombre entier, et donc JANTES est un nombre entier. C'est ce que python nomme un int (pour integer).
Pour 70.2, c'est un nombre réel, et donc RESERVOIR est aussi un nombre réel. C'est ce que python nomme un float (pour floating point, ou virgule flotante).
Dans ces cas, python sait très bien ce qu'il faut faire, sans qu'on lui dise le type de nombre en question. Mais, que va faire python avec ceci?
Le prix unitaire pour une jante serait de 2700 euros (le cout total), divisé par le nombre de jantes. Mais, est-ce que 682 est la valeur correcte? Non. Enfin, pour python, il est convaincu que si... Mais si on fait notre vérification:
Il nous manque quelques euros.... Quel est le problème?
Nous avons demandé a python de diviser un nombre entier (2731) par un nombre entier (4), et il va donc assigner un nombre entier (682) au prixunitaire. Python as donc fait ce qu'il devait faire.
Que peut-on faire ici? Une solution simple, c'est de définir le cout comme 2731.0, et en faire un nombre a virgule flottante:
Depuis Python 2.4, on peut utiliser les entiers sans spécifier un type pour très grandes valeurs (long). Ce que cela veux dire, c'est que si on a un nombre entier, il est représenté comme valeur de 32 bits sur un système d'exploitation de 32 bits (Raspbian sur Raspberry Pi), et 64 bits sur un système d'exploitation de 64 bits avec python en 64 bits, mais que si on y assigne une valeur qui ne peut être représentée dans cet espace, on se retrouve avec un long (avec un L après le nombre):
En pratique, ça devrait être transparent, mais si on veux, on peux forcer l'utilisation d'un long:
N’empêche que même si je force python a considérer ce salaire comme un très grand nombre, c'est quand même un petit nombre entier...
On peut aussi utiliser la fonction intégrée long().
Ils le sont, complexes. Si ça vous dit, allez lire l'article sur wikipedia: fr.wikipedia.org Nombre_complexe
Il suffit d'ajouter un j devant la partie imaginaire (et pas une autre lettre, comme x):
Ce n'est pas une équation, mais bien un nombre complexe, avec une partie réelle et une partie imaginaire. On peut aussi utiliser la fonction intégrée complex().
Pas très folichon tout ça, alors passons a autre chose.
En Python, on peut assigner plusieurs variables en même temps.
Exemple 1:
Exemple 2:
Réassignation
On peut aussi assigner une valeur a une variable, et bien sur, la changer.
Mais on peut aussi réassigner le type, pas seulement la valeur:
Dans notre premier tutoriel, on a imprimé des chaines de caractères, délimitées par les guillemets:
De la même façon, on peut assigner une chaine de caractères a une variable en utilisant les guillemets simples, doubles ou encore en triple (''' ''' ou """ """):
Et on peux aussi utiliser la fonction integree str():
N'ayant pas a identifier le type de nos variables, nous permet comme on l'a vu de réassigner une chaine de caractères a une variable qui contenait un nombre entier, bien sur, mais en plus, cela nous permet de créer des fonctions qui peuvent accepter une variété de types.
On va créer une fonction qui va accepter un paramètre, et va retourner 2 fois ce paramètre:
Dans un langage de programmation ou l'on doit identifier clairement par type nos variables, il nous faudrait définir une fonction pour les entiers, pour les réels, pour les chaines de caractères, etc. Mais avec python, c'est tout ce que l'on a a faire:
Ceci conclu donc notre deuxième tutoriel. Le prochain, on va créer un squelette de code que l'on va utiliser pour apprendre différends concepts.
Geany ou autre
Je dois dire que pour le moment on ne fera rien qui soit spécifique au Raspberry Pi, et donc on peut suivre le tutoriel sur n'importe quel ordinateur, après avoir installé Python 2.7 et l’éditeur geany (ou un autre éditeur configuré comme il se doit).
Le premier tutoriel a établi une base sur les modes d’opérations du programme python et comment installer et utiliser geany. Toutefois, nous n'avons pas configuré geany. Il faut tout d'abord s'occuper d'un concept bien important, l'indentation.
Indentation
Sur un clavier d'ordinateur, il y a une touche [TAB]. C'est un vestige des bonnes vieilles machine a écrire, et ca signifie "tabulation stop". C'est que sur les machines a écrire, on pouvait mettre a certains endroits, des arrêts d'indentations, bien pratique pour avoir la première ligne d'un paragraphe indenté (C'est la norme en typographie française, mais pas en anglais - alors sur le web on ne voit pas cela beaucoup):
Cher Monsieur Gaston Lagaffe, c'est avec plaisir que nous vous envoyons a Kuujjuaq, comme représentant de la compagnie. Veuillez trouver ci-joint votre billet d'avion. Surtout, ne manquez pas votre vol qui part demain matin a 6:30 de l’aéroport Charles De Gaule. Un taxi va venir vous chercher a 5:00.
Menfin, c'est bien, ce taxi! |
L'indentation nous permet de voir clairement ou commence un paragraphe, mais pas ou il finit. Avec python, l'indentation est inversée par rapport aux normes de typographie française (la première ligne n'est pas indentée, toutes les autres le sont), et on ne parle pas d'un paragraphe, mais plutôt d'un bloc de code. Par exemple:
b = 0
while b < 10:
print(b)
b += 1
Cela définit un bloc de code pour une boucle while qui inclut 2 lignes, print(b) et b += 1, car on y trouve une indentation vers la droite, par rapport a la ligne précédente. La ligne b = 0 ne fait pas partie de cela.
Combien d'espace?
Alors que les machines a écrire d'antan permettaient de mettre l'indentation a quelque valeur que l'on veut, la clé [Tab] sur un ordinateur est en général assignée a une valeur de 4 ou de 8 caractères, bien que ne prenant qu'un seul caractère (le 9ieme caractère d'une table ASCII par exemple). De plus, on peut choisir que [Tab] produise des espaces blancs ou bien un TAB.Pour s'assurer que tout fonctionne correctement avec python, il faut s'assurer de toujours utiliser, soit les espaces blancs, soit le caractère TAB. Si on mélange les deux, on va avoir tout plein de problèmes.
Ma suggestion? Configurer son éditeur pour une indentation de 4 espaces blancs. Et voila.
Indentation: 4 espaces blancs aux lignes 3 et 4 |
Et comment fait-on cela avec geany? Menu Edit -> Preferences, et la, on choisit Editor sur la colonne de gauche, et Indentation sur la rangée en haut:
4 spaces, Tab key indents |
Les nombres
Avec python et les types intégrés, on peut utiliser des nombres entiers, réels, de très grandes valeurs ou bien complexes. On peut les utiliser dans des équations, des conditions ou les assigner a des variables ou des constantes.
Entiers (int)
Si on considère notre Peugeot 406 Taxi ci dessus, on peut dire qu'il comporte 4 jantes. On pourrait écrire cela en python comme:JANTES = 4
On met tout en majuscule pour indiquer que c'est une constante. Si on va changer le nombre de jantes sur le taxi, on l'indiquerais comme une variable, en lettres minuscules:
jantes = 4
Réels (float)
Considérons la capacité du réservoir a essence de notre taxi. Elle est de 70.2 litres (notation avec un point décimal). En python on pourrait écrire cela comme:RESERVOIR = 70.2
Cette capacitee est une constante, car elle ne peut changer (a moins d'y faire un trou, et dans ce cas, ce sera une capacitee de 0 litres...)
Il y a une différence entre le type de nombre pour JANTES et RESERVOIR.
En effet, 4 est un nombre entier, et donc JANTES est un nombre entier. C'est ce que python nomme un int (pour integer).
Pour 70.2, c'est un nombre réel, et donc RESERVOIR est aussi un nombre réel. C'est ce que python nomme un float (pour floating point, ou virgule flotante).
Dans ces cas, python sait très bien ce qu'il faut faire, sans qu'on lui dise le type de nombre en question. Mais, que va faire python avec ceci?
Python 2.6.4 (r264:75706, Oct 17 2011, 16:55:05) [C] on sunos5
Type "help", "copyright", "credits" or "license" for more information.>>> JANTES = 4>>> COUT = 2731>>> prixunitaire = COUT / JANTES
>>> prixunitaire
682
Le prix unitaire pour une jante serait de 2700 euros (le cout total), divisé par le nombre de jantes. Mais, est-ce que 682 est la valeur correcte? Non. Enfin, pour python, il est convaincu que si... Mais si on fait notre vérification:
>>> prixunitaire * JANTES
2728
Il nous manque quelques euros.... Quel est le problème?
Nous avons demandé a python de diviser un nombre entier (2731) par un nombre entier (4), et il va donc assigner un nombre entier (682) au prixunitaire. Python as donc fait ce qu'il devait faire.
Que peut-on faire ici? Une solution simple, c'est de définir le cout comme 2731.0, et en faire un nombre a virgule flottante:
>>> COUT_JANTES = 2731.0On peut aussi utiliser la fonction intégrée float():
>>> prixunitaire = COUT_JANTES / JANTES
>>> prixunitaire
682.75
>>> prixunitaire * JANTES
2731.0
>>> prixunitaire = float(COUT_JANTES) / JANTESSimilairement, il existe une fonction intégrée int().
>>> prixunitaire
682.75
Très grandes valeurs
Depuis Python 2.4, on peut utiliser les entiers sans spécifier un type pour très grandes valeurs (long). Ce que cela veux dire, c'est que si on a un nombre entier, il est représenté comme valeur de 32 bits sur un système d'exploitation de 32 bits (Raspbian sur Raspberry Pi), et 64 bits sur un système d'exploitation de 64 bits avec python en 64 bits, mais que si on y assigne une valeur qui ne peut être représentée dans cet espace, on se retrouve avec un long (avec un L après le nombre):
>>> 2**30
1073741824
>>> 1073741824 + 1073741824
2147483648L
En pratique, ça devrait être transparent, mais si on veux, on peux forcer l'utilisation d'un long:
salaire = 25L
N’empêche que même si je force python a considérer ce salaire comme un très grand nombre, c'est quand même un petit nombre entier...
On peut aussi utiliser la fonction intégrée long().
Nombres complexes
Ils le sont, complexes. Si ça vous dit, allez lire l'article sur wikipedia: fr.wikipedia.org Nombre_complexe
Il suffit d'ajouter un j devant la partie imaginaire (et pas une autre lettre, comme x):
>>> nombrecomplexe = 1 + 2j
>>> nombrecomplexe
(1+2j)
>>> nombrecomplexe = 1 + 2x
File "<stdin>", line 1
nombrecomplexe = 1 + 2x
^
SyntaxError: invalid syntax
Ce n'est pas une équation, mais bien un nombre complexe, avec une partie réelle et une partie imaginaire. On peut aussi utiliser la fonction intégrée complex().
Pas très folichon tout ça, alors passons a autre chose.
Assignations multiples
En Python, on peut assigner plusieurs variables en même temps.
Exemple 1:
x = y = z = 0
Exemple 2:
x, y, z = 0, 1, 2
Réassignation
On peut aussi assigner une valeur a une variable, et bien sur, la changer.
>>> x = 0
>>> print(x)
0
>>>
>>> x = 7
>>>
>>> print(x)
7
Mais on peut aussi réassigner le type, pas seulement la valeur:
>>> x = 0x est tout d'abord un nombre entier, puis une chaine de caractères, sans aucun problème.
>>> print(x)
0
>>> x = "Bonjour!"
>>> print(x)
Bonjour!
Chaines de caractères
Dans notre premier tutoriel, on a imprimé des chaines de caractères, délimitées par les guillemets:
print("allo!")
print('allo!')
print("""allo!""")
De la même façon, on peut assigner une chaine de caractères a une variable en utilisant les guillemets simples, doubles ou encore en triple (''' ''' ou """ """):
x = "allo!"
x = 'allo!'
x = """allo!"""
Et on peux aussi utiliser la fonction integree str():
a = 123
x = str(a)
Type dynamique
Pas le type dynamique comme Python |
On va créer une fonction qui va accepter un paramètre, et va retourner 2 fois ce paramètre:
def mafonction( parametre):
return parametre * 2
Dans un langage de programmation ou l'on doit identifier clairement par type nos variables, il nous faudrait définir une fonction pour les entiers, pour les réels, pour les chaines de caractères, etc. Mais avec python, c'est tout ce que l'on a a faire:
>>> def mafonction( parametre):
... return parametre * 2
...
>>> print(mafonction( 123))
246
>>> print(mafonction( "123"))
123123
>>> print(mafonction((1, 2, 3)))
(1, 2, 3, 1, 2, 3)
>>>
Ceci conclu donc notre deuxième tutoriel. Le prochain, on va créer un squelette de code que l'on va utiliser pour apprendre différends concepts.