Ce document est disponible en fichier html statique (ni exécutable, ni modifiable) et en ipynb (à ouvrir avec Jupyter, par exemple ici : https://try.jupyter.org/).
Présentation de Python, de l’esprit qui l’habite.
Travail autour de la suite de Syracuse, écriture d’un programme qui :
Présentation des modules utiles au lycée à partir de ces documents.
En 1991 Guido van Rossum, un universitaire hollandais, crée Python un langage alors assez nouveau et assez différent des C, C++, C#, Java, PHP... même s’il y a bien plus étrange encore, comme Forth, Haskell, Lisp... (voir un joli diagramme sur l’histoire des principaux langages de programmation ou voir esolangs.org pour des langages aussi fous les uns que les autres).
Conçu pour l’industrie, pour que les programmeurs soient productifs (donc pas pour l’enseignement), c’est un langage vaste. Il a des côtés que l’on qualifiera de simplets et d’autres de rusés.
Un exemple de code « rusé » :
[x**2 for x in range(10) if not x%2]
…proche de la notation mathématique $\left\{x^2; x \in \left[\left[0, 9\right]\right]~\text{tel que}~x~\text{est impair} \right\}$.
Les pythonistas codent en suivant certains principes, décrits dans le PEP 20, dont voici un extrait :
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Complex is better than complicated.
- Flat is better than nested.
- Sparse is better than dense.
- Readability counts.
- Special cases aren't special enough to break the rules.
- Although practicality beats purity. ...
La traduction (tirée de cette page) :
- Le beau est préférable au laid.
- L'explicite est préférable à l'implicite.
- Le simple est préférable au complexe.
- Le complexe est préférable au compliqué.
- Le plat est préférable à l'imbriqué.
Moins littéralement, du code trop imbriqué (par exemple une boucle imbriquée dans une boucle imbriquée dans une boucle…) est plus difficile à lire.- L'aéré est préférable au compact.
- La lisibilité compte.
- Les cas particuliers ne sont pas suffisamment particuliers pour casser la règle.
- Même si l'aspect pratique doit prendre le pas sur la pureté.
Moins littéralement, il est difficile de faire un code à la fois [« pratique »] et « pur ».- …
On peut même aller jusqu’à dire qu’il y a une sorte de mystique de la programmation Python.
Au niveau de la forme, c’est le PEP 8.
On peut dire aussi que Python est impératif, orienté objet, et un peu fonctionnel. Il n’est cependant pas concatenatif.
C’est ce langage que l’inspection générale a choisi dans le double but :
Cependant, difficile de concilier la pythonicité et l’algorithmique de niveau lycée.
Quelques idées pour travailler avec Python:
>>>
) ou de rédiger des programmes pour les exécuter ensuite.Un cadre qui suit l’indication In [X]
est un échantillon de code Python. La « valeur » de cet échantillon après exécution est indiquée par Out[X]
. Parfois, un échantillon n’aura pas de valeur, mais déclenchera un affichage.
# le dièse indique que la fin de la ligne n'est pas interprétée (commentaire)
# penser à laisser une espace après #, c'est plus lisible
42 # un nombre
print(42) # l'affichage d'un nombre (pas de Out)
42.666 # . est le séparateur décimal
.1 # le zéro est facultatif
# la virgule est le séparateur des valeurs d'un uplet (couple, triplet, quadruplet…)
# « tuple » en anglais
# parenthèses facultatives, un premier exemple de ruse dans Python
1, 42, 666
# Ne pas confondre les tuples avec les listes !
[1, 42, 666]
# liste à un élément
[42]
# tuple à un élément
42,
# sinon
(42)
1+2*3 # un exemple de calcul
# différents opérateurs pour la division
7/3, 7//3, 7%3
Attention aux nombres à virgule flottante !!!
Voir l’article Wikipedia correspondant et l’exemple 2 page 13 de ce poly.
Des modules existent pour travailler avec une précision exacte : decimal
et fractions
.
2**3, 10**1000 # puissances d'un nombre, ici on voit la précision arbitraire des entiers (tester 10**1000+0.1)
1 == 2, 1 != 2, 1 < 2, 1 > 2, 1 <= 2, 1 >= 2 # comparaisons de nombres
True and (False or not True) # booléens et opérateurs
"bonjour", 'salut', '', 'un guillemet double: "', "un guillemet simple: '", "" # les chaînes de caractères
"""Les triples guillemets (simples ' ou doubles "),
permettent de taper une chaîne de caractères
qui s’étend sur plusieurs lignes et/ou qui contient des guillemets."""
print("bonjour")
"un guillemet double: \"" # l’antislash est un caractère d’échappement
# la commande 'type' retourne des commandes qui peuvent convertir
type(0), type(0.1), type(True), type('du texte'), type(None)
int(0.5), float(0), bool(0.5), str(0.5)
type(0)(1234.5)
# La conversion en booléen permet de comprendre comment seront interprétés certains tests
[bool(x) for x in [0, 0.1, '', '0', None, [0]]]
L’affectation se déroule en trois temps :
=
;=
.x = 1 # rien ne s’affiche, rien n’est retourné
x = 1
print(x)
x = x + 1 # n’a pas le même sens qu’en maths ! MicroAlg peut aider ici.
print(x)
x += 1 # raccourci pour l’incrémentation, peu explicite
print(x)
Avec Python l’affectation peut travailler sur plusieurs variables en même temps :
x, y = 42, 666 # ne pas oublier que ce sont des tuples
print(x)
print(y)
Encore plus fort, les sous-structures sont respectées :
(x, [a, b], y, l) = [1, (2, 3), 4, (5, 6, 7)]
print(a)
print(b)
print(x)
print(y)
print(l)
Ce genre de possibilité ruine notre exercice classique de l’échange des valeurs de deux variables.
a, b = 42, 666
print(a,b) # notez l’affichage de deux valeurs (voir la doc de print)
a, b = b, a
print(a,b)
L’affectation est souple : pas besoin de déclaration préalable, pas besoin de respecter le type :
x = 1
print(x)
x = "bonjour"
print(x)
Mais les variables sont tout de même typées :
x, y = 1, "bonjour"
# x + y # déclenche l’erreur TypeError: unsupported operand type(s) for +: 'int' and 'str'
C’est hors programme pour nos élèves, mais important pour comprendre le sens du point.
Avec Python, toutes les valeurs sont des objets (alors qu’avec Java, certains types sont dits primitifs, comme les entiers).
Un objet possède :
C’est une façon décentralisée d’organiser le code d’un gros programme. Les valeurs sont en quelque sorte responsables de leur devenir.
Les attributs et méthodes sont prédéfinis pour les types de valeurs rencontrées ici, mais vous pourriez créer vos objets, voire vos modèles d’objets.
class chat: "Ceci est un chat !" # un nouveau type d’objet: chat
c = chat() # c est une variable de type chat
c.nom = "Niny" # attribut (valeur de type chaîne de caractères)
c.cri = lambda : print("miaou") # méthode (lambda crée des commandes à la volée)
# utilisation
print(c)
print(type(c))
print(c.nom) # la notation «point» permet d’accéder à un attribut,
c.cri() # ou à une méthode.
def f(x):
return 2*x
print(f(3))
g = lambda x: 3*x
print(g(7))
Tous les objets de Python ont des attributs et méthodes spéciaux, préfixés et suffixés par un double underscore, donc de la forme __truc__
.
x = 1
print(x.__doc__)
print(c.__doc__)
help(c) # demande d’aide sur l’objet
dir(c) # demande de la liste des attributs et méthodes
À vous d’explorer les types principaux à coups de help(1)
, dir(str)
, ou toute autre combinaison de help
, dir
appelée avec une valeur ou un type.
Pour illustrer la malléabilité du langage, sachez qu’il est possible avec Python de donner du sens à la somme de deux chats, en définissant la méthode __add__
pour nos chat
s.
Les modules sont des objets qui sont chargés dans le langage à la demande, au cours de l’exécution du programme (généralement au début).
# print(math) # déclenche l’erreur NameError: name 'math' is not defined
import math
print(math)
help(math)
Une fois chargé, le module peut être utilisé, ou plutôt ses attributs ou méthodes peuvent être utilisés :
import math
math.pi, math.sqrt(2)
La commande import
est multiforme et permet de se passer de la notation « point », d’importer au copmte-gouttes, ou de renommer un attribut ou une méthode.
from math import cos # il suffira de taper cos(angle) plutôt que math.cos(angle)
from math import sqrt as racine # on pourra taper racine(2) au lieu de math.sqrt(2)
from math import * # évite d’utiliser math. pour tous les attributs et méthodes de math (déconseillé)
Les modules disponibles dans la bibliothèque standard (c’est-à-dire qui ne nécessitent pas d’installation supplémentaire) sont listés ici. Citons math
, random
, decimal
, fractions
, cmaths
, turtle
, tkinter
.