6. Python¶
6.1 Qu'est-ce que Python ?¶
Selon Wikipédia :
Python est un langage de programmation objet, multi-paradigme et multiplateformes. [...] Il peut s'utiliser dans de nombreux contextes et s'adapter à tout type d'utilisation grâce à des bibliothèques spécialisées. Il est cependant particulièrement utilisé comme langage de script pour automatiser des tâches simples mais fastidieuses.
La première version publique de Python est sortie en 1991. Son auteur, le programmeur Guido van Rossum, était un fan de la série télévisée Monty Python's Flying Circus, une série humoristique sous forme de sketches. C'est de cette série que le langage de programmation tient son nom.
Python est un langage de programmation interprété. Il est reconnu pour sa syntaxe concise et élégante ainsi que la rapidité avec laquelle il permet de développer un programme. De plus, il est possible de lui programmer des modules d'extension en C ou en C++.
Ces caractéristiques combinées au fait qu'il est un logiciel libre font de lui un langage de progammation très prisé.
Pour plus d'information¶
« Learning Python: From Zero to Hero ». Medium. https://medium.freecodecamp.org/learning-python-from-zero-to-hero-120ea540b567
« The Python Tutorial ». Python. https://docs.python.org/3.6/tutorial/index.html
« Python 3.6.4 documentation ». Python. https://docs.python.org/3.6/index.html
« Apprendre le langage de programmation python ». apprendre-python.com. http://apprendre-python.com/
« Apprenez à programmer en Python ». Open Classrooms. https://openclassrooms.com/courses/apprenez-a-programmer-en-python
« Introduction au langage de programmation Python 3 ». Fabrice Sincère. http://fsincere.free.fr/isn/python/cours_python.php?version=3
« Petites choses diverses à savoir pour débuter en Python ». Formation Django. http://www.formation-django.fr/python/petites-choses-a-savoir.html
6.2 Python 2.X vs 3.X¶
Comme tout langage de programmation, Python a subi de nombreuses modifications à mesure qu'il évoluait et prenait de la maturité. À un certain stade, ses concepteurs sont venus à un point où ils ont dû briser la compatibilité avec les anciennes versions afin d'offrir de nouvelles possibilités.
C'est pour cette raison qu'il existe deux « familles » de programmes Python : ceux qui sont conçus pour la branche 2.X et ceux pour la branche 3.X.
La version 2.7 est la dernière version de la première branche. Aucune autre version majeure ne sera produite pour la branche 2.X. Elle n'évoluera donc plus mais en revanche, elle est très stable et ceci est vu d'un bon oeil par de nombreux programmeurs.
Dans la branche 3.X, qui évolue depuis 2008, de nombreuses modifications et ajouts visent à améliorer l'expérience des programmeurs et les performances des programmes. C'est pourquoi cette branche est vue comme le présent et le futur de Python.
Si vous hésitez entre Python 2.X et 3.X, vous devriez choisir 3.X. Le seul cas où Python 2.X devrait être utilisé est lorsque vous n'avez pas le choix, par exemple lorsque vous avez besoin d'un paquet qui n'a pas été migré vers 3.X.
Voici, à titre d'exemple, une différence importante entre Python 2.X et 3.X : la commande print est devenue une fonction. À elle seule, cette différence a empêché la rétro-compatibilité avec de nombreux programmes.
Python 2.X
Python 3.X
Vérifier si Python est installé¶
Dans une fenêtre Terminal, vous pouvez lancer cette commande pour vérifier si Python est installé et obtenir le numéro de version :
Terminal
Sous Raspberry Pi OS 10 (Buster), cette commande donne le résultat suivant :
Résultat à l'écran
Plusieurs versions de Python peuvent cohabiter. Pour vérifier si Python 3 est installé :
Terminal
Résultat à l'écran
Ainsi, on voit que lors de l'installation de Raspberry Pi OS 10 (Buster), Python 2.7 et Python 3.7 sont installés par défaut.
Afficher la version de Python par programmation¶
Il est possible d'afficher la version de Python par programmation. Ceci générera un affichage à la console :
Python
Pour plus d'information¶
« Should I use Python 2 or Python 3 for my development activity? ». Python. https://wiki.python.org/moin/Python2orPython3
6.3 Shebang ou hash bang : #!¶
Les script Python commencent généralement par une ligne qui débute par les caractères #! suivis par le chemin de l'interpréteur Python. Cette ligne se nomme shebang ou hash bang.
La présence du shebang permet d'appeler le script Python sans avoir à préciser le nom de son interpréteur.
L'usager devra avoir les droits d'exécution sur le script.
Terminal
Le script pourra être appelé comme suit :
Terminal
Shebang qui utilise la variable d'environnement $PATH¶
La meilleure technique consiste à utiliser /usr/bin/env devant le nom de l'interpréteur.
Cette formulation fait en sorte que le système retrouvera le chemin exact de l'interpréteur à partir de la variable d'environnement $PATH de l'usager.
Ceci assure un maximum de compatibilité si le script doit être exécuté sur un autre système ou même par un autre usager.
Python
Shebang fixe¶
Parfois, on retrouve plutôt ceci, qui correspond au chemin donné lorsqu'on entre la commande which python3 dans une fenêtre terminal.
Python
Remarquez qu'il n'y a pas de barre oblique avant le mot python3.
Cette formulation fonctionne également mais elle risque de ne plus fonctionner si le script est utilisé sur un autre système ou par un autre usager.
Script sans shebang¶
Dans le cas où le script Phython ne débute pas par un shebang, il faudra ajouter python3 devant son nom pour pouvoir l'exécuter.
Notez qu'à ce moment, l'usager n'a pas besoin d'avoir les droits d'exécution sur le fichier.
Terminal
6.4 Exécuter un programme Python dans une fenêtre Terminal¶
Pour tester un programme Python, il est possible de l'exécuter dans une fenêtre Terminal.
Déplacez-vous dans le dossier qui contient le programme puis tapez son nom avec son extension.
Exemple sous Windows :
Fenêtre de commande DOS
Exemple sous Mac ou Linux :
Terminal
Il est également possible d'exéuter le programme en faisant appel à la commande python (pour Python 2.7) ou python3.
Terminal
6.5 Les structures de contrôle¶
Les structures de contrôles permettent de contrôler le flux d'un programme grâce à des conditions et à des boucles.
La condition¶
Ex :
Python
Note : l'indentation (4 espaces) est importante : c'est elle qui indique quand un bloc d'instruction se termine.
La boucle while¶
Pour boucler tant qu'une condition est vraie.
Ex :
Python
La boucle for¶
Cette boucle permet de faire une itération un nombre défini de fois.
Ex :
Python
Boucler dans les éléments d'une liste¶
Ex :
Python
6.6 Utilisation d'un paquet ou d'un module¶
Pour utiliser un module ou un paquet, peut importe s'il fait partie de la bibliothèque standard ou s'il est externe, faut débuter le script Python par une instruction import.
Bien entendu, un module ou un paquet externe devra d'abord être installé sur votre poste de travail.
Par exemple, pour utiliser le module calendar :
Python
Instruction from ... import ...¶
Lorsqu'on utilise l'instruction import, chaque classe ou fonction importée doit être précédée par le nom du module ou du paquet, comme démontré plus haut avec calendar.isleap().
Il est possible de modifier ce comportement à l'aide de la syntaxe from ... import *. Les classes et fonctions seront désormais accessibles comme si elles faisaient partie du coeur de Python.
Python
Autre exemple :
Python
Paquet contenant plusieurs modules¶
Puisqu'un paquet est un dossier qui contient des modules, Python devait avoir un moyen de comprendre ce qu'il doit faire lorsqu'on lui lance une instruction import sur un paquet.
Dans les faits, lorsqu'il rencontre le nom d'un paquet dans une instruction import, Python recherchera un fichier nommé init.py dans ce dossier. Autrement dit, l'importation d'un paquet consiste à importer le module init présent dans ce paquet.
Certains paquets sont configurés pour que tous leurs modules soient importés automatiquement. D'autres laissent le soin au programmeur d'importer seulement les modules désirés.
C'est pourquoi, lorsque vous avez besoin d'une fonction ou d'une classe définie dans un autre module du paquet, il se peut que vous ayez besoin de faire une importation précise du module désiré.
La syntaxe à utiliser est sous la forme :
Syntaxe Python
ou
Syntaxe Python
ou encore, si le nombre de classes ou de fonctions à utiliser est important :
Syntaxe Python
Ex :
Python
Pour plus d'information¶
« Python 101: All about imports ». Mouse vs Python. https://www.blog.pythonlibrary.org/2016/03/01/python-101-all-about-imports/
« The Python Standard Library ». Python. https://docs.python.org/3/library/index.html
« UsefulModules ». Python. https://wiki.python.org/moin/UsefulModules
« PyPI - the Python Package Index ». Python. https://pypi.python.org/pypi
« Python 3 Module of the Week ». PyMOTW-3. https://pymotw.com/3/index.html
« Les imports en Python ». Sam & Max. http://sametmax.com/les-imports-en-python/
« Structuring Your Project - Packages ». The Hitchhiker's guide to Python. http://docs.python-guide.org/en/latest/writing/structure/#packages
6.7 À quel endroit Python recherche-t-il les modules?¶
Si un programme Python utilise un module sans savoir à quel endroit il est placé, vous obtiendrez une erreur du genre :
Résultat à l'écran
Traceback (most recent call last):
File "./mon_programme.py", line 4, in <module>
import mon_module
ModuleNotFoundError: No module named 'mon_module'
Lorsqu'il rencontre une instruction import, Python recherchera un fichier dont le nom est identique au nom du module, avec l'extension .py.
Il recherchera ce fichier :
- dans le dossier courant
- dans la liste des dossiers de la variable d'environnement Python sys.path
- dans la liste des dossiers de la variable d'environnement de l'OS PYTHONPATH
sys.path¶
Pour connaître la valeur de sys.path, entrez ce code à la ligne de commande Python (rappel : entrez python3 dans une fenêtre Terminal pour obtenir la ligne de commande Python).
Python
Appuyez deux fois sur Retour et vous verrez la liste des dossiers apparaître.
Sur Raspberry Pi OS, voici ce que j'obtiens.
Résultat à l'écran
/usr/lib/python37.zip
/usr/lib/python3.7
/usr/lib/python3.7/lib-dynload
/usr/local/lib/python3.7/dist-packages
/usr/lib/python3/dist-packages
Vous pouvez ajouter un dossier à sys.path par programmation :
Python
PYTHONPATH¶
Pour connaître la valeur de PYTHONPATH sur un système Linux ou Mac :
Terminal
Et sur un système Windows :
Invite de commande (CMD)
Il est possible d'ajouter du contenu à cette variable. Mais attention : ceci sera valable jusqu'à ce que l'ordinateur soit redémarré.
Sour Linux ou Mac :
Terminal
ou
Terminal
Sous Windows :
Invite de commande (CMD)
Les dossiers ajoutés ainsi à PYTHONPATH seront automatiquement ajoutés à sys.path.
Si vous voulez faire un ajout permanent, ajoutez cette instruction dans le fichier .bashrc ou, si vous travaillez sous Windows, passez par le panneau de configuration.
Pour plus d'information¶
« Where does Python look for modules? ». Matthew Brett. https://bic-berkeley.github.io/psych-214-fall-2016/sys_path.html
« Python import, sys.path, and PYTHONPATH Tutorial ». Dev Dungeon. https://www.devdungeon.com/content/python-import-syspath-and-pythonpath-tutorial#:~:text=PYTHONPATH%20is%20related%20to%20sys,for%20modules%20when%20using%20import%20.
6.8 Les tableaux, listes et tuples¶
Tuple¶
En Python, un tuple est un tableau immuable et très performant. On utilisera les parenthèses pour l'initialiser.
Ex :
Python
Dans le cas où il y a un seul élément dans le tuple, on doit faire suivre cet élément par une virgule afin que Python comprenne qu'il ne s'agit pas d'une chaîne de caractères entourée de parenthèses.
Ex :
Python
Liste¶
Une liste est un tableau modifiable de longueur variable. On utilisera les crochets carrés pour l'initialiser.
Ex :
Python
Tableau associatif (dictionnaire)¶
Un tableau associatif est caractérisé par des éléments qui portent un nom plutôt qu'un indice. On utilisera les accolades pour l'initialiser.
Ex :
Python
6.9 Écrire nos propres fonctions¶
Il est très rare qu'une application soit écrite tout d'un bout sans utiliser de fonctions.
On utilisera souvent des fonctions qui font partie intégrante de Python (ex : print()). On parlera de fonctions préprogrammées.
On pourra également coder nos propres fonctions. On parlera alors de fonctions utilisateur, fonctions définies par l'utilisateur ou encore, en anglais, user-defined functions (UDF).
Quel est l'intérêt de coder nos propres fonctions ? Il y a différents raisons qui justifient ce choix :
- Le même code doit être exécuté à plusieurs endroits dans le programme (principe DRY : Do not Repeat Yourself).
- Le code devient plus facile à comprendre si une partie du code est placé dans une fonction disticte (principe KISS : Keep It Simple, Stupid !).
- Il faut attacher du code à un événement (ex : un clic sur un bouton). La fonction permettra de délimiter le code à exécuter lorsque l'événement survient.
Comme dans tous les langages de programmation, lorsqu'on code une fonction, il y a deux étapes à réaliser :
- la déclaration de la fonction
- l'appel de la fonction
Déclaration de la fonction¶
Lorsqu'une fonction est déclarée, son code n'est pas exécuté tout de suite. Il le sera seulement lorsque la fonction sera appelée.
La déclaration d'une fonction se fait à l'aide du mot-clé def. Tout le code de la fonction sera décalé de 4 espaces par rapport au programme principal. Ainsi, Python saura que le code de la fonction est terminé lorsqu'il rencontrera une ligne qui n'est pas décalée.
Ex :
Python
Appel de la fonction¶
Pour appeler une fonction, il faut écrire son nom suivi de parenthèses :
Python
Il est également possible de passer des paramètres à la fonction.
Ex :
Python
Documentation de la fonction¶
Pour chacune des fonctions que vous coderez, il est d'usage de commencer par un commentaire Docstring qui indique ce que la fonction fait. Le commentaire Docstring est constitué d'une ou plusieurs lignes de texte entourées par des triples apostrophes (""").
Ex :
Python
Python
def ma_fonction():
""" Effectue telle ou telle action.
Ceci est un commentaire sur plusieurs lignes.
On laisse généralement une ligne blanche après la première ligne, qui est un sommaire.
Les triple-guillemets peuvent se refermer à droite de la dernière ligne ou encore sur la ligne suivante.
"""
...
Indicatif visuel du début du programme principal¶
En Python, il faut toujours placer une fonction avant le programme qui l'utilise. C'est pourquoi on retrouvera les définitions de fonctions en haut du programme et le programme principal dans le bas.
Puisque les fonctions doivent être définies avant le programme principal, il est pratique d'ajouter un commentaire qui indique clairement à quel endroit le programme principal commence.
Ex :
Python
6.10 Utiliser une variable du programme principal dans une fonction (portée des variables)¶
Lorsqu'une application Python contient des fonctions utilisateur et que ces fonctions doivent utiliser des variables, il faut prendre le temps de comprendre la portée des variables.
La portée d'une variable (variable scope) indique à quel endroit elle peut être utilisée dans le programme.
Une variable qui est créée dans une fonction ne risque pas d'entrer en conflit avec une autre variable du même nom créée dans une autre fonction ni même avec une variable du même nom créée dans le programme principal.
La portée d'une variable est limitée à la fonction dans laquelle elle a été créée.
Passer un paramètre à la fonction¶
Il arrive cependant des cas où on voudra créer une variable dans le programme principal et utiliser cette même variable dans une fonction. La technique par excellence consiste à passer la variable en paramètre à la fonction.
Ex :
Python
def afficher_message(nom):
"""Affiche un message avec le nom saisi par l'usager."""
print('Bonjour, ' + nom + ' !')
########## programme principal ##########
nom = input('Quel est ton nom ? ')
afficher_message(nom)
Étendre la portée à l'aide de global¶
Certaines situations nous empêchent de passer des paramètres à une fonction. Ce sera le cas, notamment, lorsque la fonction est appelée par Python en réponse à un événement.
À ce moment, on pourra indiquer à Python que la variable qu'on utilise dans la fonction est la même que celle créée dans le programme principal. Ceci sera fait à l'aide du mot-clé global.
Soit le programme suivant, qui n'utilise ni paramètre, ni variable globale :
Python
def changer_nom():
"""Change la valeur de la variable nom sans affecter le programme principal."""
nom = 'abc'
########## programme principal ##########
nom = input('Quel est ton nom ? ')
changer_nom()
print('Bonjour, ' + nom + ' !')
Le message utilisera toujours le nom saisi par l'usager et ce, même si la fonction assigne la valeur 'abc' à une variable qui s'appelle elle aussi nom.
Si on voulait changer ce comportement :
Python
def changer_nom():
"""Change la valeur de la variable globale nom, ce qui affectera le programme principal."""
global nom
nom = 'abc'
########## programme principal ##########
nom = input('Quel est ton nom ? ')
changer_nom()
print('Bonjour, ' + nom + ' !')
Cette fois, le programme affichera toujours « Bonjour, abc ! ».
6.11 La programmation objet en Python¶
Même si les concepts de programmation orientée objet sont les mêmes d'un langage de programmation à l'autre, les différences de syntaxe peuvent parfois être déconcertantes.
Quelques faits saillants :
- Le nom de la classe est écrit en casse Pascal
.
- Si la classe hérite d'une autre classe, on met le nom de la classe de base entre parenthèses.
- Si la classe n'a pas de parent, on ne met pas de parenthèses.
- À l'intérieur de la classe, tout le code doit être placé dans une méthode. Seule exception : l'initialisation des variables de classe.
- Chaque méthode est déclarée avec le mot-clé def.
- Le constructeur s'appelle init.
- Le constructeur et les autres méthodes reçoivent toujours self comme premier paramètre.
- Lors de l'appel d'une méthode, on ignore le paramètre self puisque c'est le noyau qui se chargera de le passer en paramètre.
- Un point sépare le nom d'un objet de ses membres.
- Lorsqu'une méthode doit appeler une autre méthode de la classe, il faut faire précéder le nom par self.
Voici donc un exemple de classe écrite en Python pour vous guider pendant votre programmation.
Python
class MaClasse(ClasseDeBase):
# Attributs de classe
un_attribut_de_classe = 'valeur'
def __init__(self, parametre='Valeur par défaut'):
# Initialisation des attributs (variables d'instance)
self.un_attribut = parametre
self.un_autre_attribut = 'autre valeur'
def __str__(self):
return 'Chaîne qui représente l\'objet: %d, %s' % (self.un_attribut, self.un_autre_attribut)
def une_methode(self):
...
def une_autre_methode(self):
...
self.une_methode()
return ...
6.12 Passer un paramètre à un script Python¶
Il est possible de passer un ou plusieurs paramètres, aussi appelés arguments, à un script Python à partir de la ligne de commande.
Terminal
Pour lire la valeur des paramètres dans le script, il faut d'abord importer le module sys.
Python
Les paramètres sont contenus dans un tableau nommé sys.argv.
L'élément 0 du tableau est toujours le nom du script.
L'élément 1 est le premier argument, l'élément 2 est le second argument et ainsi de suite.
Python
Si aucun paramètre n'est passé (paramètre optionnel)¶
Si le script tente de lire un paramètre alors qu'aucun n'a été passé, le script lèvera une exception de type IndexError.
Il faut donc toujours lire le paramètre dans un try... except.
Lorsqu'aucun paramètre n'est passé, le programme réagira en conséquence. Il pourrait, par exemple, fournir une valeur par défaut.
Python
Paramètre numérique¶
À la base, les paramètres sont tous de type texte.
Si le paramètre doit être utilisé comme un nombre, il faut d'abord le convertir.
Python
Paramètre numérique optionnel¶
En combinant les deux approches précédentes, on s'assure que dans le cas d'un paramètre numérique, le programme fonctionne s'il n'est pas passé ou si sa valeur n'est pas numérique.
Python
try:
iterations = int(sys.argv[1])
except IndexError:
iterations = 1 # arrivera ici si aucun paramètre n'est passé
except:
iterations = 1 # arrivera ici si le paramètre n'était pas numérique
Pour plus d'information¶
« Python Command Line Arguments ». Real Python. https://realpython.com/python-command-line-arguments/#the-sysargv-array
6.13 Forcer l'arrêt d'un script¶
Quand vous lancez un script, que ce soit un script bash ou un script Python, il pourrait arriver une situation où vous devez en forcer l'arrêt, par exemple si le script entre dans une boucle sans fin.
Ctrl+C¶
La façon la plus intéressante pour terminer un programme est d'appuyez sur les touches Ctrl+C. Ceci émet un signal SIGINT qui arrête gentiment le programme.
Dans le cas d'un script Python, SIGINT lève une exception de type KeyboardInterrupt qui interrompt le code et qui peut être attrrapée et traitée au même titre que toute autre exception.
Ctrl+Z¶
Dans le cas où Ctrl+C ne fonctionne pas, on peut se tourner vers une action un peu plus corsée : appuyer sur les touches Ctrl+Z . Ceci émet un signal SIGTSTP qui arrête immédiatement le programme.
Dans les faits, le programme est mis en pause, ce qui peut causer des problèmes, par exemple en ne libérant pas les ports associés au processus.
Dans le cas d'un script Python, SIGTSTP ne laisse pas le temps au script de se terminer normalement.
Il est à noter que certains scripts pourrraient ignorer ce signal.
Tuer le processus¶
Dans d'autres situations plus complexes, par exemple si le script est lancé par un intermédiaire comme une boîte domotique, alors on n'a pas accès à Ctrl+C ou Ctrl+Z pour l'arrêter. À ce moment, il faut tuer le processus à l'aide de la commande kill ou pkill.
pkill¶
La commande pkill tue un processus à partir de son nom.
Le plus simple est de lui fournir, à l'aide de -f, le nom du script Python que l'on veut arrêter.
Terminal
Par défaut, pkill envoit un signal SIGKILL qui tue brutalement le processsus sans lui laisser la chance de se terminer de façon gracieuse (libération de la mémoire et tout et tout).
Aucun script ne peut ignorer ce signal.
kill¶
La commande kill tue un processus à partir de son numéro généré par le système d'exploitation.
Pour faut trouver le numéro du processus qui correspond au script, on peut utiliser la commande ps. On précisera qu'on ne veut voir que les processus dont le nom contient python.
Terminal
Vous obtiendrez un résultat semblable à cet extrait :
Résultat à l'écran
pi@raspberrypi:~ $ ps -ef | grep python
pi 891 1260 0 11:16 pts/0 00:00:00 python3 clignote.py
pi 1288 1260 0 07:57 pts/0 00:00:00 python3 allume_led.py
La deuxième colonne indique le numéro du processus. Ainsi, pour terminer le script clignote.py, il faut faire :
Terminal
Il est possible d'utiliser le nom du signal à envoyer plutôt que son numéro :
Terminal
Ces deux commandes envoient un signal SIGKILL qui tue brutalement le processsus sans lui laisser la chance de se terminer de façon gracieuse (libération de la mémoire et tout et tout).
Aucun script ne peut ignorer ce signal.
Remarquez que le même résultat que Ctrl+C peut être obtenu en entrant ceci dans une seconde fenêtre Terminal :
- kill -2 suivi du numéro de processus
ou * kill -SIGINT suivi du numéro de processus
Pour plus d'information¶
« Signal (IPC) ». Wikipedia. https://en.wikipedia.org/wiki/Signal_(IPC)
« kill - Envoyer un signal à un processus ». MAN Linux Magique. http://www.man-linux-magique.net/man1/kill.html
« What to do when a Linux desktop freezes? - If all else fails, you Raise The Elephant ». Stack Exchange. https://unix.stackexchange.com/questions/31818/what-to-do-when-a-linux-desktop-freezes#answer-33891
6.14 Erreurs fréquentes¶
Information à venir...
Pour plus d'information¶
« Invalid Syntax in Python: Common Reasons for SyntaxError ». Real Python. https://realpython.com/invalid-syntax-python/
6.15 La syntaxe Python vs autres langages¶
Si vous avez déjà travaillé avec quelques langages de programmation, vous savez que la syntaxe varie d'un langage à l'autre. Parfois, les différences sont minimes mais d'autre fois, elles peuvent être déroutantes.
Pour vous aider à vous acclimater à Python, voici quelques éléments de syntaxe à connaître et leur comparaison avec d'autres langages.
| Python | JavaScript | PHP | C# | |
|---|---|---|---|---|
| Chaînes de caractères | nom = "Annie" ou nom = 'Annie' Les deux sont équivalents mais les programmeurs préfèrent généralement les apostrophes. Les triples apostrophes ou guillemets permettent de générer une chaîne incluant les sauts de ligne et tabulations. Très utile pour générer du HTML ou du JSON. html = '''
|
nom = "Annie"; ou nom = 'Annie'; | $nom = "Annie"; ou $nom = 'Annie'; La version avec guillemets permet d'interpréter des variables dans la chaîne. $texte = "Bonjour $nom"; La version avec apostrophes est très légèrement plus rapide. | nom = "Annie"; |
| Booléens | True False Sensible à la casse | true false Sensible à la casse | True ou true ou TRUE False ou false ou FALSE Insensible à la casse | true false Certaines fonctions C# retournent cependant True ou False... bool valeur = true; Console.WriteLine(valeur); // True |
| Opérateurs booléens | and or not | && | ! | |
| Concaténation | nom_complet = prenom + ' ' + nom_famille | nomComplet = prenom + ' ' + nomFamille; | $nomComplet = $prenom . ' ' . $nomFamille; | nomComplet = prenom + '" " + nomFamille; |
| Incrémentation | i += 1 | i += 1; (affectation après addition) i++ (opérateur d'incrémentation en suffixe) ++i (opérateur d'incrémentation en préfixe) | $i += 1; $i++ (post-incrémente) ++$i (pré-incrémente) | i += 1; i++ ++i |
| Conversion de type | nombre= int(saisie) | nombre = parseInt(saisie); | $nombre = (int)$saisie; ou $nombre = intval($saisie); | nombre = Convert.ToInt32(saisie); ou Int32.TryParse(saisie, out nombre); |
| Affichage à l'écran | print(nom) ou, pour éviter les sauts de ligne : print(nom, end='') On peut interpréter des variables dans une chaîne : print(f"Votre score est {score}") | L'affichage se fait à l'aide de manipulations du DOM : balise.innerHTML = nom; Si on utilise jQuery : $(balise).html(nom); Pour afficher à la console : console.log(nom); Pour afficher dans une fenêtre popup : window.alert(nom); | echo $nom; | Dans une page Web : Response.Write(nom); À la console : Console.WriteLine(nom); |
| Lecture à la console | nombre = input('Veuillez entrer un nombre : ') | Console.WriteLine("Veuillez entrer un nombre : "); nombre = Console.ReadLine(); | ||
| Tableaux | valeurs = ['a', 'b', 'c'] En Python, on dit que c'est une liste (modifiable, longueur variable) Il existe également des tuples (immuables mais plus performants) : valeurs = ('a', 'b', 'c') ou, s'il y a un seul élément dans le tuple : valeurs = ('a',) | var valeurs = ['a', 'b', 'c']; | $valeurs = ['a', 'b', 'c']; | string[] valeurs = {"a", "b", "c"}; |
| Tableaux associatifs (dictionnaires) | configuration = { 'menu': 'gauche', 'langue': 'fr' } ... valeur = configuration['langue'] | var configuration = { 'menu' : 'gauche', 'langue': 'fr' }; ... valeur = configuration['langue']; | $configuration = [ 'menu' => 'gauche', 'langue' => 'fr', ]; ... $valeur = $configuration['langue'] | Dictionary |
| Vérifier si une valeur fait partie d'une liste de valeurs | if i in (3, 6, 9): ... | |||
| Conditions | if nom == 'Annie': ... elif nom == 'Toto': ... else: ... Note : l'indentation (4 espaces) est importante : c'est elle qui indique quand un bloc d'instruction se termine. | if (nom == 'Annie') { ... } else if (nom == 'Toto') { ... } else { ... } | if ($nom == 'Annie') { ... } elseif ($nom == 'Toto') { ... } else { ... } | if (nom == "Annie) { ... } else if (nom == "Toto") { ... } else { ... } |
| Boucles while | while x < 10: ... | while (x < 10) | while (x < 10) | while (x < 10) |
| Boucles sur un nombre déterminé d'itérations | for i in range(10): ... La boucle pourrait commencer à une autre valeur que 0, il est possible de spécifier le départ, la fin (exclue de la boucle) et la valeur du saut : for i in range(1, 10, 1) ... | for (i = 0; i < 10; i++) | for ($i = 0; $i < 10; $i++) | for (i = 0; i < 10; i++) |
| Boucles sur les éléments d'un tableau | valeurs = ['a', 'b', 'c'] for valeur in valeurs: ... | var valeurs = ['a', 'b', 'c']; for (var valeur in valeurs) | $valeurs = ['a', 'b', 'c']; foreach ($valeurs as $valeur) | string[] valeurs = {"a", "b", "c"}; foreach (int valeur in valeurs) { ... } |
| Opérateur ternaire (inline if) | valeur_si_vrai if condition else valeur_si_faux Remarquez que l'ordre des opérandes est différent des autres langages. Ex : majeur = True if age >= 18 else False | condition ? valeurSiVrai : valeurSiFaux | condition ? valeurSiVrai : valeurSiFaux | condition ? valeurSiVrai : valeurSiFaux |
| Exceptions | try: ... except TypeException as e: ... # traitement d'une exception précise except Exception as e: ... # traitement des autres exceptions else: ... # traitement si pas d'exception finally: ... # traitement si exception ou non | try { ... } catch (e) { if (e instanceof TypeException) { ... // traitement d'une exception précise } else { ... // traitement des autres exceptions } } finally { ... // traitement si exception ou non } | try { ... } catch (TypeException $e) { ... // traitement d'une exception précise } catch (Throwable $e) { ... // traitement des autres exceptions si PHP 7 } catch (Exception $e) { ... // traitement des autres exceptions si PHP 5.X } finally { ... // traitement si exception ou non } | try { ... } catch (TypeException) { ... // traitement d'une exception précise } catch (Exception e) { ... // traitement des autres exceptions } finally { ... // traitement si exception ou non } |
| Commentaires | # | // /* ... */ | # // /* ... */ | // /* ... */ |
| Commentaires de documentation | Cette documentation d'appelle Docstring. def ma_fonction(parametre): """Résumé de la fonction sous forme impérative. Autres paragraphes pour documenter les paramètres et la valeur de retour. """ ... | Résumé" _wzxhzdk:86_Description="Description" _wzxhzdk:88_Description=" |
Cette documentation s'appelle phpDocumentor. /** * Résumé de la fonction. * * @param int $parametre Description du paramètre. * * @author Annie Gagnon anniegagnon@gmail.com * @return int Description de la valeur de retour. * */ function maFonction(int $parametre) : int | /// |
| Constante pour changement de ligne qui vaudra '\n' (systèmes Unix comme Linux et Mac) ou '\r\n' (Windows) | os.linesep | PHP_EOL | Environment.NewLine | |
| Valeur nulle | variable = None | let variable = null; | $variable = NULL; | string variable = null; |
| Python | JavaScript | PHP | C# |
Pour compléter ce tableau, voici quelques normes de programmation généralement appliquées dans différents langages.
| Python | JavaScript | PHP | C# | |
|---|---|---|---|---|
| Projets | Il n'y a pas de convention officielle pour le nom du projet. Voici ce que je vous suggère : touteenminuscules ou casse_serpent Sous PyCharm, puisque l'environnement de développenent est copié pour chacun des projets, je vous suggère de regrouper dans un même projet tous vos exercices qui utilisent une même base de données. Ceux qui n'utilisent aucune BD pourront être placés par exemple dans un projet console_sans_bd et dans un autre projet graphique_sans_bd. | |||
| Espaces de noms | toutenminuscules | |||
| Fichiers | toutenminuscules ou casse_serpent | toutenminuscules ou minuscules-avec-traits-d-union | Dépend du framework utilisé | |
| Noms de variables | casse_serpent | casseChameau | Le guide officiel précise qu'aucune recommandation n'est faite pour le nom des variables. Cependant, la casseChameau est la plus utilisée. Les variables débutent obligatoirement par un $. | casseChameau |
| Noms de classes | CassePascal | CassePascal | CassePascal | CassePascal |
| Noms de fonctions | casse_serpent | casseChameau | casseChameau | CassePascal |
| Noms de constantes | MAJUSCULES_AVEC_CASSE_SERPENT | MAJUSCULES_AVEC_CASSE_SERPENT | MAJUSCULES_AVEC_CASSE_SERPENT | CassePascal |
| Python | JavaScript | PHP | C# |
Pour plus d'information¶
« Python 3.6.4 documentation ». Python. https://docs.python.org/3.6/index.html
« Learning Python: From Zero to Hero ». Medium. https://medium.freecodecamp.org/learning-python-from-zero-to-hero-120ea540b567
« PEP 8 -- Style Guide for Python Code ». Python. https://www.python.org/dev/peps/pep-0008/
« PEP257: Good Python docstrings by example ». Dolph Mathews. http://blog.dolphm.com/pep257-good-python-docstrings-by-example/