Premiers scripts

Nous allons commencer à rédiger des petits programmes Python. Bien entendu, ceux-ci seront au début complètement dépourvus d'intérêt. Au fur et à mesure, les choses gagneront en consistance et en efficacité pour atteindre des problèmes plus complexes.

Les variables

Les variables permettent de stocker des valeurs. Elles sont un moyen de nommer les informations pour une utilisation dans un programme. Chaque variable a un nom ; un exemple de nom de variable que nous utiliserons est monNombre. Pour stocker de l'information dans une variable, nous écrivons une commande en utilisant le signe égal (=) dans la manière suivante :

monNombre = 13
print(monNombre+1)

L'instruction très utile "a=a+1" qui n'a aucun sens mathématique est très utile en informatique :

a=3
a=a+1
print(a)
print(A) # la casse (distinction entre majuscules et minuscules) est prise en compte

En première ligne, la valeur 3 est affectée dans la place mémoire "a". En deuxième ligne, l'ordinateut calcule "a+1" puis l'affecte dans la place mémoire "a" : la variable "a" devient donc égale à 4. On vient d'augmenter (on dit aussi incrémenter) la variable "a" d'une unité. La dernière ligne confirme le fait que le langage machine différencie les lettres minuscules et majuscules, d'où le message d'erreur.

Regardez l'exemple suivant.

a=5
b=3
b=2*b-a

Quelle est la valeur prise par la variable $b$? Répondez dans la cellule ci-dessous. Vous indiquerez votre réponse dans la variable $ma\_reponse$.

# Complétez ci-dessous
ma_reponse = ...

# Test automatique de la réponse. 
# En cas d'erreur, Python vous le fera savoir !
# Si c'est bon, la cellule ne renverra rien
assert ma_reponse == b

Complément : vous trouverez tout au long de ces classeurs ces commandes python assert.

assert permet de vérifier une condition. Si la condition est vraie, il ne provoque aucun retour. Si au contraire le résultat du test est faux, assert provoque un message d'erreur Python (ce qu'on appelle une exception).

Cela permet de vous autocontrôler : en validant ces cellules contenant le mot assert, vous pourrez vérifier par vous même que vous avez bien répondu.

Les différents types de variable

Les variables peuvent contenir différents types d'informations. On dit qu'elles sont de type :

  • int : entiers (ex : -2 ; 5)
  • float : décimal (ex -2.0 ; 2e6=2000000.0)
  • str : chaîne de caractère (ex 'Bonjour' ; "Autre exemple" ; "2+3" ; "5")
  • bool : Booléen : Vrai ou Faux. (ex : 2==3, False, 3<4)
  • list : Tableau ou liste (ex : [1,'toto', 2.0] ; [[1,2],[3,4]])
a = 5.2
b = 12
c = "Je suis une chaîne de caractère"
d = [1, 4.2, "je suis un tableau"]
e = type(b)==int
# remarquez pour e la différence entre les opérateurs = et ==
assert type(b) == int

Complétez les types dans la cellule suivante selon le modèle ci-dessus. Vous utiliserez les types énumérés plus haut.

assert type(a) == ...
assert type(a/b) == ...
assert type(c) == ...
assert type(d) == ...
assert type(e) == ...

Comme vous pouvez le voir, contrairement à d'autres langages comme le langage C ou java, Python devine tout seul le type des variables. Il est inutile de lui préciser par avance. Cela est extrèmement pratique !

Même si ce n'est pas conseillé, on peut aussi changer de type en cours de route :

a="Je suis une chaîne"
type(a)
a=12 # et maintenenant je suis un nombre !!!
type(a)

Affectations simultanées

Une application très classique de l'affectation simultanée est l'échange du contenu de deux variables

a, b = 32, 10
a
a, b = b, a

# complétez les lignes ci-dessous avec les valeurs des variables a et b
assert a == ...
assert b == ...

L'affectation multiple "a, b = b, a" permet en une seule ligne d'échanger les contenus des variables a et b. Tentons maintenant d'échanger deux variables a et b sans affectation multiple :

a=12
b=30

a=b
b=a
# complétez les lignes ci-dessous avec les valeurs des variables a et b
assert a == ...
assert b == ...

On a affecté à la variable b une valeur non numérique, mais une chaîne de caractère (entre guillemets). La troisième ligne confirme l'affectation pour "a" et "b". Cependant, la quatrième ligne efface de la mémoire la valeur de "a", de sorte que "a" devient égal à "b". L'instruction "b=a" est alors inutile.

