COURS/TP 1 : découverte du langage Python

Introduction

Depuis une vingtaine d'années, l'informatique a pris de l'importance dans nos vies quotidiennes. Ce domaine regroupe des matières bien différentes comme l'étude des réseaux, la cryptographie, l'architecture des ordinateurs, la manipulation des bases de données, l'algorithmique, la programmation etc.

Les points étudiés cette année sont l'algorithmique et la programmation dans le langage Python. L'algorithmique est l'étude des algorithmes, c'est-à-dire l'étude de procédures automatiques permettant de résoudre certaines tâches. Les algorithmes ne sont pas écrits dans un langage particulier. La programmation consiste alors à traduire les algorithmes dans un langage compréhensible par un ordinateur. Il existe de nombreux langages informatiques. Celui étudié en BCPST est le langage Python. Il a l'avantage d'être simple d'utilisation et est très populaire en particulier auprès des ingénieurs des sciences des données (data scientists).

Les éléments fondammentaux de programmation et d'algorithmique seront abordés tout au long de l'année.

1. Des exemples de programmes et d'algorithmes

Les exemples présentés pourront être survolés dans un premier temps. Il seront plus étudiés de manière plus approfondie tout au long de l'année.

1.1 Résolution d'équations du second degré

On fixe $a$, $b$, $c$ trois réels, avec $a\neq 0$. On cherches les solutions de l'équation d'inconnu réel $x$ suivante : $$ ax^2+bx+c=0.$$ On rappelle que pour ces équations, on calcule d'abord le discriminant $\Delta$ qui est égal à $b^2 -4ac$. Suivant la valeur de $\Delta$, on a alors différentes possibilités.

  • Cas 1 : $\Delta > 0$. L'équation a exactement deux solutions réelles, $x_1=\frac{-b+\sqrt{\Delta}}{2a}, x_2 =\frac{-b-\sqrt{\Delta}}{2a}$.

  • Cas 2 : $\Delta = 0$. L'équation admet un unique solution, $\frac{-b}{2a}$.

  • Cas 3 : $\Delta <0$. L'équation n'a pas de solution réelle.

In [5]:
# Ce qui donne en langage Python :
def solutions_eq(a,b,c) :
    delta = b**2 -4*a*c
    if delta >0 : 
        print((-b+(delta)**0.5)/(2*a), (-b-(delta)**0.5)/(2*a))
    elif delta == 0 :
        print(-b/(2*a))
    else :
        print("pas de solution réelle")

solutions_eq(1,-1,-1)
solutions_eq(1,2,1)
solutions_eq(1,-1,1)
1.618033988749895 -0.6180339887498949
-1.0
pas de solution réelle

1.2 Un calcul de somme

On fixe $n$ un entier naturel. On aimerait calculer la somme $S_n$ définie par : $$S_n = \sum_{k=0}^n k.$$

Autrement dit, par définition $S_n$ est égale à $0+1+2+3+\cdots+n.$ Ainsi :

  • $S_2 = 0+1+2= 3$,
  • $S_3 = 0+1+2+3=6$,
  • $S_{10}=0+1+2+3+4+5+6+7+8+9+10 = 55$.
In [9]:
# Ce qui donne en langage Python :
def somme(n) :
    S = 0
    for k in range(n+1) :
        S = S+k
    print(S)

somme(2)
somme(3)
somme(10)
3
6
55

1.3 À la recherche du codon AUG dans une séquence d'ARN

Une séquence d'ARN peut être modélisée informatiquement par une suite de lettres composée de $A,U,G,C$. Le codon $AUG$ joue un rôle important dans cette séquence : il est le premier à être traduit par un ribosome. Il peut donc être intéressant de retrouver la première apparition de ce codon dans une séquence donnée.

Par exemple :

  • dans la séquence $S=AUUGAUGCC$, $AUG$ apparaît la première fois à l'indice 4 (Le premier caractère est indexé par $0$).

  • dans la séquence $S=CCAUCCGAUGUUAAUAUGAGG$, $AUG$ apparaît la première fois à l'indice $7$ une deuxième fois à l'indice $14$. La valeur affichée est donc $7$.

  • la séquence $S=AUCCUGGAGUAAUCAUUACCUACACA$ ne contient pas le codon $AUG$. Par convention, dans le cas où $AUG$ n'apparaît pas, affiche la valeur $-1$.

