Polycopie MIP Informatique2 2024
Polycopie MIP Informatique2 2024
Polycopie MIP Informatique2 2024
Algorithmique 2 / Python
FILIERE MIP – SEMESTRE 2
Connaissances
2. Récursivité :
3. Enregistrements et fichiers.
n Savoir manipuler des fichiers en Python pour lire, écrire et modifier des données.
n Être capable de stocker et de récupérer des données structurées dans des fichiers.
4. La complexité :
5. Preuves d'algorithmes :
Un algorithme peut aussi être représenté sous forme graphique, on parle d'organigramme.
Un programme informatique (appelé aussi “application”) est une traduction de l'algorithme dans un
langage de programmation.
Langage machine
Assembleur 1950
Basic 1964
Pascal 1970
C 1973
C++ 1983
Python 1991
Java 1994
En 1989, Guido van Rossum écrit la première version du langage. Fan de la série télévisée Monty
Python's Flying Circus, il décide de baptiser ce projet Python. Il s'est principalement inspiré d'ABC,
par exemple pour l'indentation comme syntaxe ou les types de haut niveau mais aussi de Modula-
3 pour la gestion des exceptions, du langage C et des outils UNIX.
Durant l'année suivante, le langage commence à être adopté par l'équipe du projet Amoeba, Guido
poursuivant son développement. En février 1991, la première version publique, numérotée 0.9.0.
Il s’agit d’un langage objet, pseudo-interprété, portable, libre, ouvert, gratuit. De nombreuses
“bibliothèques” sont disponibles sur internet.
Python est utilisé dans des applications comme: moteur de recherche Google, Youtube, …
2.2.2 Utilisation
On peut créer et exécuter le langage python depuis :
n Depuis une fenêtre on lance le Shell Python en saisissant python (sous Windows) ou bien
python3 (sous Linux ou MacOS X).
n ou via les raccourcis clavier Ctrl-D sous Linux/MacOS X, ou Ctrl-Z sous Windows.
2.4.2 Spyder
On commence par le lancement de l’outil spyder soit à partir du menu de démarrage Windows ou à
partir de l’interface de la distribution Anaconda. Avec Spyder nous disposons d’une fenêtre pour
écrire le script puis on l’exécute en cliquant sur Exécution (ou F5), la fenêtre de droite contient la
sortie de notre script.
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
"""
Commentaire sur plusieurs lignes:
Éditeur de Spyder
Ceci est un script temporaire.
"""
2.5.2 Instructions composées
Une instruction composée est formée d’un bloc d’instructions. Un bloc d’instructions est formé
n suivi par un bloc d'instructions simples (ou elles-mêmes structurées) indentées par
rapport à cette instruction d'introduction. Voici sa structure :
instruction d'introduction :
instruction 1
……
instruction n
autre instruction
Remarque
Lorsqu'une instruction ouvre une expression avec une parenthèse ‘(‘ou une accolade ‘{‘ ou un
crochet ‘[‘, alors l'indentation est ignorée jusqu'à ce que le ‘)’ ou ‘}’ ou ‘]’ correspondant referme
l'expression.
2.5.2.1 Conditionnelle SI
Algorithme
si condition1 alors
instruction 1 (ou bloc d'instructions 1)
sinon si condition2 alors
instruction 2 (ou bloc d'instructions 2)
sinon
instruction 3 (ou bloc d'instructions 3)
fin si
Python
if condition1 :
bloc d'instructions 1
elif condition2 :
bloc d'instructions 2
else :
bloc d'instructions 3
· Si çè if
· Sinon si çè elif
· Sinon çè else
pour n de 1 à 10 faire
u = n*n
afficher(("Le carré de ", n , "est ",u)
fin pour
Python
for n in range(1,11):
u =n*n
print ("Le carré de ", n , "est ",u)
Python
n=int(input ("entrez un nombre strictement positif: "))
while n<0:
n=int(input ("Erreur, le nombre n'était pas strictement positif. Recommencez: "))
print ("La valeur de n est: ", n)
Python
n toujours exprimés en base 10, on utilise un «.» pour séparer la partie entière de la
partie décimale,
n On peut y insérer des séquences d'échappement introduites par un caractère \ suivi par un
autre caractère définissant la séquence,
n On peut aussi exprimer des littérales chaînes de caractères sur plusieurs lignes en utilisant au
début et à la fin trois guillemets doubles ou trois guillemets simples :
Variables a: Entier
a←1
Python
a=1
# SANS déclaration de son type. Lors de l'opération d'affectation, le langage associe à la
variable le type de la donnée qu'elle référence.
Remarque
Algorithme
Python
NB_MAX_ETUD = 110
PI = 3,14
Remarque
n New_Type(Var)
Lorsque la valeur affectée à la variable ne peut pas être convertie vers le type désiré, l’opération de
Cast ne sera pas autorisée:
n Le calcul mathématique,
n et bien d’autres.
Dans certains documentation d'algorithme cette fonction porte le nom de: afficher(msg).
La fonction Lire(var): affecte la valeur saisie au clavier par l’utilisateur à la variable var. Il s'agit d'une
interruption de l'algorithme. Par exemple:
n copie(ch,pos,n): retourne la copie d'une partie de la chaîne 'ch' à partir de la position 'pos' et
en limitant la recopie au nombre de caractères 'n'.
n Comp(ch1,ch2): compare les deux chaînes de caractères 'ch1' et 'ch2' par ordre
alphabétiques en utilisant le code ASCII de chaque caractère. Elle retourne:
Si comp(nom1,nom2)>0 alors
Ecrire(nom1)
n recherche(ch,caractère): retourne la première position du caractère dans la chaîne 'ch'
n https://docs.python.org/3/library/functions.html
n Toute conversion d’une variable d’un type en un autre est appelé casting en anglais.
Une liste est une collection ordonnée, similaire au tableau dans d’autres langages. Les éléments de la
liste sont déclarés entre deux crochets []
n integer_list=[1,2,3]
n string_list=["casa","rabat","tanger","paris"]
n heterogeneous_list=["string",0.1, True]
4.2.1.2 Initialisation
L’instruction L=[]: permet de créer une liste vide. On peut utiliser la fonction range() pour initialiser
une liste :
n List(range())
4.2.2 Tuples
Les tuples permettent tout comme les listes de stocker des éléments hétérogènes. On décrit un tuple
à l’aide de parenthèses ou sans rien
n my_tuple = (1,2)
n other_tuple = 3,4
Un tuple est une liste non modifiable (on dit aussi immutable) :
n (a,b) = (5.5 , 8)
Les tuples sont très utile pour échanger deux variables sans avoir à utiliser une variable
supplémentaire:
n (a,b) = (b,a)
n s={1,2,3,1} #s={1,2,3}
Attention l'instruction set={} ne déclare pas un ensemble vide. Nous avons la fonction set() qui
permet de déclarer un ensemble vide
n S=set()
n s.add(1) # s={1}
n s.add(2) # s={1, 2}
n s.add(2) # s={1, 2}
List[début:fin:pas]: cette fonction de slicing permet de récupérer et retourner tous les éléments qui
se trouvent entre le début et la fin avec un pas donné.
Remarque : la fonction de slicing retourne une nouvelle liste sans modifier la liste courante.
Python indexe les éléments de la liste au sens inverse avec des indices négatifs:
n etc.
Remarque : lorsque le pas est négatif le début (par défaut) de la liste et le dernier élément et la fin
(par défaut) de la liste et le premier élément.
n _,y,_=[1,2,3] #y=2
try:
x,y=[1,2,3]
except ValueError:
print ("Error")
On peut appliquer les deux fonctions sur une liste des nombres avec les considérations suivantes :
L’opérateur IN, dont la syntaxe est Elt In liste: Cherche l’existence d’un élément dans une liste, il
retourne Vrai si l’élément Elt existe dans la liste et Faux sinon.
1. La fonction EXTEND, dont la syntaxe est Liste1.extend(liste2), elle permet de concaténer les
deux listes dans liste1.
2. L'opérateur + : permet de concaténer les deux listes dans une nouvelle liste sans modifier les
deux listes concaténées :
La fonction INSERT, dont la syntaxe est Liste.insert(indice, élt) permet d’ajouter un élément à la ième
position dans la liste
La fonction POP, dont la syntaxe est L.pop() permet de dépiler et retourner le dernier élément de la
liste.
La fonction SORT est une fonction de l’objet Liste, dont la syntaxe est List.Sort(). Elle permet de trier
et modifier la liste courante.
La fonction SORTED est une fonction Python dont la syntaxe est List2=Sorted(list1). Elle permet de
trier et retourner une nouvelle liste.
Par défaut le tri est ascendant, Pour un tri descendant on utilise le paramètre REVERSE des fonctions
de tri : reverse=True. Par exemple :
n x.sort(reverse=True) #x=[9, 7, 5, 3, 2, 1]
n y=sorted(x, reverse=True)
Le paramètre KEY de ces deux fonctions de tri dont la syntaxe est key=Fct, consiste à appliquer la
fonction Fct sur les éléments de la liste avant de réaliser le tri. Par exemple :
Nous pouvons également passer l'objet map à la fonction de conversion list(), ou à un autre type de
séquence, pour convertir l’objet map à une nouvelle structure quelconque (liste par exemple).
La fonction filter permet de filtrer une liste en évaluant une condition (comme if), et elle renvoie un
objet filter (un itérable). On peut utiliser une fonction de conversion pour convertir l’objet filter à une
séquence, liste par exemple :
La fonction ENUMERATE dont la syntaxe est Enumerate(list) produit des tuples (index, élément).
Dans le cas où nous cherchons à récupérer uniquement l’index de l’élément, il suffit d’utiliser le
caractère tiret bas ‘_’ pour ignorer la valeur de l’élément retourné par la fonction enumerate :
Dans l’exemple suivant nous cherchons à retourner une liste de tuples, dont chaque tuple combine le
nom de la ville avec le nombre de sa population.
Afin de réaliser l’opération inverse, on peut aussi déballer une liste avec la même fonction ZIP en
ajoutant le caractère étoile ‘*’ avant la liste à déballer.
Voici la syntaxe: zip(*listeADeballer). Cette fonction de déballage retourne un objet zip itérable dont
les éléments représentent des tuples ou chaque tuple contient les éléments de l’une des listes
déballées.
De la même manière on peut convertir une liste à un dictionnaire (voir la section suivante) ou un set
Si vous n’avez pas besoin de récupérer les éléments de la liste mais juste sa taille, on utilise tiret bas
_
4.2.5 Dictionnaire
4.2.5.1 Définition
Un dictionnaire est une structure de données fondamentale qui associe des valeurs à des clés
déclarés entre accolades {}. Par exemple:
empty_dict={}
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
empty_dict2=dict()
grades={"Abdo":95, "Tom":80}
Les éléments d'un dictionnaire ne sont ni ordonnés ni indexés. On peut accéder à une valeur d’une
clé en utilisant des crochets dict[clé] comme dans les listes mais en remplaçant l’index par la clé.
Abdo_grade = grades["Abdo"]
Les clés sont uniques, par conséquent, lors de la récupération d’une valeur associée à une clé, une
Erreur de type KeyError sera déclenché si cette clé n’existe pas.
try:
jim_grade=grades["Jim"]
except KeyError:
print ("Key not exsist")
L’opérateur in permet de vérifier l’existence d’une clé dans un dictionnaire:
La fonction KEYS de l’objet Dict dont la syntaxe est Dict.keys() permet de récupérer toutes les clés du
dictionnaire dans un objet itérable de type dict_keys.
La fonction VALUES de l’objet Dict dont la syntaxe est Dict.values() permet de récupérer toutes les
valeurs du dictionnaire dans un objet itérable de type dict_values.
La fonction ITEMS de l’objet Dict dont la syntaxe est Dict.items() permet de récupérer les clés et les
valeurs en même temps se forme des tuples.
L’instruction d’accès aux éléments du dictionnaire Dict[key] retourne la valeur associe à la clé ou une
erreur si la clé n’existe pas.
Afin d’éviter ce message d’erreur lors de la manipulation du dictionnaire il est conseillé d’utiliser la
fonction GET dont la syntaxe est Dict.get(key,default). Cette fonction a le même comportement que
l’instruction d’avant mais elle retourne la valeur ‘default’ si la clé n’existe pas. La valeur par défaut
du paramètre ‘default’ est ‘None’.
La fonction FROMKEYS de l’objet Dict dont la syntaxe est dict.fromkeys(seq, value) permet de créer
un nouveau dictionnaire à partir d’une séquence (liste/tuple) de clés, avec ‘value’ comme valeur
associée à l’ensemble des clés (=none par défaut).
Dans l’exemple suivant on génère un dictionnaire avec autant d’éléments que la séquence liste où la
clé de chaque élément est une valeur de la liste LKeys et la valeur associée à chaque clé est ‘value’ (le
deuxième paramètre de cette fonction).
4.2.5.3 Opérateur IN
On peut utiliser « in » pour rechercher dans les différents éléments du dictionnaire.
4.2.5.4 Suppression
La fonction DEL de python dont la syntaxe est Del dict[key] permet de supprimer une entrée (un
élément du dictionnaire) en indiquant sa clé.
La fonction POP de l’objet dict dont la syntaxe est Dict.pop(key) permet de dépiler l’élément dont la
clé=key du dictionnaire. Elle retourne la valeur de la clé key.
La fonction COPY de l’objet dict dont la syntaxe est D.copy() permet de créer une copie
indépendante.
La fonction UPDATE de l’objet dict dont la syntaxe d1.update(d2) permet de fusionner les deux
dictionnaires dans d1.
def is_impair(n):
return n%2!=0
Solution
def is_impair(n):
return n%2!=0
Lentier=list(range(101))
Limpair=list(filter(is_impair,Lentier))
print(Limpair)
Ecrire un script python pour générer un dictionnaire ‘dictPV’ qui contient le pv des notes des
étudiants, avec :
· Key= tuple (nom, module)
· Value= none
Solution
Lmodule=['BI','IA','DS','Python']
Letud=["jamal","siham","serine","mourad"]
#création d'une liste comprehension avec deux boucle for:
l=[(x,y)
for x in Letud
for y in Lmodule ]
d={}
#dict.fromkeys(seq, value): créer un nouveau dictionnaire à partir d’une séquence
(liste/tuple) de clés,
#vec value comme valeur (=none par défaut)
d=d.fromkeys(l)
d
4.3 Fonctions d’entrées/sorties
4.3.1 Fonction de sortie: PRINT
4.3.1.1 Syntaxe
La fonction prédéfinie print() permet d'afficher à l'écran un contenu. Il s’agit d’une procédure car elle
ne retourne pas de résultat. Pour afficher un texte et une valeur d’une variable il suffit de les séparer
par une virgule ",".
Print(‘valeur de x = ’ , x)
La fonction print() affiche l’argument qu’on lui passe entre parenthèses et un retour à ligne.
n Si on ne veut pas afficher ce retour à la ligne, on peut modifier la valeur de l'attribut end:
Print() peut également afficher le contenu d’une variable quel que soit son type.
n Pour afficher le contenu de plusieurs variables (quel que soit leur type) on les sépare par des
virgules :
Print ajoute par défaut un espace entre les variables. On peut modifier ce comportement en utilisant
l’argument sep:
Print("…{}….{}…".format(var1,var2,….))
Il est possible d’indiquer entre les accolades {} dans quel ordre on cherche à afficher les variable
(Python commence à compter à partir de 0):
n {:.xf} formate un float (f) avec x chiffres après la virgule (renvoie un résultat arrondi) :
D’une manière générale et afin de formater les entiers ou les chaînes de caractères, on a :
n {:cAnT} pour préciser sur combien de caractères le résultat soit écrit ainsi son alignement,
avec:
4.3.1.3 Exercices
Exercice 1 : Écrire un script python ConversionTime, qui convertit en heures, minutes et secondes,
une durée T en secondes. Il affiche le résultat sous la forme digitale comme celle d'une montre
électronique.
Exercice 2 : Écrire un script python IMC, pour calculer l'indice de la masse corporelle.
la donnée récupérée par cette fonction est de type chaîne de caractères. Il faudra convertir cette
donnée au type souhaité.
Par exemple:
n,m = input().split(‘sep’)
Split utilise le caractère ‘sep’ d’espacement comme délimiteur et le séparateur par défaut est
l’espace. Par exemple :
Si la fonction appartient à un module particulier (voir la section suivante), il faut importer ce module,
et préfixer le nom de la fonction par le nom du module :
import nomModule
nomModule.nomDeLaFonction(argument1, argument2, argument3)
Par exemple :
La valeur retournée peut être affectée à une variable, utilisée directement dans un calcul, ou rester
inutilisée si le programme n'en a pas besoin.
Si la fonction retourne plusieurs valeurs alors le résultat sera représenté par un tuple. On accède à
ces éléments du tuple soit:
res = div_euclidienne(20,3)
Print ("Q= ",res[0], "R= ",res[1])
#OU BIEN
quotient,reste = div_euclidienne(20,3)
Print ("Q= ", quotient, "R= ", reste)
n Un module python fait généralement appel à des éléments qui sont présents dans d'autres
modules python.
n Il y a des modules prédéfinis par le langage python, les autres modules sont téléchargeables.
import nomModule
L’appel des fonctions de ce module doit être précéder par le nom du module :
nomModule.nomFonction
Dans le cas où le nom du module est long, difficile à retenir ou s’il y a une ambiguïté entre plusieurs
modules de même noms, on peut le renommer en utilisant la notion de l’alias. Voici la syntaxe :
Par exemple, le module re contient des fonctions et des constantes pour les expressions rationnelles.
On peut utiliser des alias si on a déjà un re différent ou lorsque le nom du module peu maniable
comme le pyplot:
Import re as regex
Import matplotlib.pyplot as plt (pour la visualisation des données)
4.5.3 Importation des fonctions du Module
La déclaration ci-dessus consiste à importer l’ensemble des fonctions d’un module. En revanche, si
nous souhaitons importer une sous ensemble des fonctions de ce module ‘nomModule’, on déclare :
L’appel de ces fonctions se fait d’une manière directe sans passer par le nom du module. Voir
l’exemple ci-après :
Il existe une autre déclaration qui consiste à importer toutes les fonctions du module :
MAIS c’est déconseillé, car on ne pourrait plus faire la distinction entre les fonctions et les variables
provenant de différents modules, s'ils sont nommés de façon identique. Par exemple, si on a :
4.5.4 Package
Une Package est le regroupement de plusieurs modules. Pour importer un module d’une package
donnée on déclare:
Par exemple le package matplotlib qui permet de générer des graphes depuis Python, possède le
module plyplot. Il y a deux façons de déclaration possible :
La fonction dir(): affiche la liste de toutes les fonctions et variables disponibles dans un module.
Fonctions trigonométriques:
Constantes, comme:
1
https://docs.python.org/fr/3/py-modindex.html.
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
n La fonction random(): elle produit des nombres uniformément distribués entre 0 et 1. c'est la
fonction aléatoire que nous utiliserons le plus souvent. L’exemple suivant permet de créer
une liste avec trois valeurs aléatoires entre 0 et 1.
n La fonction seed(n) permet aux autres fonctions du module random de reproduire les
mêmes valeurs aléatoires à chaque exécution. On exécute seed avec une valeur de n, avant
l'appel des fonctions random.
n La fonction choice(list) permet de choisir un élément au hasard dans une liste. Elle permet aussi
de choisir au hasard un échantillon d’éléments en autorisant les doublons :
4.5.10 Module OS
Le module os fournit une façon portable d'utiliser les fonctionnalités dépendantes du système
d'exploitation. Voici la description de quelques fonctions de ce module :
n La fonction glob(pathname|*) de ce module renvoie une liste, avec les noms des fichiers
dans le répertoire courant de travail.
n color(couleur) choisir le couleur du crayon, peut être une chaîne prédéfinie ('red', 'blue',
'green', etc.)
Les codes suivants illustrent deux exemples avec des fonctions du module Turtle :
Exemple1 :
Exemple 2 :
Nous pouvons définir nos propres fonctions pour pouvoir les appeler ensuite, comme pour les
fonctions prédéfinies. La figure suivante illustre le mécanisme d’un cycle de vie d’un appel d’une
fonction dans un programme :
n Réutilisation du sous-programme
n …
1. Procédure: est un sous-algorithme qui prend zéro ou plusieurs paramètres, puis il exécute
une suite d’instructions.
2. Fonction: est un sous-algorithme qui prend zéro ou plusieurs paramètres, puis il exécute une
suite d’instructions afin de générer et retourner un résultat.
Liste d’instructions
Les param1…paramN: ce sont les paramètres de la procédure. Il s’agit des variables qui permettent à
la procédure de communiquer avec l’extérieur. Certaines procédures n’ont pas de paramètres.
n Procédure nom_proc()
Attention l’affichage ce n’est pas un résultat de sortie, donc il s’agit bien d’une procédure.
Exemple: écrire une fonction qui retourne le Max entre deux entiers ?
nom_proc(var1,….varN)
Exemple:
Affiche_somme(x,y)
ZßFct_max(x,y)
5.3 Passages de paramètres
Il existe deux types de passages de paramètres :
Affiche_somme(a,b)
Exemple : la procédure suivante affiche_double reçoit un entier avec un passage par valeur puis elle
affiche son double :
//Résultat d’exécution
dans la procédure x=4
dans l Algo Principal x=2
On remarque bien que la valeur de la variable x n’a pas été changée après l’appel de la procédure
affiche_double.
Affiche_somme(Var a, Var b)
Exemple : la procédure suivante affiche_double reçoit un entier avec un passage par adresse puis
elle affiche son double :
x ß 2*x
Ecrire (‘dans la procédure x=‘ ,x)
Fin
//Algorithme principal
xß2
affiche_double (Var x)
Avec le passage par adresse (ou référence), on remarque que la valeur de la variable x a été modifiée
par la procédure affiche_double.
Une fonction en Python est une procédure qui calcule et qui retourne un résultat.
• print() est une procédure qui permet de faire des affichages à l'écran ;
• math.sin() et math.cos() sont des fonctions qui permettent de calculer le sinus et le cosinus
d'un nombre et retournent leur résultat sous la forme d’un nombre flottant ;
• float(), int(), str(), bool() sont des fonctions qui permettent de convertir une donnée d'un
type dans un autre type, et retournent leur résultat sous la forme de la donnée dans le type
désiré;
6.1.2 Définition
Une fonction a un nom, un bloc d'instructions et des paramètres. Le nom de la fonction doit être
différent aux mots réservés du langage et il ne contient aucun caractère spécial sauf le « _ ».
6.1.3 Syntaxe
La syntaxe pour déclarer et définir une fonction est :
Si on ne met pas de return dans le corps de la fonction, ou bien un return sans spécifier de valeur,
Python retourne automatiquement la valeur None, dans ce cas-là Il s’agit d’une procédure
x, y = 5 , 8
print(x,"^2 + ", y, "^2 = ",sommeCarres(x,y))
"""
-------- Résultat d'exécution ---
5 ^2 + 8 ^2 = 89
"""
6.2.3 Procédure
def salutation(param_prenom) :
""" cette fonction affiche une formule de bienvenue et ne retourne rien"""
print("bonjour",param_prenom)
#return None prenom = "Mohammed"
print(salutation(prenom))
"""
-------- Résultat d'exécution ---
bonjour Mohammed
None
"""
Attention ! Ce n'est pas parce qu'une fonction affiche quelque chose à l'écran qu'elle retourne une
valeur. En outre, le mot clé return ne provoque pas l'affichage à l'écran.
avance_et_traceCercle(50,100)
"""
-------- Résultat d'exécution ---
(50.00,-0.00)
"""
n Les paramètres d'une fonction n'ont pas de signification hors de la portée locale, c’est à dire
le corps de cette fonction. Par conséquent, Il est impossible d'accéder à ces paramètres (par
leur nom) en dehors du bloc de la fonction.
def fct(x=0,y=0) :
return x,y
Fct() # (0,0)
Fct(10) #(10,0)
Fct(0,10) #(0,10)
Remarque: les arguments sont pris dans l’ordre dans lesquels on les passe lors de l’appel.
MAIS ! Comment faire si on souhaitait préciser l’argument y et garder la valeur de x par défaut?
Pour réaliser un tel objectif il suffit de préciser le nom de l’argument lors de l’appel:
Une dérogation à cette règle : lorsqu'on appelle une fonction, on peut adopter un ordre quelconque
pour les arguments lorsqu'on précise les noms des paramètres associés pour chaque argument.
On peut rentrer les arguments dans un ordre arbitraire en précisant le nom de l’argument lors de
l’appel:
Fct(y=20,x=10)
n Arguments par mot-clé = Les arguments avec une valeur par défaut
Recommandation: Préciser le nom des arguments par mot-clé lors de l’appel d’une fonction. Par
exemple : print("Message ", end="")
Exemple 1 : la fonction print a un argument optionnel end dont la valeur par défaut est "\n", c'est à
dire un caractère invisible de retour à la ligne.
Exemple 2 : soit la fonction avance_et_traceCercle() suivante dont on donne des valeurs par défaut
aux paramètres p_avant et p_rayon :
>>> avance_et_traceCercle()
(50.00,-0.00)
>>> avance_et_traceCercle(10,400)
(60.00,0.00)
>>> avance_et_traceCercle(-40)
(20.00,0.00)
>>> avance_et_traceCercle(p_rayon = 70)
(70.00,0.00)
Question : simuler le résultat de ces instructions si on ajoute la fonction reset() dans le code de la
fonction ‘avance_et_traceCercle’:
Voici la syntaxe :
Map(fonction, séquence)
Exemple: La fonction map reçoit une liste et une fonction qui calcule le double d’un nombre et elle
retourne un objet map qui comporte les doubles des éléments de la liste reçu en argument.
n Syntaxe:
filter(fonction, séquence)
Exemple: mettre les éléments pairs d’une liste dans une nouvelle liste.
Généralement on regroupe les instructions du programme principal à la fin du module, après toutes
les définitions des fonctions.
Les instructions du programme principal peuvent être regroupées dans une fonction spécifique, la
fonction main. Voici sa déclaration.
if __name__ == "__main__":
Cette déclaration conditionnelle consiste à définir deux façons d’exécution du programme python :
1. Si le programme est exécuté en tant que script, le résultat du test if sera True et le bloc
d’instructions sera exécuté.
2. Si le programme est importé en tant que module, le résultat du test if sera False et le bloc
d’instructions ne sera pas exécuté.
Une variable est dite locale lorsqu’elle est créée dans une fonction. Par exemple la constante pi est
connue dans le module math, et inconnue en dehors. Si on souhaite l'utiliser, il faut importer son
module.
n Les variables déclarées dans une fonction sont inconnues hors de la portée locale de cette
fonction.
n Les paramètres des fonctions sont inconnus hors de la portée locale de cette fonction
n Les variables déclarées dans un module sont inconnues hors de la portée locale de ce
module.
n Une variable est dite globale lorsqu’elle est créée dans le programme principal.
n Variable Globale: est une variable qui est connue dans tout un module.
La variable x est connu dans le programme principal ainsi dans la fonction fct().
Attention! Python ne permet pas la modification d’une variable globale dans une fonction:
La valeur de x n’a pas été changé après l’appel de la fonction fct(). Il s’agit d’un passage de paramètre
par valeur.
L’erreur renvoyée montre que Python pense que x est une variable locale qui n’a pas été encore
assignée. Comment faire un passage de paramètre par adresse afin de changer sa valeur par une
fonction ?
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
Si on veut Vraiment modifier une variable globale dans une fonction, il faut utiliser le mot-clé global:
En revanche le seul type de passage de paramètre en python est le passage par référence:
Les mutables sont ceux qu’on peut modifier par la fonction appelée et les non mutables sont ceux
qu’on ne peut pas modifier par la fonction appelée.
Par exemple si on cherche à définir une fonction qui consiste à permuter la valeur de deux variables.
On peut écrire le code suivant :
def permuter(x,y):
t=x
x=y
y=t
x=3
y=5
permuter(x,y)
print("x:",x,"y=",y)
En remarque dans cet exemple que la valeur de x et y n’a pas été changé par la fonction.
Modification d’un objet non mutable : Pour modifier la valeur d’un objet mutable il suffit que la
fonction renvoie une valeur puis on récupère cette valeur renvoyée dans une variable portant le
même nom.
def permuter(x,y):
return (y,x)
x=3
y=5
x,y=permuter(x,y)
print("x:",x,"y=",y)
Dans cet exemple la liste est traitée comme une variable globale, on remarque que le deuxième
élément de la liste a été bien modifié par la fonction.
De même si vous passez une liste en argument, elle est modifiable au sein de la fonction:
1. Utiliser des tuples: Python renverra une erreur car ces derniers sont non modifiables. Ou
bien
2. Passer explicitement afin qu’elle reste intacte dans le programme principal, passage par
valeur.
n Une copie de y est créée à la volée lorsqu’on appelle la fonction, ainsi la liste y du module
principal reste intacte.
n Idem pour z
3. Et enfin il testera si elle est Interne. C’est à dire un mot clé de Python, par exemple :
len.
n Plutôt que d’utiliser des variables globales, passez vos variables explicitement aux fonctions
comme des argument(s).
n Exemple 1 :
n Exemple 2 :
n Exemple1: La liste liste_notes passée à la fonction est écrasée par la liste renvoyée
n Exemple2: n’est pas forcément évident de comprendre que la liste est modifiée dans la
fonction.
n Un module est un fichier contenant des définitions et des instructions avec l’extension .py
2. Dans ce dossier, ajouter le fichier suivant: __init__.py , cela indique à python qu'il s'agit
d'une package. Ce fichier peut être vide, seule sa présence est importante.
7 Récursivité
7.1 Définition
7.1.1 Appel d’une fonction dans une autre
Nous avons vu des fonctions qui étaient appelées depuis le programme principal. Mais il est possible
d’appeler une fonction depuis une autre fonction (des fonctions imbriquées). La figure suivante
illustre le processus de l’appel inter-fonctions à travers un exemple.
Dans cette exemple nous avons une un programme principal qui appel la fonction calc_vals avec
deux arguments : début et fin. Cette fonction doit retourner une liste en appliquant une fonction
polynomiale sur l’ensemble des entiers entre le début et la fin.
Pour avoir une bonne organisation du code, la fonction calc_vals va déléguer le comportement du
calcul polynomial à une deuxième fonction qui s’appelle polynome. Cette dernière reçoit un entier x
et elle retourne f(x) avec f(x)=x2-2x+1
Fonction polynôme
x=val
entre -5 et 5 F(x)=x2-2x+1
Fonction calc_vals
début=-5 Retourne la
Fin=5 liste
Programme Principale
n 0 est un entier
Une structure est récursive si un de ses attributs en est une autre instance, par exemple une liste
récursive
n Le premier élément
Une fonction est dite récursive si elle comporte, dans son corps, au moins un appel à elle-même
Par exemple, le calcule de n factoriel (n!) consiste à calculer le n-1 factoriel ((n-1) !) puis le multiplier
fois n. ensuite de faire la même chose pour calculer le( n-1) ! et ainsi de suite jusqu’à 1.
def factorielle(p_nombre):
if nombre > 1:
return p_nombre*factorielle(p_nombre - 1)
else :
return 1
4*6=24
3*2=6
2*1=2
Résultat final= 24
Remarque : La fonction reste figée dans le même état, jusqu’à ce que la fonction appelée lui renvoie
une valeur.
n Puis on ajoute n
Donc d’une manière itérative pour calculer la somme(n), on calcule la somme de (n-1) c’est-à-dire on
appel somme(n-1). Lorsqu’on arrive à n=1 on arrête l’appel récursif.
1. La récursivité terminale si aucune instruction n’est exécutée après l’appel de la fonction à elle-
même
def f(n):
if n==0:
print("Hello")
else:
f(n-1)
f(3)
def f(n):
if n>0:
f(n-1)
print("Hello")
f(5)
n Algorithme
Fonction f(n:entier):entier
Debut
fßf(n-1)
Fin
n Python
Def f(n):
Return f(n-1)
MAIS! On s’arrête quand!? La fonction f telle qu’elle est écrite ne s’arrête jamais :
n Appel : f(2)
n Appel : f(1)
n Appel : f(0)
n Appel : f(-1)
n Appel : f(-2)
n Etc...
Dans l’exemple suivant une fois n atteint la valeur de 0 on arrête l’appel récursif.
def f(n):
if n==0:
print("Fin d'appel")
else:
f(n-1)
La condition terminale ne sert à rien si elle ne devient jamais vrai. Par exemple avec la fonction
précédente :
n Probablement d’autres tests à faire (si n<0, envoyer une exception par exemple).
n On arrive forcément à 0
n On remonte la pile des appels (sans rien faire, ici la récursivité est terminale)
def f(n):
if n<=0:
print("Fin d'appel")
else:
f(n-1)
7.3.4 Résumé
Une fonction récursive doit comporter :
La chaîne d’appel doit conduire au critère d’arrêt. Optionnellement, des cas impossibles ou incorrects
à traiter par des exceptions.
Exemple
n Boucle for
def som(n):
s=0
for i in range(1,n+1):
s=s+i
return s
n Récursivité
def som(n):
if n==1:
return 1
else:
return n+som(n-1)
n Inversion
n Etc..
L’écriture sous forme récursive est toujours plus simple que l’écriture sous forme itérative.
1. Ecrire une fonction récursive qui calcule le PGCD de deux entiers positifs.
2. Tester la fonction
Exercice 2
2. Tester la fonction
Cette façon de procéder devient cependant tout à fait inadéquate lorsqu’on souhaite traiter une
quantité d'information plus importante. Imaginons, nous voulons écrire un petit programme qui
fasse apparaître à l'écran des questions à choix multiples, avec traitement automatique des
réponses :
L'idée la plus simple consiste à placer chacune de ces questions dans une variable:
Etc.
La manipulation de ces données par les instructions (comme if) sera très compliqué notamment
lorsqu’on a un grand nombre de questions. Une première réflexion consiste à utiliser une liste, par
exemple : Liste=["Quelle est la capitale du Maroc?", "Combien font 26 x 43 ?",…]
Mais même avec les listes il reste plusieurs problèmes gênants, à savoir :
1. La lisibilité du programme ;
D’où l’utilité de séparer les données, et les programmes qui les traitent, dans des fichiers différents.
Remarque : Lorsque les quantités de données deviennent très importantes, il est nécessaire de
structurer les relations entre ces données (Base de données).
8.1.2 Utilisation
Pour utiliser un fichier, on doit
n y écrire des annotations, mais généralement vous ne faites pas les deux à la fois.
3. Le refermer, à la fin
Cependant comment faire si nous souhaiterons forcer Python à changer le répertoire courant par un
autre? Il y’a deux solutions:
chdir("C:/SMI/Algorithme/TP")
Dans certain cas, il est utile de connaitre le chemin du répertoire courant. Pour cela on utilise la
fonction getcwd() du module os qui retourne le chemin complet de ce répertoire.
n mode : définissez le mode dans lequel vous souhaitez ouvrir le fichier. Le tableau suivant
résume l’ensemble des modes d’accès au fichier :
Mode Signification
r Read : Valeur par défaut. Ouvre un fichier en lecture seule, erreur si le fichier n’existe pas
a Append : Ouvre un fichier à ajouter, les données sont ajoutées à la fin du fichier, crée le
fichier s’il n’existe pas
W Write : Ouvre un fichier vide pour l’écriture, les données sont ajoutées au début du
fichier, crée le fichier s’il n’existe pas
x Create : Crée le fichier spécifié, renvoie une erreur si le fichier existe
Chaque élément de la liste est une chaîne de caractères qui se termine par le caractère \n (retour à la
ligne), Qui permet de passer d’une ligne à la ligne suivante.
L’objet file est un objet itérable donc on peut boucler sur ses éléments, où chaque élément est une
ligne du fichier avec un retour chariot. Sur l’exemple suivant on utilise end=‘’ pour éviter un double
saut.
Pour la fonction print on n’a pas besoin de changer la valeur par défaut de son attribut end.
La fonction WRITE de l’objet File, dont la syntaxe est file.write(‘contenu’) permet d’ajouter le
‘contenu’ à la fin du fichier ouvert et elle retourne le nombre d’octets ajoutés au fichier (équivalent
au nombre de caractères). Par exemple :
On remarque que les éléments de la liste ont été sauvegardés dans le fichier comme une seule ligne.
Si nous souhaitons mettre chaque élément de la liste dans une ligne séparée on doit ajouter le
séparateur "\n".
En règle générale, l'exécution du programme est alors interrompue, et un message d'erreur plus ou
moins explicite est affiché.
Try:
blocInstructions1
Except:
blocInstructions2
Else:
blocInstructions3
Si une erreur survient pendant l'exécution de blocInstructions1, Python annule ce bloc d’instructions
et exécute les instructions du blocInstructions2.
Si aucune erreur ne s'est produite dans blocInstructions1, Python exécute blocInstructions3 de else
(si elle est présente). Exemple 1 : avec les opérations
Remarque : Il est possible de faire suivre l'instruction try de plusieurs blocs except, chacun d'entre
eux traitant un type d'erreur spécifique.
9 Complexité algorithmique
9.1 Comprendre la notion de complexité
9.1.1 Problématique
Supposons qu’on cherche à définir une fonction qui renvoie 1 si un nombre ‘n’ appartient à une liste
L et 0 si non. Nous disposons de plusieurs solutions pour répondre à cet exercice, voici une liste des
solutions possibles :
n Avec l’opérateur in
Def recherche(n,L):
if n in L:
return 1
return 0
n Avec la boucle for
Def recherche(n,L):
for i in range (len(L)):
if L[i]==n:
return 1
return 0
n Avec la boucle while
Def recherche(n,L):
i=0
while i<len(L):
if L[i]==n:
return 1
i=i+1
return 0
n Avec une fonction récursive
Def recherche(n,L):
if L==[] :
return 0
if L[0]==n:
return 1
return chercher(n, L[1:])
Par conséquent, on se retrouve devant deux problématiques :
9.1.2 Objectifs
La section précédente nous a montré que la solution algorithmique n’est pas unique pour un
problème donné!. Alors comment connaitre et choisir la meilleure solution lorsqu'on a le choix?
Nous avons besoin d’une métrique d’évaluation pour comparer les différents algorithmes d’un
problème donné. Il s’agit de la complexité algorithmique.
Le calcule de complexité a pour objectif d’une part de prévoir le temps d‘exécution d'un algorithme,
et d’autre part de comparer deux algorithmes réalisant le même traitement. Par exemple :
Recommandation sur l'espace-temps informatique : pour gagner du temps de calcul, on doit utiliser
davantage d'espace mémoire. Aujourd’hui on s’intéresse essentiellement à la complexité en temps.
Ce qui n‘était pas forcément le cas quand les mémoires coutaient cher.
z <- x
x <- y
y <- z
2. La deuxième méthode n'utilise que les deux variables qu’on veut échanger, mais réalise 3
affectations et 3 opérations
x <- y-x
y <- y-x
x <- y+x
9.3 Méthodes de calcul de complexité
L'évaluation de la complexité peut se faire à plusieurs niveaux. Au niveau de l'exécution du
programme expérimentalement et au niveau purement algorithmique, par l'analyse et le calcul.
Le module time possède la fonction perf_counter(), elle retourne un réel qui représente l’horloge du
système en seconde. Par conséquent il suffit de calculer la différence du temps avant et après
l’exécution du programme:
9.3.1.2 Limites
Le calcul de la complexité avec la méthode expérimentale représente certains inconvénients, à
savoir:
resultat <- 1;
pour (i allant de 2 à n pas 1) faire
resultat <- resultat*i;
Finpour
Voici un deuxième exemple: multiplier les éléments d'un tableau d'entiers par un entier. Voici
l’algorithme proposé :
fonction TabMultiplie(entier n)
début
pour (i allant de 1 à 10 pas de 1) faire
print(i * n)
Fin
n Pas de paramètre de complexité
Pour un même algorithme, différents choix de paramètre de complexité peuvent être possible. C’est-
à-dire plusieurs complexités peuvent être calculées, selon les besoins.
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
n On précise les opérations élémentaires qui, par hypothèse, se déroulent en temps borné par
une constante,
n l’affectation en général.
1. Une affectation, une comparaison ou une évaluation d’une opération arithmétique ayant en
général un faible temps d’exécution, celui-ci sera considéré comme l’unité de mesure du
coût d’un algorithme.
3. Le coût d’un test if b: p else: q est inférieur ou égal au maximum des coûts des instructions p
et q, plus le temps d’évaluation de l’expression b.
4. Le coût d’une boucle for : est égal au nombre d’éléments de l’itérable multiplié par le coût de
l’instruction p si ce dernier ne dépend pas de la valeur de i. Quand le coût du corps de la
boucle dépend de la valeur de i, le coût total de la boucle est la somme des coûts du corps de
la boucle pour chaque valeur de i.
5. Le cas des boucles while est plus complexe à traiter puisque le nombre de répétitions n’est
en général pas connu a priori. On peut majorer le nombre de répétitions de la boucle de la
même façon qu’on démontre sa terminaison et ainsi majorer le coût de l’exécution de la
boucle.
· Les entiers python sont de type long (i.e. 8 octets à partir de la version 3.0) : les opérations
arithmétiques ne sont donc pas toujours élémentaires. On supposera cependant leur temps
d’exécution est borné.
· La recopie d’un tableau d’entier n’est pas élémentaire, seule la copie d’un élément d’un
tableau sera supposée élémentaire.
· l’accès à un élément via son index dans un itérable, càd. t[i], d[i], s[i], .
En effet, Il faut associer des temps d'exécution constants à chaque type d'instruction :
n affectation d'entier : ae
n comparaison d'entier : ce
9.5.2 Principe
Pour calculer le temps d’exécution d’un programme il suffit de faire la somme du temps d’exécution
de toutes les instructions élémentaires. Au total, le temps d'exécution sera de la forme : a*n+b avec
n comme paramètre de complexité et a et b des constantes.
Il n’est pas possible de fixer des valeurs numériques aux constantes, qui dépendent du langage
d’implémentation et du contexte d’exécution. On se contente donc de déterminer la forme générale
de la complexité.
début
b <- FAUX
i <- 0
tantque (i < tab.longueur ET non b) faire
si (tab[i] = x) alors
b <- VRAI
finsi
i <- i+1
fintantque
retourne b
fin
Le paramètre de complexité est la taille du tableau d'entrée, n. et le nombre de tours de la boucle
tant que varie selon que x est dans le tableau ou pas, et selon l'endroit ou x est présent. Voici une
étude des différents cas possibles :
n Si x est dans la première case du tableau : 1 tour de boucle avec la condition tab[i]=x vraie
n Si x est dans la deuxième case du tableau : 1 tour de boucle avec la condition tab[i]=x fausse
et 1 tour de boucle avec la condition tab[i]=x vraie
n ...
n Si x est dans la dernière case du tableau : tab.longueur-1 tours de boucle avec la condition
tab[i]=x fausse et 1 tour de boucle avec la condition tab[i]=x vraie
n Si x n'est pas dans le tableau : tab.longueur tours de boucle avec la condition tab[i]=x fausse
2. La complexité au mieux : temps d'exécution minimum, dans le cas le plus favorable (en
pratique, cette complexité n'est pas très utile).
3. La complexité moyenne : temps d'exécution dans un cas médian, ou moyenne des temps
d’exécution.
Le plus souvent, on utilise la complexité au pire, car on veut borner le temps d’exécution.
Exemple d’une fonction qui cherche l’occurrence d’une chaine de caractères dans un tableau des
chaînes:
fintantque
retourne b
fin
n Complexité au pire (x n'est pas dans le tableau) :
• 2*ae+n*(3*ce+1*oe+2*ae)+1*ret = 6n+3
• 2*ae+3*ce+2*ae+2*oe = 9
n Complexité en moyenne : considérons qu'on a 50% de chance que x soit dans le tableau, et sa
position est au milieu. Soit il n’y a pas
• [ 6n+3+(2*ae+n/2*(3*ce+1*oe+2*ae)+1*ret)] /2 = 4n+3
Ǝ(n0; x) telle que C(n) <= x*f (n) pour tous n >= n0
x*f(n)
C(n)
C = O(f) signifie que C est dominée asymptotiquement par f ou que f domine asymptotiquement C.
Démonstration : En effet, pour n >= 2, on a 3n + 6 <= 9n ; la quantité 3n + 6 est donc bornée, à partir
d'un certain rang, par le produit de n et d'une constante.
· 3 *2 + 6 <= 9 *2
· 3 *3 + 6 <= 9 *3
· 3 *4 + 6 <= 9 *4
· 3 *5 + 6 <= 9 *5
Démonstration : En effet, pour n >= 3, on a n2+ 3n <= 2n2 ; la quantité n2 + 3n est donc bornée, à
partir d'un certain rang, par le produit de n2 et d'une constante.
9.6.3 Simplification
On calcule le temps d'exécution comme avant, mais on effectue les simplifications suivantes :
9.6.4 Propriétés
Pour le calcule de la complixité avec la notation O on utilse les propriètés suivantes:
Def factoriel(n) :
if n==0 or n==1 :
return 1
return n*factoriel(n-1)
Le paramètre de complexité est n
C(1)=2 #idem
= 3 + C(n-1)=∑ 3+2+2=3(n-1)+4=3n+1=O(n)
n Exemple: factorielle
Cas 4: Si c(n)=c(n/2)+b
Cas 5: Si c(n)=c(n/2)+a*n+b
Cas 6: Si c(n)=2*c(n/2)+a*n+b
n Exemple: traitement linéaire avant double appel récursif dichotomique, tri fusion
10 TD : les exercices
10.1 TD1 : Fonctions Prédéfinies – Algorithme
10.1.1 Opérateurs
Écrivez un algorithme qui convertisse en mètres par seconde puis en km par heure une vitesse
fournie par l'utilisateur en miles/heure. (Rappel : 1 mile = 1609 mètres)
Variables A, B, C : Réel
D,E : Caractères
Début
A ß Sin(B)
A ß Sin(A + B*C)
B ß Sin(A) – Sin(D)
D ß Sin(A / B)
C ß Cos(Sin(A)
FIN
10.1.5 Fonctions sur les nombres
Ecrire un algorithme qui reçoit un nombre, il affiche ensuite : soit la racine carrée de ce nombre, soit
un message indiquant que la racine carrée de ce nombre ne peut être calculée.
1. (1+2)**3
2. "Da" * 4
3. "Da" + 3
4. ("Pa"+"La") * 2
5. ("Da"*4) / 2
6. 5/2
7. 5 // 2
8. 5%2
9. str(4) * int("3")
10. int("3") + float("3.2")
11. str(3) * float("3.2")
12. str(3/4) * 2
· si lst = [(10, 20), (30, 40, 50, 60), (70, 80, 90)] et val=100
· alors Lst2=[(10, 100), (30, 40, 50, 100), (70, 80, 100)].
2. Ecrire un algorithme principal qui fait l’appel à cette fonction et affiche son résultat pour x=1, x=2
et x=27
2. Ecrire un algorithme principal qui teste cette fonction avec les valeurs x=5, y=15, z=8.
2. Tester votre fonction par un algorithme principal qui demande à l’utilisateur de saisir un entier
puis il affiche si le nombre est premier ou non.
Rappel : Une année A est bissextile si A est divisible par 4 et elle ne l'est cependant pas si A est un
multiple de 100, à moins que A ne soit multiple de 400.
Testez la fonction avec la liste suivante : ['Jean-Michel', 'Marc', 'Vanessa', Maximilien', 'Alexandre-
Benoît', 'Louise'].
2. Ecrire les fonctions countNotes, maxNotes, minNotes, avgNote qui retournent respectivement
le nombre de notes entrées, la note la plus élevée, la note la plus basse, la moyenne de toutes les
notes. L’ensemble de ces fonctions reçoivent le tableau ‘notes’ comme un paramètre d’entré.
F=6,67 10−11*m*m'/d2
Exemple d'affichage :
d=0.05 m : la force vaut 2.6680 N
d=0.1 m : la force vaut 0.6670 N
d=0.2 m : la force vaut 0.1667 N
d=0.4 m : la force vaut 0.0417 N
d=0.8 m : la force vaut 0.0104 N
d=1.6 m : la force vaut 0.0026 N
d=3.2 m : la force vaut 0.0007 N
d=6.4 m : la force vaut 0.0002 N
Indice : commencer par définir la fonction forceGravite(n,m,d) qui calcule la force de gravitation
s'exerçant entre deux masses n et m, pour une distance d.
2. Ecrire un programme principal qui calcule f(x) tel que x est une valeur donnée par l’utilisateur.
2. Tester votre proposition par un programme principal qui affiche le tableau de multiplication d’un
entier entre 1 et 9 saisi par l’utilisateur.
Par exemple, l'exécution de l'instruction : compteCar('e','Cette phrase est un exemple') doit donner
le résultat : 7
Dans le programme principal, à partir d’une séquence ADN seq, saisie par l’utilisateur affichez seq et
sa séquence complémentaire. Exemple de seq : ["A", "T", "C", "G", "A", "T", "C", "G","A", "T", "C"]
def fct_list(L1,L2=[]):
if L1 == []:
return L2
else:
s = L1.pop(0)
if s not in L2:
L2.append(s)
return fct_list(L1,L2)
Que renverra la fonction fct_list définie ci-dessus lorsqu’on l’appelle comme suit ?
fct_list ([34,2,3,11,11,2,34,7,1,7,7,11,3,11]).
def fct2(n):
if n == 0:
return False
else:
return not fct1(n)
Que calculent les fonctions fct1 et fct2? Que pensez-vous de leur définition.
10.5.7 PGCD
Ecrire une fonction récursive qui calcule le PGCD de deux entiers. Puis tester la fonction avec deux
valeurs saisies par l’utilisateur.
1. Créez la fonction ‘init’ qui crée et initialise ce fichier avec les notes saisies par l’utilisateur. La
fonction demande à l’utilisateur de saisir les notes une à une en terminant la saisie par la
valeur -1. La note saisie doit être entre 0 et 20.
2. Créez la fonction ‘transform’ qui lit chaque ligne de ce fichier, extrait les notes sous forme de
float et les stocke dans une liste.
3. Créez la fonction ‘moyenNotes’ qui calcule et affiche la moyenne des notes avec deux
décimales.
n Toutes les notes seront écrites avec deux chiffres après la virgule.
· L'utilisateur devra pouvoir entrer ses lignes de texte successives en utilisant simplement la
touche <Enter> pour les séparer les unes des autres.
· Pour terminer les entrées, il lui suffira d'entrer une ligne vide (c'est-à-dire utiliser la touche
<Enter> seule).
· L'affichage du contenu devra montrer les lignes du fichier séparées les unes des autres de la
manière la plus naturelle (les codes de fin de ligne ne doivent pas apparaître).
2. Écrivez un script qui compare les contenus de deux fichiers et signale la première différence
rencontrée.
· Pour chaque étudiant il doit saisir le nom, prénom, adresse, code postal et n° de
téléphone.
· Chaque étudiant sera ajouter comme une ligne dans le fichier, dont ces information
sont séparées par un ‘|’
3. Écrivez un script qui modifie le fichier précédent pour ajouter la date de naissance et le sexe
de chaque étudiant.
· Il faut afficher le nom complet de l’étudiant puis demander à l'utilisateur d'entrer ces
données complémentaires).
· jusqu'à atteindre la fin de l'un des deux fichiers originaux. Complétez ensuite C avec
les éléments restant de l'autre fichier.
Rappel : Le tri par sélection (ou tri par extraction) est un algorithme de tri par comparaison. Il
consiste à :
Def tri_selection(T,n) :
for i in range(n-1) :
posmin=i
for j in range(i+1,n) :
if T[j]<T[posmin] :
posmin=j
T[i],T[posmin]=T[posmin],T[i]
return T
1. Calculer la complexité de la fonction. Et déduire sa classe ?
Rappel : Le tri par insertion considère chaque élément du tableau et l'insère à la bonne place parmi
les éléments déjà triés. Ainsi, au moment où on considère un élément, les éléments qui le précèdent
sont déjà triés, tandis que les éléments qui le suivent ne sont pas encore triés.
Pour trouver la place où insérer un élément parmi les précédents, il faut le comparer à ces derniers,
et les décaler afin de libérer une place où effectuer l'insertion. Le décalage occupe la place laissée
libre par l'élément considéré. En pratique, ces deux actions s'effectuent en une passe, qui consiste à
faire « remonter » l'élément au fur et à mesure jusqu'à rencontrer un élément plus petit.
Def tri_insertion(T):
for i in range(1,len(T)):
k=i
while k>0 and T[k]<T[k-1]:
T[k], T[k-1] = T[k-1], T[k]
k = k –1
Calculer la complexité de la fonction. Et déduire sa classe ?
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
Def RechDichotomique(T,x) :
inf=0
sup=len(T)-1
while inf<=sup :
m=(inf+sup)//2
if T[m]==x :
return m
if T[m]<x :
inf=m+1
else:
sup=m-1
return -1
def tri(L):
n = len(L)
if n==0 or n==1:
return L
m=(n-1)//2
Pr. Abdeltif EL BYED
Informatique2 : Algorithme2 / Python MIP-S
11 Bibliographie
• BALKANSKI, Cécile et MAYNARD, Hélène, Algorithmique et C++, Supports de TD et de TP, IUT
d'Orsay, département Informatique
• CHESNEAU Myriam, Cours d'informatique - Initiation au langage C, IUT d'Annecy,
Département Mesures Physiques, 2010-2011
• CHUN, W. J., Au Cœur de Python, CampuPress, 2007.
• DABANCOURT, Christophe, Apprendre à programmer, Algorithmes et conception objet,
Eyrolles, 2008, 2e édition.
• LUTZ, Mark & BAILLY, Yves, Python précis et concis, O’Reilly, 2e édition, 2005.
• MARTELLI, Alex, Python par l'exemple, O’Reilly, 2006.
• SWINNEN, Gérard, Apprendre à programmer avec Python 3, Eyrolles, 2010
Webographie