Pour contourner ce problème, il faut avoir recours à une mémoire temporaire :

a = 12
b = 30

memoire_temp=a
a = b
b = memoire_temp

assert a == 30
assert b == 12

L'absence d'erreurs à l'exécution de la cellule montre que le contenu de $a$ et $b$ a bien été échangé

Les fonctions

Les fonctions permettent de décomposer un programme complexe en une série de sous-programmes plus simples. De plus, les fonctions sont réutilisables : si nous disposons d'une fonction capable de calculer une racine carrée, par exemple, nous pouvons l'utiliser un peu partout dans notre programme sans avoir à la réécrire à chaque fois (on parle de factorisation du code)

La notion de fonction en informatique est comparable à la notion de fonction en mathématiques. Si nous avons $y = 3x+2$, pour une valeur donnée de $x$, nous aurons une valeur de $y$.

Exemple : $x=4$ donc $y= 14$ ($y = 3.4+2=14$, attention ici le point correspond au signe "multiplié").

La fonction en informatique est basée sur la même idée : Voici la syntaxe employée en Python pour définir une fonction :

def nom_de_la_fonction(parametre):
    instruction_1
    instruction_2
    return y
suite programme

La fonction renvoie la valeur contenue dans la variable y.

ATTENTION : Notez bien la présence du décalage entre la première ligne et les lignes suivantes. Ce décalage est appelé indentation, l'indentation permet de définir un bloc de code. Dans l'exemple ci-dessus, l'indentation nous permet de savoir que "instruction_1", "instruction_2" et "return y" constituent un bloc de code, ce bloc correspond au contenu de la fonction. "suite programme" ne fait pas partie de la fonction, car il n'est pas indenté. Pour indenter du code, il y a 2 solutions : mettre 4 espaces ou utiliser une tabulation. En Python il est conseillé d'utiliser les 4 espaces, mais ce n'est pas une obligation. Une chose est sûre, une fois que vous avez choisi une méthode, n'en changé surtout pas au cours d'un même programme !

source : https://pixees.fr/informatiquelycee/n_site/nsi_prem_pythonbase.html

Dans l'exemple suivant, vous constaterez la similitude entre la syntaxe python et l'écriture mathématique

# Validez cette cellule pour définir la fonctionf
def f(x):
    y=3*x-2
    return y
# Validez cette cellule pour invoquer la fonction f (lancer l'exécution du code contenu dans la fonction f) 
# La valeur 3 va alors prendre la place du paramètre x

f(3)

Les fonctions jouent un rôle fondamental en informatique. Aucun programme n'est écrit d'un bloc. Imaginez un programme comme OpenOffice qui contient plusieurs centaines de milliers de lignes de codes écrites bout à bout sans structure...

Vous devrez prendre l'habitude de concevoir vos propres fonctions pour répondre à un problème donné.

Plus tard, nous allons voir la notion d'objet qui est apparu au début des années 80 et qui vient encore enrichir ce concept de fonction. Aujourd'hui tous les langages modernes sont orientés Objet. La programmation par objet a permis l'émergence de systèmes d'exploitation offrant des interfaces graphiques évoluées (Linux, MacOs...).

Vous allez vous-même manipuler des objets quand vous allez découvrir la programmation d'interfaces graphiques pour vos projets.

Instruction conditionnelle Si...Alors...Sinon

Observez le fonctionnement de la fonction ci-dessous :

def exemple2(age):
    if age >= 18:
        return "vous êtes majeur"
    elif age > 0:
        return "vous êtes mineur"
    else : 
        return "menteur !"
  • Les clauses elif et else sont optionnelles pour la structure if.
  • Il est possible de mettre autant de elif que l'on veut si on veut tester de multiples conditions sur une variable.
  • Il ne peut y avoir au plus qu'une seule clause else dans une structure conditionnelle.

Boucle pour

La syntaxe de la boucle pour est un peu particulière : On dit à une variable de parcourir un certain intervalle.

L'intervalle en question est décrit par l'instruction range(n). Les quelques exemples ci-dessous vous illustrent le fonctionnement de cette instruction.

L'instruction print en python permet d'afficher un texte à l'écran.

for i in range(5):
    print("je répète 5 fois la même chose. Ici, i=",i)