In [8]:
#Ce qui donne en langage Python :

def apparait(sequence) :
    N=len(sequence)
    for i in range(N-2) :
        c = sequence[i]+sequence[i+1]+sequence[i+2]
        if c=="AUG" :
            print(i)
            return
    print(-1)
    return

apparait("AUUGAUGCC")
apparait("CCAUCCGAUGUUAAUAUGAGG")
apparait("AUCCUGGAGUAAUCAUUACCUACACA")
4
7
-1

2. Débuter en Python

On présente les premiers éléments de syntaxe et les différents mots-clés permettant de communiquer avec l'ordinateur en langage Python.

2.1 Les types usuels

Il existe de nombreux objets de nature différente en Python. La nature d'un objet est appelé type. Les types d'objet que l'on manipulera régulièrement sont les suivants :

  • bool pour booléen (boolean en anglais),
  • int pour entier (integer en anglais),
  • float pour nombre flottant (floating-point number en anglais), cette famille de nombres permet de représenter informatiquement les nombres réels.
  • str pour chaîne de caractères (string en anglais), ce type est utilisé pour représenter informatiquement un mot, un texte.

2.1.1 le type bool

Il existe exactement deux booléens : True et False. Ceci correspond aux valeurs de vérité possibles en mathématiques. Les opérateurs not, and, or sont les analogues respectifs du non, et, ou logiques.

In [11]:
# Exemples Python : 
#print est une fonction d'affichage on détaillera dans la suite son fonctionnement
print(not(True))
print(True and False)
print(False or True)
print((True or False) and (False and True)) 
False
False
True
False

2.1.2 le type int

Le type int permet de représenter les entiers relatifs en Python. L'addition, la soustraction, la multiplication, la division entière (quotient de deux entiers), le modulo (reste de la division euclidienne), l'exponentiation sont respectivement représentés par les symboles +, -, *, //, %, **.

In [13]:
#Exemples Python : 
print(1+47)
print(52+(-3))
print(78-123)
print((-45)*(-33))
print(5//3)  # il s'agit du quotient de 5 par 3.
print(5%3)  # il s'agit du reste de la division euclidienne de 5 par 3.
print(5**3) # il s'agit de 5 puissance 3.
48
49
-45
1485
1
2
125

2.1.3 le type float

Le type float permet de représenter les nombres réels en Python. Les nombres réels ne pouvant être encodés que de manière approchée : les nombres réels ayant une infinité de chiffres après la virgule et le nombre de valeurs représentables par un ordinateur étant fini, une représentation exacte des nombres réels est impossible. L'addition, la soustraction, la multiplication, le quotient, l'exponentiation sont respectivement représentés par les symboles +, -, *, /, **.

In [14]:
#Exemples Python :
print(3.0+5.544)
print(-3-4.566)
print(4.005*0.0066)
print(45.87/(-34.567))
print(0.5**0.788)
8.544
-7.566
0.026432999999999998
-1.326988167905806
0.5791464030973216

2.1.4 le type str

Le type str permet de représenter informatiquement un texte. Celui-ci est vu comme une séquence de lettres comprises entre des guillemets. Par exemple,

In [17]:
print("tototoa")
print(" ff,dsfksd,g dfsdgggsdg fd  s")
tototoa
 ff,dsfksd,g dfsdgggsdg fd  s

sont des chaînes de caractères.Il existe une chaîne spéciale, appelée la chaîne vide qui correspond à un texte ne contenant aucun caractères. Elle est représentée en Python par "". La fonction len (comme length) permet de connaître la longueur d'une chaîne de caractères c'est-à-dire le nombre de caractères composant la chaîne. Il est possible de connaître la valeur d'un caractère en position i de la chaîne s à l'aide des crochets. Ainsi, s|i] est la valeur du caractère à la position i de s. Attention, le premier caractère est en position 0. L'opérateur + permet de concaténer deux chaînes de caractères, c'est-à-dire de mettre bout à bout les deux chaînes.

In [19]:
# Exemples en Python : 
print("")
print("Hello world !")
print(len("Hello world !"))
s = "Hello world !" # on effectue une affectation
print(s[5])
t = "Allo"
print(s+t)
print(t+s)
Hello world !
13
 
