Introduction à Python

Variables

python permet de créer des variables booléennes, entières, réelles, chaines de caractère, ... de la manière la plus simple. Pas besoin de connaitre le nom des types, celui-ci est défini à l'affectation.

In [1]:
x = 1
type(x)
Out[1]:
int
In [2]:
y = 3.1415
type(y)
Out[2]:
float
In [3]:
z = True
type(z)
Out[3]:
bool
In [4]:
s = 'Hello'
type(s)
Out[4]:
str
In [5]:
t = (1 , 1)
type(t)
Out[5]:
tuple
In [6]:
a = [ 1, 2, 3 ]
type(a)
Out[6]:
list

Affichage

Afficher le contenu d'une variable s'effectue avec la fonction print. Le format de sortie peut être maitrisé via la méthode format des chaines de caractères.

In [7]:
print(x)
print(y)
1
3.1415
In [8]:
print(x,y,z)
1 3.1415 True
In [9]:
print('{:>10}{:>10}{:>10}'.format('x','y','z'))
print('{:>10}{:>10}{:>10}'.format(x,y,z))
         x         y         z
         1    3.1415         1

Notez que contrairement au C++, le type d'une variable peut changer par affectation. Une variable python est juste un nom qui pointe vers un objet. L'affectation le fait pointer vers un autre objet. Par exemple, pour x qui est jusqu'ici de type int

In [10]:
x = 3.14
type(x)
Out[10]:
float

Décisions

Les décisions en python se font via l'instruction if, elif, else corresponant au if, else if, else du C++. L'expression booléenne testée est suivie de :, la branche de code à exécuter est écrite sur la/les lignes suivantes indentées.

In [11]:
x = 1.4

if x < 0:
    print(x,'est négatif')
elif x == 0:
    print(x,'est nul')
else:
    print(x,'est positif')
1.4 est positif

Notez que la définition des blocs de code se fait par indentation, contrairement au C++ qui utilise les accolades {...}

In [12]:
x = 1.4

if x < 0:
    print(x,'est négatif')
elif x == 0:
    print(x,'est nul')
else:
    print(x,'est positif')
    if x > 2: 
        print('et plus grand que 2')
        print('ça fait beaucoup')
    print('mais pas trop')
1.4 est positif
mais pas trop

Boucles

python dispose de boucles while et for mais pas de boucle do ... while. La syntaxe des boucles while est quasi identique à celle des décisions ci-dessus

In [13]:
x = -5

while x < 0: 
    print(x)
    x += 1
    
print('fin de boucle: x vaut',x)
-5
-4
-3
-2
-1
fin de boucle: x vaut 0

La boucle for sert uniquement à itérer sur les éléments d'une séquence (tableau, liste, caractères d'une chaine), similairement à la syntaxe for(auto c : s) du C++ par exemple.

In [14]:
s = "Hello"
for c in s:
    print(c)
H
e
l
l
o

Si l'on veut écrire l'équivalent du boucle

for(int i = 0; i < N; ++i)

en C++, il faut créer une séquence contenant les entiers de 0 à N-1. On utilise pour cela range(0,N).

In [15]:
for i in range(0,5):
    print(i,i**2)
0 0
1 1
2 4
3 9
4 16
In [16]:
for i in range(0,10,2):
    print(i,i**3)
0 0
2 8
4 64
6 216
8 512
In [17]:
for i in range(5,0,-1):
    print(i,i**4)
5 625
4 256
3 81
2 16
1 1

Fonctions

python permet de définir des fonctions avec le mot clé def

In [18]:
def hello(name, loud):
    if loud:
        print('HELLO', name.upper(), '!')
    else:
        print('Hello', name) 
In [19]:
hello('Adam',False)
hello('Bob',True)
Hello Adam
HELLO BOB !

La fonction précédente n'a pas de valeur de retour. Le mot clé return permet d'en retourner une ... ou plusieurs

In [20]:
def somme(a,b):
    s = a+b
    return s
In [21]:
x = 1
y = 2
s1 = somme(x,y)
print('somme = ',s1)
somme =  3
In [22]:
def sommeEtDiff(a,b):
    s = a+b
    d = a-b
    return s,d
In [23]:
s2,d2 = sommeEtDiff(x,y)
print('somme = {0} et difference = {1}'.format(s2,d2))
somme = 3 et difference = -1

Les paramètres peuvent avoir des valeurs par défaut

In [24]:
def puissance(exp1,exp2,base=10,step=1):
    for exp in range(exp1,exp2,step):
        print(base**exp)
In [25]:
puissance(0,3)          # exp1 = 0 et exp2 = 3
1
10
100
In [26]:
puissance(0,3,2)        # exp1 = 0, exp2 = 3 et base = 2
1
2
4

Il est aussi possible de passer les paramètres dans le désordre en spécifiant leurs noms.

