Type de langage : Interprété & haut niveau
Créateur : Guido Van Rossum
Date de création : Février 1991
Licence : Équivalent BSD
Plateformes : Unix, Windows, etc.
Langage multi-paradigme : impératif, fonctionnel (?)
et objet
Langage de type scripting (comme PHP)
Indentation obligatoire qui délimite les structures (4 espaces)
Typage dynamique fort (pas comme PHP)
Le monde académique
L'administration système
Le logiciel lourd
La science
Le web
L'électronique et l'embarqué
Très populaire dans la communauté
Simple à apprendre et très utile
Pleins de lib pour contrôler la Pi
Dans notre cas, nous utiliserons Raspbian sur la Raspberry Pi, vous trouverez un tutoriel ici.
wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list
sudo apt-get update
sudo apt-get install sublime-text
Python ne demande aucun IDE particulier.
Nous allons donc installer Sublime Text
sudo apt install python3.5
Plusieurs versions de Python sont disponibles.
Nous allons travailler sur Python 3.5, à la fois suffisamment récent pour avoir toutes les fonctionnalités nécessaires et assez ancien pour être bien supporté
sudo apt install mysql-server mysql-client
Nous allons aussi installer la base de données MySQL.
Une fois ces lignes exécutées, MySQL va vous demander de définir le mot de passe pour le compte root de la base de données. Retenez le bien !
Python est un langage interprété et il permet d'écrire du code directement dans l’interpréteur (le shell) sans avoir à créer de fichier.
C'est pratique pour tester rapidement des trucs.
Pour lancer le shell Python, il vous suffit de démarrer python avec la commande suivante :
python3.5
Le shell va se lancer et le symbole ">>>" indique qu'il attend que vous tapiez du code.
Pour quitter le shell Python, il vous suffit de tapez la commande permettant de quitter un programme python :
exit()
Vous retombez alors sur votre terminal.
1. Créer une variable str
2. Afficher le contenu de cette variable
3. Créer deux variables int
4. Les multiplier
5. Afficher du texte
Il est possible d’exécuter du code Python directement depuis le shell, mais ce n'est vraiment pas pratique !
Pour stocker notre code et l’exécuter quand on en a besoin, on va plutôt créer des fichiers Python contenant l'ensemble du code à lire.
Pour créer un script Python, il va falloir indiquer au système avec quel logiciel il devra lire le script.
Pour cela, il vous suffit de créer un simple fichier texte et de le commencer par les lignes si-dessus.
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
La première ligne indique qu'il faut executer le script avec python3.5
La seconde ligne indique que nous allons utiliser l'encodage utf-8. Depuis python 3 cette seconde ligne n'est pas obligatoire.
Pour commencer, nous allons créer un simple script affichant "Hello World !" dans le terminal.
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
print('Hello World !')
Pour cela, créer un fichier nommé "hello_world.py", écrivez-y le code ci-dessous et enregistrez le.
Dans un premier temps, nous allons rendre le script exécutable via la commande ci-dessous
/chemin/vers/hello_world.py
Pour exécuter le script il n'y a pas qu'à taper son nom
chmod +x /chemin/vers/hello_world.py
Les variables sont créée à la volé. Pas besoin de les déclarer au début du programme.
Pour créer une variable on utilise "=".
name = 'toto'
Exemple pour créer une variable "name" qui contient le texte "toto"
Pour modifier une variable, il suffit de lui assigner une nouvelle valeur, comme la première fois.
name = 'toto'
name = 'titi'
Dans l'exemple ci-dessus la variable name contient maintenant la chaîne de caractère "titi".
Python permet d'assigner plusieurs variables en une seule ligne.
firstname, lastname = 'Élise', 'Lucet'
Dans l'exemple ci-dessus la variable firstname contient la chaîne "Élise" et lastname la chaîne "Lucet".
Vous pouvez aussi assigner la même valeur à plusieurs variables.
activate_autocomplete = activate_coloration = True
Ici activate_autocomplete et activate_coloration valent toutes les deux vrai (booléen)
Python permet de demander à un utilisateur de rentrer du texte au clavier.
user_name = input('What is your name ?')
Ici le programme va afficher la question "What is your name ?" à l'utilisateur, lui demander du texte et stocker la réponse dans la variable user_name.
Attention : Le retour de "input" est toujours du texte, même si l'utilisateur rentre un nombre !
1. Python utilise le ducktyping, et on ne type donc que rarement les variables.
2. Vous ne pouvez pas additionner des types différents, Python ne cast pas automatiquement (contrairement à PHP par exemple).
Exemple, on ne peux pas additionner du texte et des nombres.
Int : Nombre entier [-2 147 483 648, +2 147 483 647]
Long : Nombre entier [-infini, -2 147 483 648] et [+2 147 483 647, +infini]
Float : Nombre à virgule
Complex : Nombre complexes
Str : Chaîne de caractères Unicode UTF-8
Bytes : Chaîne de caractères pas Unicode stockée sous forme de tableau d'entiers (c'est de la merde faut pas toucher)
List : Une liste de données sans clefs.
Ex : [1, 22, 8, 'toto', 3.1].
Dictionnaire : Comme une liste, les clefs en plus.
Ex : {'age' : 10, 'name' : 'Toto'}.
Tuples : Comme une liste, mais qu'on peux pas modifier.
Ex : ('on', 'off', 'off', 'on').
Et encore d'autres que nous verrons au cas par cas...
Bool : Un booléen vrai ou faux. S'écrit True ou False, obligatoirement avec une majuscule.
Ex : activate_color = True.
None : Valeur vide/non définie.
Ex : john_snow_know = None.
Vous pouvez à tout moment retrouver le type d'une variable simplement à l'aide de la fonction type().
Par défaut, en Python 3 les chaînes de caractères sont de type Str et sont des chaînes Unicode UTF-8.
Une chaîne de caractère est entre guillemets simples ', ou doubles ".
ma_chaine = 'Hello World !'
ma_seconde_chaine = "Hello World !"
1. Pour écrire un retour à la ligne, vous pouvez utiliser \n.
2. Le caractère d'échappement en python est \. Il est par exemple nécessaire pour échapper un guillemet au milieu d'une chaîne.
Pour afficher une chaîne de caractère, Python utilise la fonction print().
Cette fonction prend une chaîne en argument.
Par exemple, pour afficher la chaine "Hello World !".
hello = 'Hello World !'
print(hello)
print('Hello World !')
Ou
print() peut aussi concaténer plusieurs chaînes et des variables. Pour cela, il suffit d'écrire chaînes et variables dans l'ordre d'apparition séparées par une virgule.
age = 12
print('Bonjour, je m\'appelle Robert, j\'ai', age, 'ans. Tu veux des bonbons ?')
print() va automatiquement transformer les variables en chaînes de caractères.
Par défaut print() concatène les variables en ajoutant des espaces entre les chaînes et un retour à la ligne à la fin.
Pour modifier ce comportement, passez les arguments sep & end à print() pour définir le séparateur & le caractère de fin à utilisées.
chiffre_1 = 10
chiffre_2 = 5
result = chiffre_1 - chiffre_2
print(chiffre_1, '-', chiffre_2, '->', result, sep = '', end = '.')
10-5->5.
Le code ci-dessous
Va afficher le résultat suivant
Pour des chaînes très complexes, il est possible d'utiliser la fonction format() pour formater la chaîne et insérer des variables dedans.
Pour cela, format utilise des "flags" de la forme {} et qui seront remplacées par les variables fournies.
L'utilisation la plus basique de format() est d'insérer des variables dans l'ordre pour remplacer les flags {}.
La variable n°1 remplacera le flag n°1, la n°2 le n°2, etc.
product = 'Pommes bi-goût'
price = 1.69
print('Les {} coûtent {} € !'.format(product, price))
va afficher
Les Pommes bi-goût coûtent 1.69 € !
Exemple :
Une utilisation plus poussée de format() est d'insérer des variables nommées à la place des tags.
La variable nommée "prod" remplacera le flag {prod}, sans tenir compte de l'ordre.
product = 'Pommes bi-goût'
price = 1.69
print('Les {prod} coûtent {prix} € !'.format(prix = price, prod = product))
va afficher
Les Pommes bi-goût coûtent 1.69 € !
Exemple :
Le dernier usage de format est d'insérer des variables formatées. Par exemple, un chiffre avec seulement 1 chiffre après la virgule.
Pour cela, on utilise un tag de la forme {nom_tag:format_souhaite}.
product = 'Pommes bi-goût'
price = 1.69
print('Les {prod} coûtent {prix:.1f} € !'.format(prod = product, prix = price))
va afficher
Les Pommes bi-goût coûtent 1.7 € !
Exemple :
+ : Addition (et aussi concaténation pour les chaînes de caractères).
- : Soustraction
* : Multiplication
/ : Division
** : Puissance
% : Modulo
// : Quotient d'une division
x = 10
y = 3
x - y #7
x + y #13
x * y #30
x / y #3.333333...
x ** y #1000
x % y #1
x // y #3
== : Égalité
< : Inférieur
> : Suppérieur
<= : Inférieur ou égal
>= : Supérieur ou égal
!= : Différent
x = 10
y = 3
x == y #False
x < y #False
x > y #True
x <= y #False
x >= y #True
x != y #False
and : Et logique
or : Ou logique
is : Affirmation
not : Négation (inverseur)
in : appartient
x = True
y = False
z = (True, 22, 'string')
x and y #False
x or y #True
x is True #True
not x #False
x in z #True
En python on retrouve trois instructions conditionnelles : if, else et elif (Si, Sinon, Sinon Si).
Ces instructions s'utilisent de la façon suivante : instruction, condition à tester, ':'
if var1 < var2 :
if : Le bloc est exécuté si la condition est valide.
else : Le bloc est exécuté si le bloc précédent n'est pas executé.
elif : Le bloc est exécuté si le bloc précédent n'est pas executé et que la condition est valide.
Une particularité de Python est qu'il n'existe pas de délimiteur de blocs.
Pour délimiter des blocs logiques (conditions, boucles, etc.) Python utilise uniquement l'indentation (4 espaces) !
if ($var1 < $var2)
{
echo '$var1 inférieure';
}
elseif ($var2 < $var1)
{
echo '$var2 inférieure';
}
else
{
echo '$var1 et $var2 égales';
}
if var1 < var2 :
print('var1 inférieure')
elif var2 < var1 :
print('var2 inférieure')
else :
print('var1 et var2 égales')
Exemple en PHP
Exemple en Python
La boucle while permet de répéter un bloc d'instructions tant qu'une condition est validée.
Elle s'utilise sous la forme "while condition :".
while var1 < var2 :
Comme pour les blocs conditionnels, la délimitation du bloc se fait exclusivement par l'indentation.
Dans beaucoup de langages la boucle for sert à boucler tout en effectuant une action (souvent incrémenter une variable). Pas en Python !
En Python, la boucle for sert à répéter une action sur chaque élément d'un itérable (tuple, liste, dictionnaire, etc.). Comme une boucle foreach en PHP.
for element in liste :
Elle s'utilise en déclarant la variable dans laquelle on veux récupérer la valeur de l'élément et la liste à parcourir.
for key, element in liste :
Notez que vous pouvez aussi récupérer la clé de l'élément si vous en avez besoin. Pour un dictionnaire par exemple.
Il peut parfois être utile de quitter une boucle prématurément ou de passer une itération de la boucle.
Pour cela on trouve deux instructions.
break pour quitter la boucle en cours.
continue pour passer à l'itération suivante.
for chiffre in [1, 2, 3] :
if chiffre == 2 :
continue
print('Chiffre: ', chiffre)
#affichera 1 et 3
for chiffre in [1, 2, 3] :
if chiffre == 2 :
break
print('Chiffre: ', chiffre)
#affichera 1
Une fonction est un bloc de code indépendant du reste du code et qui est chargé d’exécuter une action définie.
Ce bloc de code a la particularité de pouvoir être appelé par le programme à n'importe que moment.
Python dispose d'un certain nombre de fonctions intégrées au langage, comme print(). Mais il permet aussi au développeur de définir des fonctions personnalisées.
C'est un moyen d'écrire du code maintenable et facilement ré-utilisable sans avoir le ré-écrire.
Pour créer une fonction en Python, on utilise le mot clef def, puis le nom de la fonction à créer, et enfin la liste des variables attendues par la fonction.
def addition (chiffre1, chiffre2) :
print(chiffre1 + chiffre2)
Par exemple, pour créer une fonction nommée addition et qui doit afficher le résultat de l'addition de deux variables, voici le code adapté.
Il ne peux pas exister deux fonctions avec le même nom.
Pour appeler une fonction en Python, il suffit d'utiliser le nom de cette fonction et lui passer entre parenthèse les différents arguments.
addition(5, 10)
Pour utiliser la fonction précédente et afficher le résultat de l'addition de 5 et 10, nous utiliserons donc le code suivant.
Pour retourner une valeur depuis une fonction, Python utilise le mot clef return.
Cela permet notamment de récupérer un résultat pour l'utiliser plus tard dans le programme.
Par exemple, si nous voulons que la fonction addition retourne le résultat plutôt que de l'afficher directement, nous pouvons écrire le code suivant.
def addition (chiffre1, chiffre2) :
return chiffre1 + chiffre2
Lors de la définition d'une fonction, il est possible de définir des valeurs par défaut pour des arguments qui seront utilisées si ces arguments ne sont pas passées à la fonction.
Pour cela, il suffit de rajouter "= la valeur par défaut" derrière l'argument.
Par exemple pour créer une fonction puissance qui par défaut met à la puissance 2.
def puissance (chiffre, puissance = 2) :
return chiffre ** puissance
Lors de l'appel d'une fonction il est possible d'utiliser des paramètres nommés, par exemple pour passer seulement certaines valeurs optionnelles à une fonction.
Pour cela, il suffit de passer nom_argument = valeur à la fonction lors de l'appel.
#Pour une fonction info avec 3 arg dont 2 optionnels
def info (arg1, arg2 = 'arg2', arg3 = 'arg3') :
...
info(arg1, arg3 = 'toto')
Une bibliothèque c'est un ensemble de fonctions qui remplissent un objectif commun et qui peuvent facilement êtres intégrées au code.
L'intérêt d'une bibliothèque est de rendre le code plus modulaire, plus rapide à écrire et réduire le temps de maintenance nécessaire.
Python est particulièrement riche en bibliothèques et c'est une de ses grandes forces !
(Toi au fond, qui viens de dire "un endroit où on empreinte des livres"... tais-toi...)
Bibliothèque standard
Bibliothèques tierces
Répond à des besoins classiques
Installée de base avec Python
Répond à des besoins particuliers
Doit-être installée manuellement
Pour pouvoir utiliser une lib installée (standard/tierce), vous devez dabord indiquer à Python que vous souhaitez l'utiliser.
Pour cela, Python utilise l'instruction import.
Cette fonction s'utilise très simplement en faisant "import nom_de_la_lib". Puis en utilisant "nom_de_la_lib.fonction()"
import os
print(os.name)
Python rend possible d'importer seulement une partie d'une bibliothèque (une seule classe/fonction).
Pour cela, Python utilise toujours l'instruction import, mais précédée de l'instruction from.
Plus précisément, il faut faire "from nom_lib import nom_fonction"
from hashlib import md5
md5('toto'.encode())
Si vous avez besoin de bibliothèques particulières, vous allez devoir les installer vous même.
Il existe plusieurs façon d'installer des bibliothèques tierces, mais pip est une des plus pratique.
Pip est un gestionnaire de paquets, càd un programme permettant d'ajouter, retirer, mettre à jour, etc. des librairies utilisées dans un projet.
Pour pouvoir utiliser pip, nous allons commencer par l'installer s'il ne l'est pas déjà.
Pour cela, il vous suffit de passer par les gestionnaires de paquet Linux en utilisant la commande ci-dessous.
sudo apt-get install python-pip python3-pip
Pour installer une bibliothèque avec pip, vous devez savoir deux choses.
Quelle bibliothèque installer ?
Pour quelle version de Python ?
Pour trouver une bibliothèque, vous pouvez allez sur le Python Package Index : https://pypi.python.org/pypi
Le PyPI regroupe un très grand nombre de bibliothèques tierces pour Python et vous permet de les installer directement avec pip.
Enfin, PyPI propose aussi une barre de recherche, par exemple pour trouver une lib sur un sujet précis.
Pip vous permet d'installer une bibliothèque pour différentes versions de Python. Vous devez faire attention à deux points.
Trouver une bibliothèque compatible avec votre version de Python.
Installer la bibliothèque depuis la bonne version de pip. En effet, un "pip2 install" installera pour Python 2, un pip3 pour Python 3.
Une fois que vous avez trouvé la bibliothèque qui vous convient, il ne nous reste plus qu'à l'installer.
Pour cela, il vous suffit de vous rendre sur la page PyPI de cette bibliothèque de copier son nom et de faire.
sudo pip3 install son_nom
Une fois l'installation terminée, vous pouvez l'utiliser comme toutes les autres lib avec import.
Note : Toujours utiliser pip avec sudo, comme ça ça installe le module pour TOUS les utilisateurs
Si vous n'avez plus besoin d'une bibliothèque, vous pouvez la désinstaller.
Pour cela, rien de compliquer, faîtes juste
sudo pip3 uninstall son_nom
Au cours de votre travail, vous pourriez avoir besoin de récupérer la dernière version d'une lib, en la mettant à jour.
Pour cela, encore une fois c'est très simple, faîtes juste
sudo pip3 install son_nom --upgrade
Nous avons vu qu'il était possible d'importer une bibliothèque en Python. De la même façon il est possible d'importer un simple fichier Python.
En fait, quand on importe un fichier Python, il va être plus ou moins automatiquement transformé en bibliothèque par Python !
Comme pour importer une bibliothèque, on utilise le mot clé import.
On utilise donc le mot clé import et le nom du fichier à importer sans le .py à la fin.
Exemple : Pour importer le fichier hello_world_func.py depuis import_file.py et appeler la fonction say_hello()
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import hello_world_func as hello
hello.say_hello()
Arborescence
import_file.py
En Python, il est possible de récupérer le contenu d'un fichier.
Pour cela, vous devez d'abord ouvrir le fichier, avec la commande open(), puis lire ce fichier avec read().
open(), prend en argument le chemin du fichier et le mode d'ouverture sous forme d'une lettre (Read, Write, Append, Read+write).
Exemple : Lire et afficher le contenu fichier hello_world.txt depuis read_file.py
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
file = open('./hello_world.txt', 'r')
file_content = file.read()
print(file_content)
En Python, il est aussi possible de créer et d'écrire dans un fichier.
Pour cela, vous devez d'abord ouvrir le fichier, avec la commande open(), puis écrire avec write() et enfin fermer avec close().
write(), prend en argument le texte à écrire.
Exemple : Écrire "Hello World !" dans le fichier tmp.txt depuis le script write_file.py
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
file = open('./tmp.txt', 'w')
file.write('Hello World !')
file.close()
PS : Attention, vous devez avoir les droits d'écriture dans le dossier !
Au delà de ses capacités propres, Python vous permet de demander à Linux d'exécuter une commande.
Par exemple, si vous voulez que le serveur joue un fichier son au format .wav suite à une action en Python, vous pouvez demander au système de démarrer le logiciel aplay qui le fera pour vous !
Il est parfois plus simple de passer des commandes système, par exemple pour s'interfacer avec un logiciel.
Deux façons de passer des commandes : Synchrone & Asynchrone.
Commande asynchrone = Python n'attend pas la fin + ne dispose pas du retour.
On utilise os.popen() avec la commande en argument. Il retourne une variable permettant de lire le résultat de la commande avec read().
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import os
command = os.popen('ls ./')
command_return = command.read()
print(command_return)
Commande synchrone = Python attend la fin + dispose du retour.
On utilise os.system() avec la commande en argument et il va directement afficher le retour.
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import os
os.system('touch ./file.tmp')
Pour stocker des informations après la fin d'un script Python, le moyen le plus pratique est la base de données.
Python supporte de nombreuses bases de données, mais la plus classique reste MySQL (installée au début du cours).
Il existe plein d'autres bases, mais MySQL est largement suffisante pour nos besoins et TRÈS documentée.
Pour pouvoir utiliser MySQL depuis Python vous devez avoir installer un certains nombres de drivers.
Depuis Python 3 l'installation est assez réduite, il vous suffit de lancer la commande ci-dessous.
sudo apt-get install python3-mysql.connector
Avant de pouvoir utiliser notre base de données depuis Python, nous devons d'abord la créer.
Nous allons créer une base de données nommée "cours_iot_introduction_python", et contenant une table "user" avec les champs id, firstname, lastname et age.
1. Téléchargez le fichier create_database.sql
2. Exécuter le fichier dans MySQL.
mysql -u root -p < create_database.sql
La première étape pour utiliser la base de données est de nous connecter dessus depuis Python.
Pour cela, on utilise la fonction connect() de mysql.connector et cursor().
#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import mysql.connector
mysql_connection = mysql.connector.connect(host = 'localhost', user = 'root', password = 'your_password', database = 'cours_iot_introduction_python')
mysql_cursor = mysql_connection.cursor()
La seconde étape va être de récupérer le contenu d'une table.
On utilise la fonction execute() du curseur pour exécuter une requête puis fetchall() pour récupérer les données. Puis une boucle for pour les afficher.
mysql_cursor.execute('SELECT * FROM user')
users = mysql_cursor.fetchall()
for user in users :
print('id: {}, firstname: {}, lastname: {}, age: {}'.format(user[0], user[1], user[2], user[3]))
La seconde étape va être de récupérer le contenu d'une table.
On utilise la fonction execute() du curseur pour exécuter une requête puis fetchall() pour récupérer les données. Puis une boucle for pour les afficher.
mysql_cursor.execute('SELECT * FROM user')
users = mysql_cursor.fetchall()
for user in users :
print('id: {}, firstname: {}, lastname: {}, age: {}'.format(user[0], user[1], user[2], user[3]))
La dernière étape va être d'insérer une nouvelle ligne dans la base de données.
query_data = {'firstname': 'Elisabeth', 'lastname' : 'Tessier', 'age' : 80}
mysql_cursor.execute('INSERT INTO user (firstname, lastname, age) VALUES (\'{firstname}\', \'{lastname}\', {age})'.format(**query_data))
mysql_connection.commit()
On utilise aussi la fonction execute() puis la fonction commit() pour valider les écriture en base.
Ne faîtes pas confiance aux utilisateurs. Protégez vos variables et vos requêtes contre les injections SQL.
query_data = {'firstname': 'Elisabeth', 'lastname' : 'Tessier', 'age' : 80}
mysql_cursor.execute('INSERT INTO user (firstname, lastname, age) VALUES (%(firstname)s, %(lastname)s, %(age)s)', query_data)
Pour ça, on insert pas directement la variable dans la requête. À la place on met %(clef)s dans la requête et on passe les données sous forme d'un dictionnaire avec les clefs à execute(). Comme PDO pour PHP.
Toutes les données doivent venir de cryptocompare.com et vous devez utilisez une librairie tierce pour vous connecter à leur API.
1. Demande à l'utilisateur la crypto dont il veut le prix ou s'il veut la liste des cryptos disponibles.
2. Cherche la liste des cryptos et les affiches. Ou cherche le prix via l'API de cryptocompare.com et l'affiche
3. Retour au n°1
Prochaine séance
Sous forme de repo GitHub
Lien du GitHub par mail
Sujet du mail : Cours IoT - TP crypto
Les bases :
Notions avancées & informatique en général :
Meilleur blog de dev français, meilleure réflexion sur l'industrie informatique, meilleure explication de Python.
sametmax.com : du code, du cul !