Introduction à la Programmation Python
1. Manipulation des objets élémentaires
1.1. Entiers
((567*34 -(222 + 103*(890-888))*5*3**(3127-5**5))**4 + 17471268) // 1454586 ((567*34 -(222 + 103*(890-888))*5*3**(3127-5**5))**4 + 17471268) % 1454586
1.2. Opération Booléennes
Pour 1, 2, et 3 on obtient dans l’ordre : True, False et True. On remarque
que l’expression 1 donne le même résultat que l’expression 3. Le and est donc
prioritaire sur le or.
Pour la 4, on obtient True puis False, le not est donc prioritaire sur le
and et le or.
1.3. Flottants
(530.4709375 * 42) ** (1/6) / 3.5
150 // 12 donne un résultat entier, le quotient de la division euclienne,
alors que 150 / 12 calcule le résultat de la division flottante.
2 ** 0.5 (2 ** 0.5) ** 2
On remarque que l’utilisation des flottant implique une approximation des résultats mathématiques attendus, et que cette approximation induit une erreur sur le calcul de \(\sqrt{2}^{2}\).
1.4. Néant
On remarque que la console n’affiche aucun résultat. En effet, lorsque le
résultat est None, cela signifie qu’il n’y a pas de résultat.
1.5. Comparaisons
On remarque que les comparaisons sur les flottants ne correspondent pas aux attendus mathématiques. C’est du à la précision finie que nous permet d’avoir un flottant.
On peut observer aussi que B == True renvoie toujours B.
Il est donc inutile d’écrire B == True, mieux vaut écrire B directement.
De même B == False peut être simplifié en not B.
2. Nommage
2.1. Variables
2.2. Fonctions, Appels
2.3. Fonction, Définition
def racine(x,n) : return x ** (1/n) def ordonnees(a,b,c,d) : return a < b and b < c and c < d def quasiegal(x,y,e) : return -e < x-y and x-y < e
2.4. Fonctions, Environnement
Lien vers une simulation Python Tutor
Il y a au plus 2 environnements locaux simultanés, en plus de l’environnement global.
3. Flot d’exécution
3.1. Appels
1, 4, 7, 10, 1, 2, 7, 8, 7, 8, 4, 5, 7, 8, 5, 2, 10
3.2. Conditionnelles
Lien vers une simulation Python Tutor
f(10,20) : 1, 2, 3, 4, 11, f(5,6) : 1, 2, 3, 5, 6, 8, 11, f(3,4) : 1, 2, 3, 4, 11, f(7,10) : 1, 2, 3, 5, 10, 11, f(-3,2) : 1, 2, 3, 5, 6, 7, 8, 11,
3.3. Bissextile
def bissextile(annee) : if annee % 400 == 0 : return True elif annee % 4 == 0 and annee % 100 != 0 : return True else : return False
On peu aussi écrire…
def bissextile(annee) : return annee % 400 == 0 or (annee % 4 == 0 and annee % 100 != 0)
3.4. Boucles
f(12) : 1, 2, 3, 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 5, 7, 4, 8, 9, 10, 11, ~ x3 9, 12, f(21) : 1, 2, 3, 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 5, 7, ~ x4 4, 5, 6, 7, 4, 8, 9, 10, 11, ~ x5 9, 12, f(0) : 1, 2, 3, 4, 8, 9, 12, f(-5) : 1, 2, 3, 4, 8, 9, 12, f(30) : 1, 2, 3, 4, 5, 6, 7, | ~ x6 4, 5, 7, ~ x4 | 4, 8, 9, 10, 11, ~ x6 9, 12
4. Etude d’un algorithme
4.1. Simulation Papier
- Il y a 5 tours de boucles
Voici les différentes valeurs :
i0 1 2 3 4 5 f1 1 2 6 24 120 - On a
f = i!
4.2. Spécification de \(\cal F\)
L’algorithme \(\symcal{F}\) renvoie \(n!\).
4.3. Vérification
4.4. Somme des entiers
On change simplement la multiplication par une addition et la valeur initiale de
f par 0. On va renommer f en s pour la clareté.
def somme(n) : i = 0 s = 0 while i < n : i = i + 1 s = s + i return s
On peut construire ce code par analogie du code, ou par analogie sur la formule de récurrence.
Si on voit le code de l’algorithme F comme le calcul du terme n de la suite
récurrente :
\[ \begin{cases} F_{0} & = 1 \\ F_{i+1} & = F_{i} * (i+1) \end{cases} \]
La somme des entiers se définie aussi pas une suite récurrente dont la définition est
\[ \begin{cases} S_{0} & = 0 \\ S_{i+1} & = S_{i} + (i+1) \end{cases} \]
Il suffit donc de garder le squelette de l’algorithme et de changer uniquement le terme initial de la suite et la formule qui permet de calculer le terme suivant à partir du précédent.
5. Diviser ou ne pas Diviser ?
5.1. Divisibilité
def est_diviseur(a,b) : return b % a == 0
5.2. Premier
def P(n) : p = True d = 2 while d * d <= n : if est_diviseur(d,p) : p = False d = d + 1 return p
Lien vers une simulation Python Tutor
Il y a un environnement local pour l’appel P(11), puis un environnement local
pour chaque appel de est_diviseur, i.e. 2 environnements. Donc 3
environnements locaux au total et 2 qui existent simultanément au plus.
5.3. Euclide
def euclide(a, b) : while a != b : if a > b : a = a - b else : b = b - a return a
6. Suites récurrentes
6.1. Méthode de Halley pour le calcul de \(\sqrt 2\)
def halley(n) : i = 0 h = 1.0 # H0 while i < n : # Invariant : h est le terme de rang i de la suite. h_suiv = h * (h*h + 6.0) / (3.0 * h*h + 2.0) i = i + 1 # Rang suivant h = h_suiv # h contient le terme suivant. return H
6.2. Suite de Fibonacci
def fibonacci(n) : rang = 0 f = 0 f_suivant = 1 while rang < n : f_suivant2 = f + f_suivant rang = rang + 1 f = f_suivant f_suivant = f_suivant2 return f
6.3. Syracuse
def syracuse(s0) : # Rang 0 rang = 0 s = s0 # Calcul du rang suivant, jusqu'à ce que le terme courant soit 1 while s != 1 : if s % 2 == 0 : s_suiv = s // 2 else : s_suiv = 3 * s + 1 rang = rang + 1 s = s_suiv return rang