Hello world !Allo
AlloHello world !

2.2 Affectations et comparaisons

2.2.1 Affectations

Pour manipuler les objets de manière plus simple ou pour garder en mémoire des valeurs, il est possible d'affecter une valeur arbitraire à une variable. À l'exception des mots-clés, il est possible de donner n'importe quel nom à une variable. Étant donnée une variable Nom, pour lui affecter l'objet valeur, on écrit :

Nom = Valeur
In [6]:
# Exemples en Python :
n = 455 # on affecte à la variable n la valeur 455. Cela revient à dire en maths : posons n égal à la valeur 455.
Apple = 3.14159 # on peut le nom que l'on veut.
chat = "gros minet" # on peut donner un nom de variable adapté à la valeur  
vrai = False  # ou donner un nom absurde. Mais cela est très déconseillé !
print(n,Apple,chat,vrai)
455 3.14159 gros minet False

Remarque : Nom et Valeur ne jouent pas le même rôle. Écrire Valeur=Nom modifie les variables de manière différente.

Il est possible de modifier une variable en faisant appel à d'autres variables. Illustrons cela par des exemples Python.

In [10]:
# Exemple 1 : on modifie S à l'aide de lui-même
print("Exemple 1 : ")
S = 45
print(S)
S = 2*S
print(S)
#Exemple 2 : 
print("Exemple 2 : ")
S = 45
T = 50
print(S,T)
S = T-S
print(S)
Exemple 1 : 
45
90
Exemple 2 : 
45 50
5

2.2.2 L'égalité

Le symbole = est utilisé de plusieurs manières en mathématiques :

  • on peut l'utiliser pour définir des objets. Cela correspond aux phrases du type: "posons x=5", "on définit S par la valeur 49".
  • Il peut également être utilisé pour construire une proposition exprimant l'égalité entre deux valeurs. Cela correspond aux phrases du type :"2+2=4", "Résoudre l'équation d'inconnu réel x : 3x+7 = 3".

Le premier cas correspond à l'affectation en Python. Le test d'égalité entre deux valeurs correspond aux deuxième cas. En Python, pour tester si A est égal à B on écrit :

A==B.

Notons que A==B a comme type Bool. Ainsi, lorsque A est bien égal à B la valeur A==B est égale à True. Dans le cas contraire, A==B a pour valeur False.

In [17]:
# Exemples Python :

print(2+2==4)
print(2+2==5)

# on définit S et T : 
S = 5 
T = 4  

print(4*S == 4*T)
print(4*S == 5*T) # on peut effectuer des tests d'égalité avec des variables.
True
False
False
True

2.2.3 Autres symboles de comparaison

Les symboles Python <, <=, >, >=, != correspondent respectivement à "inférieur strict", "inférieur ou égal", "supérieur strict", "supérieur ou égal", "différent de". Lorsque l'on écrit A < B, on teste si A est effectivement inférieur strict à B. Remarquons que A < B a comme type Bool. Dans le cas où A est bien inférieur strict à B, A < B est égal à la valeur True. Dans le cas contraire, A < B a pour valeur False.

Les autres symboles fonctionnent de la même manière.

2.3 Quelques fonctions utiles

2.3.1 Les fonctions d'affichage et de saisie

Pour "communiquer" simplement avec l'ordinateur en langage Python, on pourra faire appel aux fonctions suivantes :

  • la fonction d'affichage : print. Elle permet d'afficher la ou les valeurs données en arguments.

  • La fonction de saisie : input. Elle permet à l'ordinateur d'enregistrer les données saisies au clavier.

La fonction print affichant les valeurs voulues, elle est pratique pour comprendre la façon dont procède l'ordinateur. Elle est donc utile dans les phases de debuggage. La fonction input permet à l'utilisateur d'interagir avec l'ordinateur. Elle peut être utilisée pour récupérer des messages fournis par l'utilisateur.

En résumé,

  • print : l'ordinateur vous "parle",
  • input : l'ordinateur vous "écoute".
In [5]:
# Exemples d'utilisation de la fonction print