In [27]:
puissance(0,10,step=3)  # exp1 = 0, exp2 = 10 et step = 3
1
1000
1000000
1000000000
In [28]:
puissance(base=2,exp2=10,exp1=0,step=3)  
1
8
64
512

Tableaux

Les tableaux les plus utilisés sont de type list, même s'ils sont en pratique mis en oeuvre sous la forme de tableaux redimensionable, similairement à la classe vector en C++.

In [29]:
T = [ 6, 3, 5, 1, 2, 4 ]
print(T)
type(T)
[6, 3, 5, 1, 2, 4]
Out[29]:
list

Parcourir tous les éléments du tableau se fait avec la boucle for

In [30]:
for t in T:
    print(t)
6
3
5
1
2
4

On dispose d'un accès par indice avec les crochets []. Parcourir tout les indices du tableau utilise la séquence range vue plus haut et la fonction len qui retourne la taille de la liste

In [31]:
for i in range(0,len(T)):
    T[i] = T[i]**2
print(T)
[36, 9, 25, 1, 4, 16]

Si nécessaire, la fonction enumerate permet un accès simultané aux indices et aux éléments

In [32]:
for i, t in enumerate(T):
    print("T[",i,"] =",t)
T[ 0 ] = 36
T[ 1 ] = 9
T[ 2 ] = 25
T[ 3 ] = 1
T[ 4 ] = 4
T[ 5 ] = 16

Les tableaux sont redimensionables. En particulier on dispose de la méthode append qui correspond à push_back en C++.

In [33]:
T2 = [] 
for t in T:
    T2.append(t+1)
print(T2)
[37, 10, 26, 2, 5, 17]

Mais il y a une syntaxe plus élégante en python pour écrire la boucle ci-dessus. Elle sera utilisée dans ce cours.

In [34]:
T3 = [ t+1 for t in T ]
print(T3)
[37, 10, 26, 2, 5, 17]

Enfin, on peut facilement créer des sous-tableaux en en prenant une tranche (slice)

In [35]:
print(T)
print(T[1:4])
print(T[:2],T[2:])
[36, 9, 25, 1, 4, 16]
[9, 25, 1]
[36, 9] [25, 1, 4, 16]

Librairies

De très nombreuses librairies étendent les fonctionalités de python. Pour les utiliser, on utilise le mot clé import ou import ... as ... pour la renommer. Dans le cadre de ce cours, nous utiliserons essentiellement la librairie numérique numpy et celle de dessin de graphes 2d matplotlib .

Voyons comment dessiner le graphe d'une fonction sinus

In [48]:
import numpy as np
import matplotlib.pyplot as plt
    
x = np.linspace(0,10*np.pi,200)   
y = np.sin(x)                      

plt.plot(x,y)               
plt.title('Fonction sinus')
plt.xlabel('x (radians)')
plt.ylabel('y = sin(x)')
plt.show()

Graphes

Une fonction particulièrement utile pour la suite est la possibilité d'afficher des graphes avec des échelles linéaires ou logarithmique pour chacun des axes.

In [37]:
x = np.linspace(0,100,11)
print(x)
[  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]
In [38]:
x = np.logspace(0,2,11)
print(x)
[  1.           1.58489319   2.51188643   3.98107171   6.30957344
  10.          15.84893192  25.11886432  39.81071706  63.09573445
 100.        ]
In [39]:
x = np.logspace(0,7,50)
y = np.square(x)
z = np.power(x,3)
    
plt.plot(x,x,label='x')
plt.plot(x,y,label='x^2')
plt.plot(x,z,label='x^3',marker='.')
plt.legend()
plt.title('linear')
plt.show()
In [40]:
plt.loglog(x,x,label='x')
plt.loglog(x,y,label='x^2')
plt.loglog(x,z,label='x^3',marker='.')
plt.legend()
plt.title('loglog')
plt.show()
In [41]:
plt.semilogx(x,x,label='x')
plt.semilogx(x,y,label='x^2')
plt.semilogx(x,z,label='x^3',marker='.')
plt.legend()
plt.title('semilogx')
plt.show()
In [42]:
plt.semilogy(x,x,label='x')
plt.semilogy(x,y,label='x^2')
plt.semilogy(x,z,label='x^3',marker='.')
plt.legend()
plt.title('semilogy')
plt.show()

Nombres aléatoires

In [43]:
import random

random.random()           # nombre aléatoire entre 0 et 1
Out[43]:
0.6203232130165383
In [44]:
random.randint(0,100)     # entier aléatoire entre 0 et 100 (100 y compris)
Out[44]:
92
In [45]:
random.uniform(0,100)     # nombre aléatoire entre 0 et 100, distribution uniforme
Out[45]:
55.40150502304532
In [46]:
T = np.random.uniform(0,10,100)    # 100 nombres aléatoires entre 0 et 10

plt.stem(T,markerfmt=',',linefmt='black',basefmt='black')
plt.show()

ASD1 Notebooks on GitHub.io

© Olivier Cuisenaire, 2018