Ce qu'il faut retenir c'est :

  • que la boucle for i in range(n) tournera n fois
  • que la variable i prendra les valeurs entières entre 0 et n-1

Importance du symbole ":"

Remarquez bien le : après le range. Cela marque le début d'un bloc.

Un bloc en python se distingue par le décalage par rapport à la marge. Il permet de délimiter le début etr la fin du contenu de la boucle pour. En effet, contrairement à la calculatrice, il n'y a par de mot clé end(TI) ou next (casio) pour signifier la fin de la boucle pour.

On retrouvera cette notion de bloc également pour les boucles tant que, les tests si... alors... sinon..., les définitions de fonction etc...

Soyez donc très attentif à la présence de ces : et au décalage de marge qui s'en suit.

On peut paramétrer un peu l'instruction range :

range(1,10)

Le compteur commencera à 1 et s'arrêtera à 9

Exemple : Expérimenter et expliquer les valeurs prises par la variable i dans la boucle

for i in range( 3,15,2) :

for i in range( 3,15,2) :
    print(i)

Dans la boucle pour,

  • la variable i est initialisée à 3 à 3
  • la variable i augmente d'un pas de 2
  • la boucle s'arrete quand i dépasse la valeur 15-1=14

Exercices

  1. Ecrire une fonction somme qui calcule la somme des entiers jusqu'à $n$ passé en paramètre.
def somme(n):
    # YOUR CODE HERE
    raise NotImplementedError()
assert somme(100) == 5050
  1. En mathématiques, on utilise la fonction factorielle d'un nombre pour calculer le produit de tous les entiers non nuls entre 1 et ce nombre. Par exemple :

Factorielle 5 (que l'on note 5!) se calcule par la formule : $5!=1\times 2\times 3\times 4\times 5=120$

Ecrire une fonction factorielle prenant en argument un entier et retournant la factorielle de ce nombre.

def factorielle(n):
    # YOUR CODE HERE
    raise NotImplementedError()
# Testez votre fontion
assert factorielle(5) == 120

Vous avez vu en première l'opérateur k parmi n noté ${n} \choose {k}$ permettant de comptabiliser le nombre de chemins menant à $k$ succès dans une répétition de $n$ expériences Succès/Echec.

On peut montrer que ce nombre de chemins peut se calculer facilement au moyen de la fonction factorielle vu plus haut : ${n \choose k }=\dfrac{n!}{k!(n-k)!}$

Ecrire une fonction coefbinom prenant en argument deux entiers $k$ et $n$ et retournant la valeur de $n \choose k$.

On pourra faire appel à la fonction factorielle vue ci-dessus.

def coefbinom (k,n):
    # YOUR CODE HERE
    raise NotImplementedError()
# On teste la fonction 
assert coefbinom(2,4) == 6

Vous voyez que des fonctions peuvent s'appeler entre elles. Le code est ainsi plus concis et plus limpide. On évite les répétitions et on limite les erreurs.

Il est donc fortement conseillé de les utiliser le plus possible dans vos programmes et votre projet.

D'une manière générale, quand vous allez chercher à écrire un programme pour réaliser une tache, avant d'écrire la moindre ligne de code, vous allez réfléchir au découpage de votre tache en sous taches qui seront éxécutées chacune par une ou plusieurs fonctions. Une fois la spécification précise de ces fonctions réalisées, alors vous pourrez commencer à écrire ces fonctions, puis votre programme.

Boucle Tant que

Exécuter la fonction exemple ci-dessous. Quel est son rôle ? Remarquez la présence des : et le décalage de marge.

def exemple():
    u=10
    n=0
    while u<20:
        u = u+1.1
        n = n+1
    return n
# Invoquez la fonction exemple ci-dessous

A vous de jouer ...

Soit $(u_n)_{n\in\mathbb N}$ la suite définie par

  • $u_0=2$
  • $u_{n+1}=0,2\times u_n+10$

Déterminer le plus petit rang $n$ pour lequel $u_n\geqslant 12.49995$

Pour cela, complétez la fonction seuil ci-dessous

  • prenant en paramètre une variable $s$ contenant le seuil à dépasser
  • renvoyant le rang $n$ à partir duquel le seuil $s$ est dépassé
def seuil(s):
    # YOUR CODE HERE
    raise NotImplementedError()

La cellule suivante doit s'exécuter sans erreur

assert seuil (12.49995) == 8