print("Allo le monde !")
s = 777  
print(s)
t = "on écrit ce que l'on veut"
print(t)
print("t")
Allo le monde !
777
on écrit ce que l'on veut
t
In [7]:
# Exemple d'utilisation de la fonction input
T = input()
In [8]:
print(T)
sqccc
In [9]:
type(T) # fonction permettant de connaître le type de la variable T. 
Out[9]:
str

Il est possible d'enregistrer la valeur saisie dans une variable. Attention, ce qui est saisi au clavier est vu par l'ordinateur comme une chaîne de caractères. Il existe des fonctions de conversion permettant de manipuler l'objet voulu.

2.3.2 la fonction type et les fonctions de conversion

Présentons diverses fonctions :

  • la fonction type. Elle permet de connaître le type d'une valeur ou d'une variable.
  • La fonction int. Si cela est possible, elle permet de convertir un objet en entier.
  • La fonction float. Si cela est possible, elle permet de convertir un objet en nombre flottant.
  • La fonction str. Elle convertit un objet en chaînes de caractères.
In [14]:
#Exemples en Python :

S = 777
print(type(S))
t = "121"
print(t, type(t))
tt = int(t)
print(tt, type(tt))
ex = "3.14"
exo = float(ex)
print(exo, type(exo))
<class 'int'>
121 <class 'str'>
121 <class 'int'>
3.14 <class 'float'>

3. Travaux pratiques

3.1 Pyzo

Le logiciel Pyzo est un environnement de développement pour Python. Il s'agit d'une application permettant de travailler avec le langage Python de manière simple. Donnons un aperçu de l'interface.

In [3]:
from IPython.display import Image
Image("./Pyzo.png")
Out[3]:

Les deux parties importantes de l'interface sont :

  • l'interpréteur,
  • le code source.

L'interpréteur correspond à la zone rectangulaire contenant In [1]. Il est le lieu de communication direct avec l'ordinateur. C'est lui qui permet d'interagir avec ce dernier. Un inconvénient de l'interpréteur est que tout message écrit dans celui-ci est temporaire. Il peut donc être utile d'écrire les programmes dans un fichier à part. En informatique, un tel fichier est appelé code source. Dans le cas de Pyzo, on voit la présence du code source. Sur l'image, celui-ci a pour nom tmp1.

Pour éxécuter un code écrit dans le fichier source, il suffit de sélectionner le programme correspondant et de l'éxécuter en cliquant sur run et de choisir l'option appropriée.

3.2 Exercices guidés

Exercice 1

  1. Saisissez le code suivant dans le fichier source :
In [2]:
print("saisissez deux entiers.")
n = int(input())
m = int((input()))
print(n+m)
saisissez deux entiers.
9

puis éxécutez le code.

  1. Saisissez deux entiers arbitraires. Quelle est la valeur affichée ?

  2. De la même façon, écrire un programme demandant à l'utilisateur de saisir deux entiers n, m et qui affiche la valeur $\frac{3n+m}{n^2+m^2+1}$.

Exercice 2

  1. On considère le programme suivant :
In [ ]:
chaine = "Ceci est le premier cours d'informatique."
print(chaine[4], len(chaine))

Expliquer l'affichage de celui-ci.

  1. Écrire un programme qui demande à l'utilisateur de saisir son prénom et qui affiche le nombre de lettres de celui-ci.

3.3 Exercices

Exercice 1

On considère le programme suivant :

In [3]:
n = 78
m = 13
a = n
n = m
m = a
  1. À l'issue du programme, quelles sont les valeurs de $n$ et $m$ ?
  2. Supprimer la dernière ligne puis remplacer la ligne 3 par m = n. À l'issue du nouveau programme, quelles sont les valeurs de $n$ et $m$ ? Expliquer.

Exercice 2

Écrire un programme qui demande à l'utilisateur de saisir une chaîne de caractères et qui affiche True s'il y a un nombre pair de caractères et False sinon.

Exercice 3

Écrire un programme qui lit un nombre entier correspondant aux nombres de secondes et convertit celui-ci en heures minutes, secondes. Par exemple, si l'utilisateur saisit 3698, on obtient l'affichage suivant :

3698 s correspondent à 1 h 1 mn 38 s.

Exercice 4

Écrire un programme qui demande à l'utilisateur de saisir une chaîne de caractères et qui affiche les cinq derniers caractères de la chaîne.

In [ ]: