Académique Documents
Professionnel Documents
Culture Documents
Chapitre1 9oct
Chapitre1 9oct
1 Types de base
Les types les plus simples que l'on peut utiliser et manipuler sont :
Opération Notation
In [ ]: 3*6 # Multiplication
In [ ]: (8-2)*5
In [ ]: 2**5 # exposant
1 of 21
Expressions booleenes : sont formées par
Opération Notation
Logique and,or,not()
In [ ]: 1<=2
In [ ]: 0==-1
In [ ]: 3>1 or 12==5
In [ ]: not(1==-1)
1.2 Variables
Une variable est un identifiant d'un emplacement mémoire dans lequel on stocke une valeur.
• Toute variable est crée à partir du moment où elle est affectée par l'opérateur d'assignation = (à ne pas
confondre avec == ). Son type est automatique sans le besoin de le préciser : typage dynamique.
• Le nom de la variable est toujours à gauche de l'opérateur = .
• Le nom de la variable doit toujours commencer par une lettre majuscule ou minuscule et peut être combinaison de
lettre et de chiffres sauf les caractères spéciaux, comme *,&,#,espace, ...
Par exemple a3X est valide, mais 0a3# non valide
In [ ]: # le casting automatique
x=2 # int
y=1.5 # float
z=x+y # x --> float --> z est float
print(z)
type(z)
2 of 21
In [ ]: print(z)
In [ ]: (1+z**2)/(2-z.conjugate())
In [ ]: print(z,y)
z*y #operation sur complexes
In [ ]: x,y,z=2,"python genial",'a'
print(x,y,z)
In [ ]: print(n)
In [ ]: n+3 # erreur
In [ ]: # ou bien directement :
n=int(input("donner un nombre entier : "))
In [ ]: type(n)
In [ ]: n-3
2 Objets itérables
Ce sont des objets regroupant plusieurs éléments :
• les chaines,
• les listes,
• les tuples,
• les ensembles,
• les dictionnaires.
In [ ]: a='Ali'
b="a un"
c="ordinateur"
In [ ]: d=a+b+c
print(d) # cancatenation de chaînes
In [ ]: d[2:8]
In [ ]: ch="ma chaine"
In [ ]: x=[-1,3,0.5,'ok',-5,3]
In [ ]: print(x)
In [ ]: type(x)
In [ ]: x[3]
In [ ]: print(x[-2],x[-5])
In [ ]: x[2]
In [ ]: print(x)
In [ ]: print(x[2][1])
• len(ls) : une fonction utile qui renvoie le nombre d'éléments d'une liste ls
4 of 21
In [ ]: x[2][1] #element d'indice 1 du 2eme element de x : récursivité
• range(...) : constructeur d'un objet appelé intervalle formé d'entiers selon une progression arithmétique. cet objet
est souvent employé dans l'instruction for (voir chapitre 2)
• Pour récuperer la liste des éléments de range , on applique la fonction list( ) à l'objet range.
In [ ]: list(a)
In [ ]: list(range(-4,4))
In [ ]: x=[-6,5,4,'xy',-34]
In [ ]: print(x)
In [ ]: l=[-3,4,6]
print(l+x) #cancaténation
print(l) # l non modifiée
In [ ]: l=[-3,4,6]
l.extend(x) # etendre l à la fin
print(l)
Slicing : On peut accéder aux objets itérables comme les listes par tranches (slices en anglais)
In [ ]: ls=[4,6,3,'a',-1,3,12.5,'hello']
ls[1:6] # sous-liste d'éléments à partir de l'indice 1 à 5
5 of 21
In [ ]: # Plus généralement :
# extraire une tranche d'une liste t : t[start:stop:step] (stop exclu)
t=list(range(4,70,2))
print(t)
t[5:30:4]
In [ ]: print(t)
Copie de listes : l'opération assignation entre deux objets listes n'est pas une copie
In [ ]: i=-2
j=i # copie de variables simples
print('i = ',i,'et j = ',j)
j=2
print('i = ',i,'et j = ',j) # j modifiée, i inchangée
Remarque : cette méthode ne marche qu'au premier niveau : si on a des listes imbriquées, il faut faire appel à la
fonction deepcopy du module copy (voir notion de modules et fonctions d'un module plus loin)
2.3 Tuples
_2/10/2023_
Collection ordonnée non modifiable d'éléments hétérogènes délimités par des virgules et emballés (non
nécessairement) par des parenthèses : (elem1,elem2,...) .
Ce type de données admet les mêmes méthodes que les listes à l'exception de celles de modification.
In [ ]: # attention erreur
x+5
6 of 21
In [ ]: #On peut former un tuple d'un seul élément comme suit :
t=(5,) # pour ne pas confondre avec une donnée de type simple
print(t)
x+t # fonctionne
Remarque.
• On peut transformer n'importe quelle liste en tuple par la fonction tuple( ) (et vice-versa par list( ))
• Les tuples sont moins flexibles que les listes à cause de l'immutabilité. Leur intérêt réside dans le fait qu'ils
occupent moins d'espace mémoire que les listes.
In [ ]: x=[1,"z",-5,2]
y=tuple(x)
print(y)
z=list((3,-5,"foo"))
print(z)
In [ ]: lst=list(range(-5,10,2))
print(lst)
en=enumerate(lst)
print(en)
'''
remarquer que en n'est pas en fait une liste
Pour le transformer en liste de couples (indice,valeur)
il faut appliquer le constructeur list()
'''
list(en) # start par defaut =0
2.4 Ensembles
Collection non ordonnée modifiable d'éléments hétérogènes uniques emboitée entre accolades {elem1,elem2,
... } .
Interêt : effectuer des opérations sur ces objets propres aux ensembles au sens mathématique (intersection, union, ...)
In [ ]: E1={'a','b'}
E1
In [ ]: E2={15,'b','c'}
In [ ]: E4=E1 | E2 # union
E4
In [ ]: s.add(6)
s
D'autres opérations peuvent être effectuées sur les ensembles (voir help('set') )
In [ ]: help('set')
7 of 21
2.5 Dictionnaires
Les dictionnaires sont des objets pratiques lorsq'on veut manipuler des structures complexes que les listes ou les
tuples présentent des limites.
Un dictionnaire est une collection non ordonnés d'objets modifiables (comme les listes), mais indexés par clé au lieu
de la position. La forme des dictionnaires est :
{cle1:valeur1,cle2:valeur2,...}
Les clés doivent être uniques : deux éléments ne doivent pas partager la même clé.
In [ ]: #Exemple :
animal1={"nom":"girafe","taille":5.0,"poids":1100}
print(animal1)
print(voiture)
In [ ]: print(animal1['poids'])
In [ ]: voiture['hauteur']=1.70
print(voiture)
del voiture['clim']
print(voiture)
In [ ]: voiture.keys()
In [ ]: voiture.values()
Exercice 1.1
Exercice 1.2
Exercice 1.3 Etant donné une liste L de nombres (éventuelement dupliqués), écrire des instructions utilisant les
ensembles et les listes pour obtenir le second nombre le plus élevé (on pourrait utiliser la méthode sort() des
listes. Par exemple si L=[10, 20, 54.36,2.5, 54.36, -45, 54.36, 25, 99, 99] , l'exécution donne :
8 of 21
Exercice 1.4
1. Définir le dictionnaire
d = {
'etudiant':'Rizki Ayoub',
'topologie': 11, 'algebre': 9.5,
'calcul differentiel': 9,
'integration':8,
'Info': 12} .
2. En utilisant uniquement la fonction list et la méthode values des dictionnaires, calculer la moyenne des
notes obtenues de la valeur de la cle 'etudiant' pour afficher le message :
la moyenne de Rizki Ayoub est : ...
5. Programmation
Les instructions de programmation est l'ensemble des commandes et expressions qui permettent de contrôler le flux
de l'exécution d'un algorithme. A partir du moment où la liste des instructions pour une tâche donnée s'allonge, le
mode interactif n'est pas adapté. nous allons utiliser un éditeur de texte, de préférence en environnement intégré
comme idle (sous Linux), ou spyder (sous anaconda,Linux ou Windows) pour rédiger ce qu'on appelle les scripts et
les modules (voir plus loin les définitions plus précises). Un fichier d'instructions est un fichier texte ASCII nommé
avec l'extenstion .py.
• sous Linux idle à partir du menu Applications ou bien dans un Terminal système.
• sous Windows, anaconda puis spyder.
• familiarisez-vous avec l'environnement de votre choix.
Chaque environnement contient au moins un interpréteur python, un éditeur intélligent intégré et ses propres
fonctionnalités de développement.
L'environnement le plus léger que l'on va utiliser le plus souvent en salle est idle. Quelques démo sont présentées
pendant les séances de TP.
• Python comme d'autres langages permet d'automatiser des tâches plus compliqées à l'aide des instructions de
contrôle.
Pour Python : dans un même bloc, deux instructions de même profondeur logique doivent avoir strictement la même
indentation.
9 of 21
instruction_1
...
instruction_N
en-tete1: # bloc 1
instruction
...
instruction
en-tete2: # autre bloc dans bloc 1
ici
et ici
...
ici # retour au bloc 1
...
instruction # retour au niveau avant bloc 1
Opérateur Action
x==y égalité
x in y x appartient à y : chaine,liste,tuple,...
On peut former des expressions booléennes plus complexes à l'aide les opérateurs de logique : and,or,not
if a <b:
print('a plus petit que b ')
else:
print('a plus grand que b ')
10 of 21
Plus généralement :
if condition1:
bloc_instructions
elif condition2:
bloc_instructions
.
.
.
elif conditionN:
bloc_instructions
else:
bloc_instructions
• for : l'instruction for est adaptée pour parcourir n'importe quelle séquence (par ex. une liste ou une chaîne), dans
l'ordre où ils apparaissent dans la séquence.
In [ ]: for i in range(1,11):
print(i**2,end=' ') # remarquer l'option end de print
In [ ]: '''
On veut construire une liste
contenant les cubes des entiers entre 1 et 30.
'''
# Première manière :
l1=[] # initialiser liste vide
for j in range(1,31):
l1.append(j**3)
print(l1)
• while : L'instruction while est une itération plus générale. Elle exécute le bloc indenté tant que la condition de test
est réalisée.
11 of 21
while condition:
bloc_instructions
In [ ]: a=10
while a>0.1:
print(a)
a=a/5
Rupture de boucle :
• break : interrompre
• continue : court-circuiter
bloc_boucle
.
.
.
break #interruption de boucle
...
continue # passer au tour suivant
forme plus générale : les boucles for ou while peuvent posséder une clause else, c.a.d. ne s'exécute que si la boucle
se termine normalement (sans interruption)
for i in sequence:
if i == cible:
sauve = i
break # voici l’interruption
In [ ]: for x in range(1,8):
y=(x**2-4)/(x-2)
print(y)
# produit erreur lorsque x=2 et l'exécution s'arrête
In [ ]: for x in range(1,8):
try:
y=(x**2-4)/(x-2)
print(y) # cas normal
except:
print(4) # gere l'exception en x=2
12 of 21
Pour des informations plus complète sur la gestion des erreurs, consulter la doc à ce sujet.
9/10/2023
Exercice 1.5
(2n − 3)2
La suite (un )n ∈ N, n ≥ 1 définie par un = et k est un entier donné.
(n + 1)2
1. Pour un nombre k non nul saisi au clavier, afficher u0 , u1 , ⋯ , uk . Faire plusieurs essais :
k = 10, 20, 40, 100, 1000, 10⁴. Que peut-on dire ?
2. Ecrire quelques quelques instructions pour afficher le couple (n0 , un0 ), où n0 est le plus petit entier tel que pour
un nombre réel ϵ > 0 donné au clavier, on a 4 − un0 < ϵ. Tester pour ϵ = 10−3 , ϵ = 10−5 . Conclure.
Exercice 1.6
Soit la liste Ls=[-3,5,-6,14,-2,5,3,-11] . On veut réaliser ce qui suit :
idication : effectuer une double boucle sur ls et remplir au fur et a mesure une liste Lc de couples trouvés .
• Elle renvoie (ou retourne) éventuellement un ou plusieurs résultats au code appelant, appelés paramètres de
sortie.
"""
Documentation de la fonction (docstrings)
"""
Caractéristiques:
• Permet d'encapsuler des instructions afin de les réutiliser sans la nécessité de les réécrire.
• Découpe une tâche en morceaux aux spécifications bien précises. Ce qui rend le code plus lisible et plus facile à
maintenir.
13 of 21
In [ ]: #Exemple
def som(a,b):
s=a+b
return(s) # <-- retour de résultat
• le nom commence toujours par une lettre et peut contenir des chiffres
Attention! : il est interdit d'utiliser les caractères spéciaux : #,&,@,..
• Par convention de lisibilité, on commence le nom par une lettre miniscule et composer avec des majuscules et
(ou) des chiffres. Par ex. triBulle
• Le nom est sensible à la casse : Par ex. python reconnait print() et non Print() .
• On appelle la fonction dans un code appelant en mentionnant son nom exacte et en lui trasmettant les paramètres
effectifs dans le même ordre que la définition : nomFonction(paramètres effectifs) .
• La transmission des paramètres effectifs au moment de l'appel se fait par valeur (ou copie des valeurs effectives
vers les paramètres formels).
• Quand les paramètres occupent plus de place mémoire (liste,dictionnaire, ...), la transmission se fait par réference
: copie des adresses des paramètres effectifs dans les paramètres formels.
Remarque importante :
In [ ]: def som2(a,b):
s=a+b
return(s)
In [ ]: x=som2(5,-7)
print(x) # None est une primitive interne qui n'a pas de type
x-1
Remarque importante: l'objet None renvoyé par le code précédent est une primitive interne qui n'a aucun type de
stockage. C'est souvent la source de plusieurs erreurs de traitements dans Python
In [ ]: def som3(a,b):
s=a+b
s1=a+2*b
s1=a+2*b
return(s1)
x=som3(5,-7)
print(x)
print(x-1)
14 of 21
In [ ]: def somProd(a,b):
s=a+b
p=a*b
return(s,p) # retour de résultat multiple
#test
r,s=4,8
somProd(r,s) # copie de r,s dans a,b
print(t,u)
In [ ]: # ou bien
v=somProd(r,s) # ici v est automatiquement un tuple
print(v)
print(v[0])
print(v[1])
Remarques :
In [ ]: #argument fonction
def f1(x):
return x+1
def g(func,t):
s=func(t**3)
return(s)
In [ ]: g(f1,-3)
Une fonction peut admettre des paramètres obligatoires (oupositionnels) à fournir au moment de l'appel et d'autres par
défaut (ou optionnels) : non nécessaires à l'appel.
In [ ]: def diff(a,b):
c=a-b
return(c)
In [ ]: diff(3,5)
Les paramètres optionnels sont spécifiés par mots clefs dans l'entête et doivent être placés après les paramètres
obligatoires dans la définition de la fonction.
In [ ]: def myfunc(m,n,r="science"):
# m,n obligatoires,r optionnel
return([m,n,r])
In [ ]: myfunc(5,4,4.5)
In [ ]: myfunc(5,4,3)
15 of 21
In [ ]: myfunc([3,4,7],('3',[3,12]))
Si on veut appeler dans un ordre différent il faut expliciter le mot cle au moment de l'appel :
In [ ]: def somme(*args):
resu=0
for nombre in args:
resu=resu+nombre
return(resu)
print(somme(23))
print(somme(2,3,-8))
print(somme(1,-2,4,5,'e'))
Expression lambda : c'est une fonction anonyme (sans nom) formée par le mot clef lambda et d'instructions
simples en une seule ligne. C'est une construction utile dans certaines situations. La syntaxe est :
print(l)
Une autre manière plus compacte sans structure de boucle est l'utilisation d'une fonction lambda avec la fonction
map(fonction,sequence) qui distribue une fonction sur une séquence :
Portée des variables : il existe dans python des variables à portée globale et des variables à portée locale.
• Par exemple toute variable définie dans une fonction n’est accessible que par la fonction elle-même. On parle de
variable locale.
• Une variable définie à l'extérieur de la fonction est visible par la fonction, mais ne peut pas a la modifier. C'est une
variable globale.
• La modication d'une variable globale par une fonction s'effectue si on mentionne la directive global dans la
définition.
16 of 21
In [ ]: def mask(a):
b=a+1 #b locale
a=a-1 #a modife localement
print("a = ",a,"b = ",b)
a=4
b=-3
mask(a)
print("a = ",a)
print("b = ",b)
Si on veut qu'une fonction modifie une variable définie en dehors de sa portée, il faut déclarer celle-ci dans la fonction
à l'aide du mot cle global
In [ ]: def maskbis(a):
global b #permet de modifier le b global
b=a+1
maskbis(a)
print("b = ",b)
Récursivité : une fonction récursive est une fonction qui peut appeler elle même. Par exemple, considérons la suite
u1 = 4.0, un+1 = (un + 3)/2 qui converge vers 3. On peut la définir comme suit :
In [ ]: def f(n):
if n==1: return(4.)
y=(3+f(n-1))/2
return(y)
Docstrings: les docstrings sont les commentaires qui expliquent la tâche de la fonction placés entre l'en-tête et le
début des instrunctions. Ces informations sont visibles au niveau de l'interpréteur par la commande help() .
In [ ]: def somDiff(x,y):
"""
fournit la somme et la difference
de 2 nombres arbitraires
return(s,d)
In [ ]: help(somDiff)
17 of 21
Exercice 1.7
1. Programmer de manière recursive une fonction facto (n) qui renvoie la valeur n!. On tient compte de la
convention 0! = 1 et on doit tester si on transmet un entier n ≥ 0. Dans le cas contraire, la fonction affiche le
message suivant :
erreur : votre nombre n'est pas valide! Donner un entier >=0 . Tester sur
n = −1, n = 0, n = 6.
x3 x5 x2k−1
sin(x) ≈ x − + + ⋯ + (−1)(k−1) , k≥1 (⋆)
3! 5! (2k − 1)!
2. Définir une fonction appsin(x,k) , d'arguments un nombre x et un entier optionnel par défaut k = 6 et qui
renvoie l'approximation (⋆).
3. Ecrire les instructions pour lire x, k au clavier et affiche l'approximation correspondante. Calculer en particulier
une approximation de sin(π/2), puis sin(π/6) (on pourrait prendre 3.1416 comme valeur approchée de π).
4. Reprogrammer une autre version de la fonction appsin2 qui nous fornit l'approximation (⋆) sans faire intervenir
la fonction facto . Retester pour les mêmes données que la question précédente et comparer.
DATE = 16102021
Pour accéder aux fonctions d’un module existant, il faut utiliser la commande import . Différentes manières pour
charger un module :
18 of 21
• Méthode 1:
import nomModule # la plus recommandée
met les fonctions du module disponibles. Toute fonction ou objet fct dans module est alors accessibles via
nomModule.fct : fonction préfixée par le module. On peut même charger plusieurs modules en un seul import
: import nomModule1,nomModule2, ...
In [ ]: import messages
print(messages.DATE)
a=messages.bonjour("Khalid")
b=messages.phone("0665473812")
c=messages.logiciel("spyder")
print(a)
print(b)
print(c)
Docstrings : explications de ce que fait le module et comment utiliser chaque fonction. Ce sont des commentaires au
début du module et chaque fonction encadrés par des triples guillemets :
In [ ]: help(messages)
In [ ]: help(messages.logiciel)
le concept d'espace de nom (namespace) est le périmètre dans lequel un nom de variable, fonction, module, ... est
visible et utilsable.
• espace de noms global : contient tous les noms globaux visibles lorsqu'on charge l'interpréteur ou un programme
python.
• espaces de noms locaux : créés lors d'appels de fonctions (espace propre à chaque fonction ou module). Par
exemple les variables locales dans le corps dune fonction n’existent qu’au niveau de son espace de noms.
la fonction dir() permet de lister les objets de l'espace de noms courant. Si on met dir(objet) , on liste les
attributs de l'objet spécifié.
Exemple. : Pour connaitre les noms des objets définies dans le module on fait :
dir(nomModule)
In [ ]: math.sqrt(math.pi)
# Les fonctionnalités sont disponibles sous le suffixe 'math'
• Méthode 2:
from nomModule import fct1,fct2, ...
on ne souhaite l’accès qu’aux objets z1, z2... spécifiées, lesquels sont accessibles directement sans les
préfixer par module.
19 of 21
In [ ]: from math import sqrt, pi # importe uniquement 'sqrt','pi'
print(sqrt(pi))
In [ ]: '''
Attention : on ne fait pas ici dir(math),
mais dir() pour s'appercevoir que les noms sqrt,pi
sont visibles dans le namespace global :
on a utilisé ces noms sans préfixer par math
'''
• Méthode 3:
from nomModule import * # non recommandée
accès direct à l’ensemble des objets du module indiqué sans devoir les préfixer par le nom du module. Par
exemple : from math import * : tous les noms contenus dans math sont disponibles sans préfixage.
Remarque. : cette méthode est déconseillée par les spécialistes à cause de risque de conflits entre les noms
identiques dans des des modules différents.
Consulter la documentation intégrée ou sur le web pour les quelques modules connus de la librairie standard suivants
:
Module domaine
math, cmath interface aux outils de la librairie mathématique standard, opérations sur nombres complexes
tkinter construction d’interfaces utilisateur graphiques (GUI) basé sur la librairie portable Tk
import sound.effects.echo
Nous verrons dans les prochains chapitres les exemples des packages, modules et fonctions de
numpy,scipy,matplotlib.
20 of 21
6.3 Les scripts
Un script est un fichier qui contient des instructions, des appels de fonctions, des imports de modules, de package . . .
etc. C’est en quelque sorte un programme principal destiné à être exécuté dans un interpreteur python. Ecrire le script
testMessages.py de test du module messages ci-dessus.
Exercice 1.8
Un entier x à n digits (x = a1 a2 ⋯ an ) est dit nombre d'Armstrong d'ordre n si x = an1 + an2 + ⋯ ann . Par exemple,
n
153 = 13 + 53 + 33 = 1 + 125 + 27 est un nombre d'Armstrong, mais 120 ne l'est pas car 13 + 23 + 03 = 9.
L’objectif de cet exercice est le développement d’un module Amstrong.py qui detecte et comptabilise les nombres
entiers d'Amstrong dans un sou-ensemble de N. Les tests seront effectués dans un script nommé
test_Amstrong.py .
1. Ecrire dans Amstrong.py une fonction lstChiffres(x) qui retourne la liste constituée des chiffres dans
lécriture de x supposé entier. Pour le réaliser, utiliser convenablement les fonction str et int . Tester sur
x=35823065 qui donne [3,5,8,2,3,0,6,5] .
2. Ecrire une fonction isArmstrong(x) qui retourne la constante logique True si x est un nombre
d'Amstrong, False sinon. Tester sur x=153 et x=1253 .
3. Ecrire une fonction listeArmstrong(K) qui construit et retourne la liste des nombres d'Armstrong qui sont
≤ K pour un entier K donné.
Tester pour K = 5000.
Exercice 1.9
On exige dans ce problème les imports de modules avec prefixage.
Python contient un module nommé random qui contient des fonctions de génération de nombres aléatoires.
• lance(N) une fonction qui renvoie une liste de longueur N qui simule le lancé N fois.
• simule(N,k) une fonction qui simule le lancé N fois pour obtenir la face k, c.a.d. la fonction renvoie le
nombre de fois de face k obtenue après la simulation.
Tester les fonctions dans un script testDe.py où on lit N, k au clavier et on affiche la simulation.
21 of 21