Académique Documents
Professionnel Documents
Culture Documents
a = 5 a est la référence sur une boîte mémoire d’un entier, d’un flottant
a = 3.7 ou d’une chaîne de caractères etc.
a = "coucou" En entrée dans une fonction, def f(a): a représente la référence
a = 'coucou' (pointeur) donc attention aux effets de bord pour les listes, les dic-
a = '''une autre chaîne tionnaires (tous les objets mutables), pas de problème en revanche
sur plusieurs lignes''' pour les type str, int, float. (id(a) pour connaître le numéro
d’indentification de l’objet a), voir Fonctions.
a = float("353.45")
convertit la valeur en flottant, chaîne de caractères...
a = str(312)
La variable a peut changer de type (typage dynamique)
ascii = ord('a')
a, b = 12, 4.5 affectations en chaîne (tout est évalué à droite avant d’être affecté)
c = [k**2 for k in range(10) if k%5 != 0] création de liste par « compréhension »
a = 5-2*j
a.real
a.imag nombre complexe 5 − 2i, type complex
abs(a)
Types courants
a, b, c, d = 123, -5.6, 'coucou', "l'appel" entier (int), flottant (float), chaînes de caractères (str) non
modifiable (immutable)
a = str(-56)
b = int("678")
L = list("coucou") conversions... L vaut [’c’, ’o’, ’u’, ’c’, ’o’, ’u’]
c = "".join(L)
1/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
L1 = list(range(5))
L2 = ["ab"] * 5 [0, 1, 2, 3, 4] [’ab’, ’ab’, ’ab’, ’ab’, ’ab’]
dico["p4"] = "coucou"
del dico["p4"] une dictionnaire est modifiable, comme une liste
2/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
s1 = "bonjour"
s2 = " tout le monde" "bonjour tout le monde"
s = s1 + s2
c = "**".join(L) "bonjour**tout**le**monde"
"{1}--{0}**{2}".format(s1,s2,"aa") " tout le monde--bonjour**aa"
Opérations binaires
a | b ou binaire
a & b et binaire
a ^ b xor binaire
~a inversion de bits
a << 2 décalage de 2 vers la gauche (donc ×4)
b >> 3 décalage de 3 vers la droite
a = 0xef a réfère à l’entier écrit en hexadécimal EF (239)
chaine = str(bytes(L), 'latin-1') on reconvertit en chaîne de caractères la liste L (bytes est le type
octet en Python)
Boucles, tests
while condition:
instruction() boucle tant que
else: else optionnel, si sortie propre sans break
pass
for i in liste:
instruction() boucle pour que
if condition:
instruction()
elif condition2: test, elif et else optionnelles
instruction2() 0 ” ou None compte pour False dans condition
else:
instruction3()
3/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
Fonctions
def f(a):
a = 2
return a
def g(a): Subtilité des références. Voici une exemple de résultat1 2 10455040
a[0] = 2
return a
10455072
a = 1
[2] [2] 139949430437384 139949430437384
b = f(a)
Traceback erreur...
print(a , b, id(a), id(b))
TypeError : ’tuple’ object does not support item assignment Par
# attention a = référence (pointeur)
a = [1]
b = g(a) ailleurs la priorité pour reconnaître une variable locale est
print(a , b, id(a), id(b)) def. locale puis on remonte la hiérarchie des fonctions. On peut
# problème tuple non modifiable comme str utiliser les mots-clé global ou non local
a = (1, )
b = g(a)
print(a , b, id(a), id(b))
def exemple(objet, *uplets, **dico): Plus élaboré, pour aller plus loin...
print("L'objet est", objet)
for a in uplets:
print(a) L'objet est bonbon
print("#" * 20) au caramel
for kw in dico: au beurre salé
print(kw, ":", dico[kw]) ####################
exemple('bonbon', 'au caramel', prix : cher
'au beurre salé', qualite : bonne
qualite = 'bonne', prix='cher')
import numpy as np on peut utiliser np.sin(1) par exemple à éviter mais permet de
from numpy import * taper sin(1) directement
4/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
Manipulation de fichiers
ouverture d’un fichier : r lecture, w écriture, a écriture en ajout, b
monfichier = open("toto.txt", "r")
binaire help(file) pour les détails
np.array([1, 5, 7])
np.arange(deb, finnonincluse, increment) tableaux (array) de subdivision
np.linspace(deb, fin, nbpoints)
5/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
import numpy.linalg as lg
lg.det(M) déterminant
lg.inv(M) inverse de la matrice
valeurspropres, P = lg.eig(M) valeurs propres et matrice de passage (diagonalisation) spectre de
valeurspropres = lg.eigvals(M) la matrice
import random tirage équiprobable dans [[2, 5]], attention les fonction randint de
a = random.randint(2, 5) numpy.random et de random sont légèrement différentes (bornes
b = np.random.randint(2, 6) sup exclues pour numpy.random)
import numpy.random as rd
rd.random(nbtirages)
rd.randint(a, b, nbtirages) # b exclu lois usuelles de probabilités, nbtirages est optionnel, il peut-être
rd.binomial(n, p, nbtirages) un tuple, par exemple (n, m) pour une matrice n × m.
rd.poisson(l, nbtirages)
rd.geometric(p, nbtirages)
import math
import scipy.special as s
math.factorial(n) factorielle et combinaison de Pascal (sous scipy le nombre est un
s.factorial array).
s.comb(n, k)
data = np.genfromtxt('fichier.csv', extrait les données d’un fichier .csv avec le délimiteur "," et le met
delimiter=',') dans une matrice
data = np.load("fichier.npy") idem mais en binaire, format spécial numpy en binaire
np.save("fichiersav.npy", M)
sauvegarde du tableau M dans un fichier en binaire
np.savetxt("fichiersav.csv", M,
sous la forme d’un fichier .csv par exemple
fmt='%.5f', delimiter=',')
Polynômes (numpy.Polynomial)
6/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 101) affiche une ligne polygonale des points définis par les vecteurs x et
y = np.sin(x) y, ici on trace la courbe y = sin x
a = plt.plot(x, y)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 101)
Y = np.linspace(-np.pi, np.pi, 101) affiche des lignes de niveau de la surface z = sin(x) sin(y), on peut
XX, YY = np.meshgrid(X, Y) éventuellement utiliser l’option levels=[...].
Z = np.sin(XX) * np.sin(YY)
plt.contour(XX, YY, Z)
plt.show()
7/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
class Personne(object):
nbpersonne = 0 # var. statique
def __init__(self, nom, prenom, age):
self.nom = nom
self.prenom = prenom
self.age = age
Personne.nbpersonne += 1
def __repr__(self): Programmation orientée objet.
return "{} {}".format( Résultat
self.prenom.capitalize(),
self.nom.capitalize()) Robert Dupont Nb personnes : 2
def nbpers(self):
return Personne.nbpersonne
8/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
Divers
exécuté dans le module, permet de tester les fonctions documenté
par exemple
import doctest
if __name__ == '__main__': ''' fonction renvoie3
test() >>> renvoie3()
doctest.testmod() 3
'''
colles
prof eleve semaine note
2 8 1 16
1 0 6 19
... ... ... ...
Memento SQL
Éléments de SQL
(sigle de Structured Query Language, en français langage de requête structurée)
Optionnel
CREATE TABLE ... et INSERT INTO ...
Requêtes
9/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
• Agrégats
πchamp,COUNT(champ) σcondition champ γCOUNT(champ) (table)
Ils utilisent les fonctions COUNT(), COUNT(DISTINCT ...), SUM(), MAX(), MIN(), AVG()... SELECT champ, COUNT(...)
FROM table WHERE condition GROUP BY champ
COUNT(*), * = joker
On peut rajouter une condition sur les groupes avec HAVING, par exemple
SELECT groupe_colle FROM eleves
GROUP BY groupe_colle
HAVING COUNT(groupe_colle) = 2
πgroupe_colle σCOUNT(groupe_colle)=2 groupe_colle γCOUNT(groupe_colle) (eleves)
• Particularité SQL
SELECT DISTINCT pour enlever les redondances (inexistantes en algèbre relatrionnelle)
ORDER BY à la fin pour ordonner d’une certaine manière la table (=relation) renvoyée.
Par exemple
ORDER BY note DESC, nom ASC (on trie déjà selon la note puis selon le nom)
• En résumé
On peut utiliser des alias pour renommer les tables, c’est parfois indispensable si on dédouble une table (on peut être
explicite en utilisant le mot-clé AS (optionnel))
• À noter : on peut utiliser des sous-requêtes entourée par des parenthèses.
Exemple
SELECT nom
FROM eleves
WHERE note =
(
SELECT MAX(note)
FROM eleves
) ;
10/11 M. Rezzouk
M. Rezzouk Aide-mémoire Python
entier à coder
écriture binaire
notation en complément à deux
Ainsi, on fait correspondre à chaque entier de [[−128, 127]] un entier de [[0, 255]] qui est ensuite codé sur 8 bits par sa
représentation binaire. On remarquera que 0 admet alors une seule écriture : 00000000.
On remarque que le signe d’un entier est immédiat à déterminer via sa notation en complément à deux : il est
donné par le bit de poids fort. Le nombre est positif lorsque le bit de poids fort vaut 0 et négatif sinon.
Nous pouvons maintenant généraliser à la notation en complément à deux sur n bits.
On représente les entiers entre −2n−1 et 2n−1 − 1 de la manière suivante :
• si x ∈ [[0, 2n−1 − 1]] alors x est codé par son écriture binaire sur n bits.
• si x ∈ [[−2n−1 , −1]] alors x est codé par l’écriture binaire sur n bits de x + 2n (c’est-à-dire le complémentaire de |x| plus
1 = ((2n − 1) − |x|) + 1, ce qu’on appelle le complément à 2).
Si x + y > 2n−1 ou si x + y < −2n−1 , il y a un dépassement de capacité, si x + y ∈ [[−2n−1 , 2n−1 [[, le résultat est correct.
En python 3, les type int changent de codage si le nombre augmente, il n’y a pas de dépassement de capacité.
Les flottants
Un flottant est stocké sous la forme : signe, mantisse, exposant en binaire où signe est codé par 0 pour positif et 1 pour
négatif et la mantisse et l’exposant sont codés de manière habituelle en binaire.
Un tel nombre sera stocké sur n bits avec n = 32 ou 64 en général. Supposons par exemple que l’on travaille sur 64 bits.
Le premier bit est réservé au signe puis vient la mantisse puis enfin l’exposant. Le découpage utilisé est le suivant :
signe mantisse exposant
1 0 1 1 0 1
L’exposant e est en fait un entier relatif entre −1022 et 1023 qui est représenté en binaire via e + 1023 sur 11 bits (attention,
ça n’est pas le complément à deux). e + 1023 peut donc prendre les valeurs de 1 à 2046. Comme 211 − 1 = 2047, on voit qu’il
manque 0 et 2047. Ces deux valeurs sont réservées pour gérer des exceptions.
Enfin, on sait que le premier chiffre de la mantisse, par définition est 1 (sauf pour le nombre 0) donc il est inutile de le stocker
ce qui fait que l’on stocke en réalité les 52 chiffres après la virgule de la mantisse.
Remarque Cette manière de coder les flottants correspond au système de double précision. Il existe aussi un système
à simple précision où les nombres sont codés sur 32 bits. Comme on le verra, sur 64 bits, on obtient environ 16 chiffres
après la virgule (dans la notation décimale) alors que sur 32 bits, on obtient 8 chiffres après la virgule.
On retiendra que pour des flottants en précision 64 bits, l’approximation relative d’un réel ne dépasse jamais ε = 10−16 .
Il reste ensuite à coder quelques cas qui peuvent se produire dans des calculs numériques comme les dépassements, les
divisions par zéro ou encore la gestion des nombres dénormalisés (c0 = 0). Tout ceci est fait en utilisant les exposants codés
en 00000000000 ou 11111111111.
• Plus précisément
0 0...0 11111111111 = +∞
1 0...0 11111111111 = −∞
0 ou 1 puis 52 bits non tous nuls puis 11111111111 = NaN Not a Number
• Lorsque l’exposant est 00000000000 mais que la mantisse est non nulle, on considère que le premier chiffre avant la virgule
est 0 et que l’exposant est −1022 (et non pas −1023). Ces nombres sont dits dénormalisés. Ils permettent une meilleure
répartition des (très) petits nombres représentables.
11/11 M. Rezzouk