Tuesday, December 11, 2012

Python sur Raspberry Pi 02

On continue notre série de tutoriels sur le langage de programmation Python sur le Raspberry Pi.

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

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.0
>>> prixunitaire = COUT_JANTES / JANTES
>>> prixunitaire
682.75
>>> prixunitaire * JANTES
2731.0
On peut aussi utiliser la fonction intégrée float():

>>> prixunitaire = float(COUT_JANTES) / JANTES
>>> prixunitaire
682.75
Similairement, il existe une fonction intégrée int().

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 peut 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 = 0
>>> print(x)
0
>>> x = "Bonjour!"
>>> print(x)
Bonjour!
x est tout d'abord un nombre entier, puis une chaine de caractères, sans aucun problème.

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 peut aussi utiliser la fonction integree str():

a = 123
x = str(a)

Type dynamique

Pas le type dynamique comme Python
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:

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.

No comments: