Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Introduction : markdown

Syntaxe

Sous-sous titre

Ceci est un texte qui peut être mis en forme. On peut écrire des maths . On peut écrire du code : print("Hello")

<h1>Ceci est du html</h1>
<a href="cours">Mon cours</a>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc odio, viverra
maximus sodales sit amet, facilisis sit amet enim. Donec a scelerisque lacus.
Nullam laoreet eget orci id ornare.

Il faut une ligne vide pour changer de paragraphe.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc odio, viverra
maximus odales sit amet, facilisis sit amet enim. Donec a scelerisque lacus.
Nullam laoreet eget orci id ornare.

- une
- liste
- de
- choses
  - sous
  - liste

1. une
2. liste
3. numérotée

---

Après la ligne

Ecrire des maths : $x^2$ ou une formule séparée : $$\frac{x^2}{\sqrt{3}}$$

Les bases

Les types

Les nombres

2 types de nombres en python :

  • les nombres entier (int)
  • les nombres à virgule (float)

La fonction type(donnee) renvoie le type de la donnée en argument.

type(2)
int
type(2.)
float

Les opérations disponibles :

  • addition : +
  • soustraction : -
  • multiplicaiton : *
  • division : /
  • division entière : //
  • modulo (reste de la division) : %
  • puissance : **
# <---- ceci est un commentaire
print(2+2) # ceci est une addition

# division
print(3/2)

# division entière
print(3//2)
# reste
print(3%2)

4
1.5
1
1
# Le python n'est pas limité dans la
# précision des entiers

print(42**150)
30718044109628362431083481022093347337522521205249165162887883178792856
18913242769221546233801029309660240744684870161068642242819317186478113
20581112979155344834823272145421950205151779439580895845237852365648330
8658593843859108631095881498624
# Attention aux calculs avec des nombres à virgule
print(0.2+0.1)
0.30000000000000004
# Conversions de type

print(float(2))
print(int(3.14159))
print(int(3.9999))
2.0
3
3

Autres types (à voir plus tard)

  • booléens (vrai/faux)
  • chaînes de caractères ("bonjour")
  • listes & les n-uplets
  • dictionnaires
  • objets
  • ...

Les variables

Une variable est un espace de mémoire nommé.

On assigne une valeur à une variable avec le signe égal (=)

a=3

met la valeur 3 dans la case mémoire nommée a

  • si la case existe déjà, on remplace la valeur existante
  • si la case n'existait pas, on la crée et on met la valeur dedans

Règles pour les noms des variables :

  • en minuscules
  • sans accents
  • sans espaces (utiliser le _ tiretduhuit)
  • commence par une lettre

Bon :

  • a
  • ma_variable
  • mon_resultat

Pas bon :

  • maVariable
  • ma Variable
  • mon Résultat
x=3
print(x)
3
# Raccourcis intéressants :


x += 3 # pareil que x = x + 3
x -= 3 # pareil que x = x - 3
x /= 2 # pareil que x = x / 2
x *= 5 # pareil que x = x * 5

# Assignation multiple
x = 0
y = 0
z = 0
x = y = z = 0


Exercices

Exercice 1

Avec a=1 et b=2, prévoir la valeur de a += (b-3)

a=1
b=2
a += (b-3) # a <---- a + (b-3)
print(a, b)
0 2

Attention : le signe = est une opération d'affectation (parfois écrite dans d'autres langages <--- : de la droite vers la gauche)

Exercice 2

avec a="toto" et b="pouet"... inverser le contenu de a et de b

a="toto"
b="pouet"
print("au départ : ", a, b)

# a vous de jouer
# b <--- a
# a <--- b

c = a
print("après c=a", a,b,c)
a = b
print("après a=b : ", a,b,c)
b = c
print("après b=c : ", a,b,c)

print("résultat :", a, b)

au départ :  toto pouet
après c=a toto pouet toto
après a=b :  pouet pouet toto
après b=c :  pouet toto toto
résultat : pouet toto

Les fonctions

Les fonctions et les librairies

Par défaut, le python a très peu de fonctionnalités. Mais il existe une énorme bibliothèque de fonctions qu'on peut utiliser dans nos programmes. L'index de la bibliothèque se trouve https://docs.python.org section Library Reference.

Pour utiliser une fonction d'une bibliothèque, il faut l'importer (= dire à Python de charger le code de la fonction)

import math  # bourrin : importe TOUTE la bibli
math.sqrt(2)
math.cos(3)
# mieux : importation sélective
from math import sqrt,cos
sqrt(2)
cos(3)
# PAS BIEN DU TOUT, NE JAMAIS FAIRE
from math import *
cos(3)
sinh(12)
from math import cos, sin, pi
print(sin(3.14))
print(sin(pi))
0.0015926529164868282
1.2246467991473532e-16
print(pi)
3.141592653589793
import math
math.sin(math.pi)
1.2246467991473532e-16

Exercices

Exercice 1

Calculer le PGCD de 4956 et 8052... (en anglais: GCD)

from math import gcd
gcd(4956, 8052)
12

Exercice 2

Calculer la racine carrée de 40!.. idem, RTFM

# en anglais : factorial et square root
from math import factorial, sqrt
sqrt(factorial(40))
9.032802905233224e+23

Créer ses propres fonctions

Une fonction est un ensemble d'instructions avec un nom.

exemple : je veux

  • multiplier un nombre par 5
  • lui ajouter 12
  • afficher "bip bip"

et je veux le faire plusieurs fois

a = 10
a = a * 5
a = a + 12
print("bip bip")

a = 20
a = a * 5
a = a + 12
print("bip bip")

a = 4
a = a * 5
a = a + 12
print("bip bip")

# ^^^^ trop de répétitions, on fait mieux

# définition de la fonction :
#   a est un argument de la fonction
def mafonction(a):
    a = a * 5
    a = a + 12
    print("bip bip")

# appel de la fonction
mafonction(10)
mafonction(20)
mafonction(4)



bip bip
bip bip
bip bip
bip bip
bip bip
bip bip

Une fonction en maths : (elle prend la valeur de x, la multiplie par 3 et ajoute 2) s'écrit en python :

def f(x):
    return 3*x+2

Plus précisément :

  • le nom de la fonction = mêmes contraintes que pour le nom des variables (minuscules, pas accents ni espaces)
  • on définit la fonction avec le mot clef def
  • entre parenthèses, on fournit zéro ou plusieurs arguments
  • on n'oublie pas les deux points à la fin de la définition
  • le corps de la fonction (= les instructions qui font partie de la fonction) sont indentées (décalées par rapport à la marge)
  • la réponse (éventuelle) de la fonction est donnée avec le mot clef return
def f(x):
    return 3*x+2
print(f(3))
print(f(f(1)))
print(f(f(f(f(f(f(f(3))))))))
11
17
8747
# Il faut fournir les arguments...
print(f())
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-55-04323a1e865c> in <module>
      1 # Il faut fournir les arguments...
----> 2 print(f())


TypeError: f() missing 1 required positional argument: 'x'
# Une fonction peut avoir des arguments par défaut
# le b=0 signifie la valeur utilisée si
#  la fonction est appelée sans b
def affine(x, a, b=0):
    return a*x+b

print(affine(2,3,5))
print(affine(2,3,0))
print(affine(2,3))
11
6
6
# Passage des arguments par position
# dans le même ordre que la définition
# Exemple
print(affine(2,3,5))

# Passage des arguments par nom
# ordre indifférent
print(affine(a=3,b=5,x=2))
print(affine(a=3,x=2))

# Mix de par position et par nom
# attention : les arguments par position sont en premier
print(affine(2,3,b=5))

11
11
6
11
# Il y a des variables "internes" à la fonction (locales),
# il y a des arguments
# il y a des variables "externes" (définies en dehors de la fonction)

toto = 1
titi = 2
tata = 3


def mafonction(titi, tutu):
    toto = 4  # recrée une variable toto **locale** (existe pas dehors)
    print("toto = ", toto)
    print("titi = ", titi) # argument de la fonction (donné à l'appel)
    print("tata = ", tata) # tata : pas argument, pas défini dans la fonction
                           # ==> on va chercher au dessus dans le prog principal
    print("tutu = ", tutu) # argument (donné à l'appel) = local

mafonction(titi=7, tutu=8)
print("---------------------")
print("toto = ", toto)
print("titi = ", titi)
print("tata = ", tata)
# print("tutu = ", tutu) ne marche pas car tutu n'existe que dans la fonction


toto =  4
titi =  7
tata =  3
tutu =  8
---------------------
toto =  1
titi =  2
tata =  3
# Une fonction est un "objet" python comme les autres

def yo():
    print("yo")
def yi():
    print("yi")

print(type(yo))
# on peut la mettre dans une variable
ya = yo
ya()

# on peut donner une fonction en argument à une fonction
def double(f):
    print("Je dis")
    f()
    print("et puis")
    f()

double(f=yo)
double(yi)
<class 'function'>
yo
Je dis
yo
et puis
yo
Je dis
yi
et puis
yi

Exercices

Exercice 1

définir une fonction pythagore(cote1, cote2) qui renvoie l'hypothénuse quand on lui donne 2 côtés

def pythagore(cote1, cote2):
    from math import sqrt
    return sqrt(cote1**2+cote2**2)

def pythagore(cote1, cote2):
    from math import sqrt
    a2 = cote1**2
    b2 = cote2**2
    c2 = a2+b2
    return sqrt(c2)
pythagore(3,4)
5.0

Exercice 2

Une équation . Faire une fonction deg2 prenant comme arguments a, b, c et x, avec b qui vaut 1 par défaut, c qui vaut 0 par défaut et qui renvoie le résultat de

def deg2(x,a,b=1,c=0):
    return a*x**2+b*x+c
deg2(1,1,c=3)
5

Exercice 3

le produit scalaire de 2 vecteurs et est défini par

Définir une fonction produit_scalaire qui renvoie le produit scalaire de 2 nombres Si on ne donne pas une coordonnée de vecteur, par défaut elle est nulle

# Exo 2 : le produit scalaire de 2 vecteurs (ux, uy) et (vx, vy)
# est défini par u.v=ux*vx+uy*vy
# Définir une fonction produit_scalaire qui renvoie le produit
# scalaire de 2 nombres
# Si on ne donne pas une coordonnée de vecteur, par défaut elle
# est nulle

def produit_scalaire(ux=0,uy=0, vx=0, vy=0):
    return ux*vx+uy*vy

# La tester avec u=(1,0) v=(0,1)  et avec u=(3,4), v=(0,6)
print(produit_scalaire(1,0,0,1))
print(produit_scalaire(ux=1,vy=1))
print(produit_scalaire(3,4,0,6))
print(produit_scalaire())
0
0
24
0

Les structures du langage

Les booléens et les tests

Un booléen : valeur vraie ou fausse / 0 ou 1 / en python : True ou False

type(True)
bool
type(False)
bool

Les opérations sur le booléens sont :

  • et = and
  • ou = or
  • non = not
print("vrai et vrai = ", True and True)
print("vrai ou faux = ", True or False)
print("non vrai = ", not True)
print("vrai non-et faux = ", not(True and False))
vrai et vrai =  True
vrai ou faux =  True
non vrai =  False
vrai non-et faux =  True

Les tests renvoient une valeur booléenne

"est-ce que machin est plus grand que truc ?" : vrai / faux

liste des tests disponibles :

  • > supérieur
  • < inférieur
  • >= supérieur ou égal
  • <= inférieur ou égal
  • == égalité
  • != différent
  • in cf plus tard
print(3<4)
print(2>=2)
print(3!=2)
True
True
True

Exercices

Exercice 1

Ecrire un test permettant de vérifier que 3 est bien dans l'intervalle [2,6[

print(2<=3 and 3<6)
print(2<=3<6)
True
True

Exercice 2

Ecrire une fonction intervalle renvoyant vrai ou faux selon que l'argument x est à l'intérieur de l'intervalle [a, b] sachant que a et b sont deux arguments de la fonction, avec a=0 et b=100 par défaut

def intervalle(x, a=0, b=100):
    return x >= a and b >= x

# Une manière de tester automatiquement qu'une fonction
# fait ce qu'on veut :
assert intervalle(12, 5, 15) == True
assert intervalle(19, 5, 15) == False

Les structures conditionnelles

Plusieurs manières de faire des actions qui dépendent d'une condition :

SI condition
ALORS on fait machin

SI condition
ALORS on fait machin
SINON on fait truc

SI condition
ALORS on fait machin
SINON SI une autre condition
ALORS on fait truc
SINON SI une encore autre condition
ALORS on fait bidule
SINON on fait chouette

Au niveau de la syntaxe, le python ne précise pas le "ALORS".

# Exemple complet

age = 56
if age < 6:
    print("Regarde thcoupi")
elif age < 9:
    print("Regarde power rangers")
elif age < 12:
    print("Joue avec ta PS4")
elif age < 16:
    print("Quitte le téléphone et fais tes devoirs")
elif age < 80:
    print("Abonne toi à Netflix")
else:
    print("Regarde Rex et Derrick")
Abonne toi à Netflix

Exercice 1 : comparaison

Ecrire une fonction compare(a, b) qui affiche (print)

  • "plus petit" si a < b
  • "plus grand" si a > b
  • "pareil" si a egal b
def compare(a,b):
    if a < b:
        print("plus petit")
    elif a > b:
        print("plus grand")
    elif a == b:
        print("pareil")
    # else:
    #    print("pareil")

compare(2,3)
compare(3,2)
compare(3,3)
plus petit
plus grand
pareil

Exercice 2 : factorielle

La factorielle d'un nombre est le produit de

Ecrire une fonction factorielle(n) qui renvoie la factorielle du nombre n d'après l'algorithme suivant :

SI n est égal à 1
ALORS renvoie 1
SINON renvoie n * factorielle(n-1)
def factorielle(n):
    if n == 1:
        return 1
    else:
        return n*factorielle(n-1)
def factorielle(n):
    if n == 1:
        return 1
    return n*factorielle(n-1)

factorielle(5)
120

Les boucles (épisode 1)

TANT QUE une condition
REPETE des instructions

La condition est évaluée au début de chaque itération.

En python :

while CONDITION:
    instruction1
    instruction2
endehorsduwhile

Les instructions de la boucle sont exécutées TANT QUE la condition est VRAIE

# Exemple : compter jusqu'à 10
compteur = 1
while compteur <= 10:
    print(compteur, end=" ")
    compteur = compteur + 1 # compteur += 1
print("Fini...")
1 2 3 4 5 6 7 8 9 10 Fini...
# boucle infinie = pas bien
# mais si on doit l'utiliser, il faut avoir un moyen d'en sortir
# : instruction break
compteur = 0
while True:
    print("yo", end=" > ")
    compteur += 1
    if compteur >= 5:
        break
yo > yo > yo > yo > yo >

L'instruction continue permet de passer directement à l'itération suivante

compteur = 1
while compteur <= 10:
    compteur += 1
    # si le reste de la division par 2
    # de compteur est nul = compteur est
    # un nombre pair
    if compteur % 2 == 0:
        print("je suis pair")
        continue
    print("je suis impair")

print("FINI")
je suis pair
je suis impair
je suis pair
je suis impair
je suis pair
je suis impair
je suis pair
je suis impair
je suis pair
je suis impair
FINI

Exercices

Exercice 1 : compter de différentes manières

Ecrire plusieurs fonctions multiples_de(n) qui compte de 0 jusqu'à 1000 en affichant uniquement les multiples de n.

Exemple multiples_de(3) : 0, 3, 6, 9, 12...

# Exercice 1

def multiples_de(n):
    i = 0
    while i<=1000:
        # est ce que i est divisible par n
        if i % n == 0:
            print(i, end=" ")
        i += 1

def multiples_de2(n):
    i = 0
    while i<=1000:
        # est ce que i est divisible par n
        print(i, end=" ")
        i += n

def multiples_de3(n):
    i = 0
    while i*n<=1000:
        # est ce que i est divisible par n
        print(i*n, end=" ")
        i += 1
multiples_de(13)
0 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208 221 234 247
260 273 286 299 312 325 338 351 364 377 390 403 416 429 442 455 468 481
494 507 520 533 546 559 572 585 598 611 624 637 650 663 676 689 702 715
728 741 754 767 780 793 806 819 832 845 858 871 884 897 910 923 936 949
962 975 988
multiples_de2(13)
0 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208 221 234 247
260 273 286 299 312 325 338 351 364 377 390 403 416 429 442 455 468 481
494 507 520 533 546 559 572 585 598 611 624 637 650 663 676 689 702 715
728 741 754 767 780 793 806 819 832 845 858 871 884 897 910 923 936 949
962 975 988
multiples_de2(13)
0 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208 221 234 247
260 273 286 299 312 325 338 351 364 377 390 403 416 429 442 455 468 481
494 507 520 533 546 559 572 585 598 611 624 637 650 663 676 689 702 715
728 741 754 767 780 793 806 819 832 845 858 871 884 897 910 923 936 949
962 975 988

Exercice 2 : factorielle

Calculer la factorielle de n avec une boucle while

def factorielle(n):
    i = 1
    etape = 1
    while i <=n:
        etape *= i  # etape = etape * i
        i += 1
    return etape

# On teste ici le résultat de la fonction
# syntaxe : assert UN TEST QUI DOIT RENVOYER TRUE, message d'erreur


assert factorielle(5) == 1*2*3*4*5, "non ça marche pô"
assert factorielle(1) == 1, "non ça marche pô"
assert factorielle(10) == 1*2*3*4*5*6*7*8*9*10, "non ça marche pô"

Listes et n-uplets

Une liste est une structure de données qui permet de stocker des valeurs les unes à la suite des autres, de manière séquentielle.

Chaque élément est associé à une position dans la liste. Attention : les positions ne commencent pas à 1 mais à 0 car les positions sont en fait des décalages par rapport au début de la liste.

On écrit une liste entre crochets []. Exemple : [1, 2, 3]

mes_courses = ["pain","lait","beurre","camembert","masques"]

Pour récupérer un élément d'une liste : on utilise la notation [position]. Exemple : mes_courses[2] # beurre

print(mes_courses[2])
print([1,2,3][1])
print(["pain","lait","beurre","camembert","masques"][2])
beurre
2
beurre

Pour connaitre la longueur d'une liste : la fonction len(liste) renvoie le nombre d'éléments de la liste.

attention le dernier élément d'une liste est situé à la position len(liste)-1

On peut récupérer des éléments en partant de la fin de la liste en utilisant une position négative

  • [-1] renvoie le dernier élément
  • [-2] renvoie l'avant dernier élément
assert mes_courses[3] == "camembert"
assert mes_courses[-2] == "camembert"
assert mes_courses[len(mes_courses)-2] == "camembert"

Lorsqu'on essaie de récupérer un élément à une position qui n'existe pas , on déclenche une erreur (une exception) IndexError

mes_courses[999]
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-161-a8e2444d3ef1> in <module>
----> 1 mes_courses[999]


IndexError: list index out of range

Un n-uplet est une liste non modifiable. On l'écrit entre parenthèses, voire sans aucune parenthèse si le contexte le permet

alphabet1 = ("A", "B", "C", "D")
alphabet2 = "A", "B", "C", "D"
print(type(alphabet2))
print(type([1,2,3]))

<class 'tuple'>
<class 'list'>

On peut avoir des listes dans des listes

morpion = [
    [" ", "x", "o"],
    ["x", " ", "W"],
    ["x", " ", " "]
]
print(morpion[1])
print(morpion[1][2])

['x', ' ', 'W']
W
tableau = [[3,4,5,6], [1,2,42]]
assert 4 == tableau[0][1]
assert 42 == tableau[1][2]
assert 6 == tableau[0][3]
assert 1 == tableau[1][0]
tableau = [1,2, [3,4, [5,6, [7,8]]]]
assert 1 == tableau[0]
assert 2 == tableau[1]
assert 3 == tableau[2][0]
assert 4 == tableau[2][1]
assert 5 == tableau[2][2][0]
assert 6 == tableau[2][2][1]
assert 7 == tableau[2][2][2][0]
assert 8 == tableau[2][2][2][1]

Assignation

Remplacer dans un tableau

Assigner une valeur dans une liste, c'est écrire la valeur à la position donnée. La position doit déjà exister.

tableau = ["A", "B", "W", "D"]
tableau[2] = "C"
print(tableau)

['A', 'B', 'C', 'D']
tableau[43]="braaa"
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-176-6ead7e28e1e9> in <module>
----> 1 tableau[43]="braaa"


IndexError: list assignment index out of range
tableau[-1] = "fini"
print(tableau)
['A', 'B', 'C', 'fini']
tableau = [["A","B"], ["C", "W"]]
tableau[-1][-1]="D"
print(tableau)

tableau[0]="bouuu"
print(tableau)
[['A', 'B'], ['C', 'D']]
['bouuu', ['C', 'D']]

Autres opérations

Pour ajouter un élément à la fin d'un tableau : on utilise "append"

tableau = [1,2,3]
tableau.append(42)
print(tableau)
[1, 2, 3, 42]

Pour insérer un élément dans un tableau : on utilise insert(position, element)

tableau = [1,2,3]
tableau.insert(1,42)
print(tableau)
[1, 42, 2, 3]

Pour retirer un élément dans un tableau :

  • on utilise del tableau[pos]
  • on utilise tableau.pop(pos)
tableau = [1,2,3,4,5,6]
print(tableau)
del tableau[3]
print(tableau)
tableau.pop(1)
print(tableau)
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 5, 6]
[1, 3, 5, 6]

Les slices / morceaux de tableau

Pour récupérer juste une partie de tableau, on utilise la notation des slices : tableau[debut:fin:pas]; le début est inclus, la fin est exclue

tableau = [1,2,3,4,5,6]
print(tableau[2:3])
print(tableau[2:5])
print(tableau[0:6])
print(tableau[0:])
print(tableau[0:-1])
print(tableau[:])

[3]
[3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
# Bonus pas duuuu tout au programme
tableau = [1,2,3,4,5,6]
print(tableau[2:3:2])
print(tableau[2:5:2])
print(tableau[0:6:2])
print(tableau[0::2])
print(tableau[0:-1:2])
print(tableau[::2])
[3]
[3, 5]
[1, 3, 5]
[1, 3, 5]
[1, 3, 5]
[1, 3, 5]
# Pour la culture : pour renverser un tableau
tableau = [1,2,3,4]
print(tableau[::-1])
[4, 3, 2, 1]

Pour tester si un élément est dans un tableau : l'opérateur in

tableau = [1,2,3,4]
print(12 in tableau)
print(3 in tableau)
False
True

Pour trier un tableau, on peut utiliser la méthode tableau.sort ou la fonction sorted

tableau = [2,4,1,3]
tableau.sort() # trié en place
print(tableau)

tableau = [2,4,1,3]
tableautrie = sorted(tableau) # renvoie une copie du tableau
print(tableautrie, tableau)
[1, 2, 3, 4]
[1, 2, 3, 4] [2, 4, 1, 3]

Exercice 1 - morpion python

Créer un tableau morpion qui contient 3 lignes de 3 cases. Lorsque une case est vide, la valeur vaut 0, lorsqu'elle a été jouée par le J1 elle vaut 1, et elle vaut 2 pour le J2.

Jouer une partie de morpion en utilisant la notation morpion[][]=

morpion = [[0,0,0],
           [0,0,0],
           [0,0,0]]
morpion[1][1] = 1
morpion[0][0] = 2
morpion[2][0] = 1
morpion[0][2] = 2
morpion[0][1] = 1
morpion[2][1] = 2
print(morpion)

[[2, 1, 2], [0, 1, 0], [1, 2, 0]]

Les boucles for

Les listes sont très utiles à partir du moment où on peut accéder à tous leurs éléments de manière itérative.

Pour accéder à tous les éléments d'une liste, la structure est la suivante :

for variable_destination in liste_source:
    instruction
    instruction
maliste = ["un", "deux", "trois", "quatre"]

for truc in maliste:
    print("Je sais compter jusqu'à", truc)
print("fini")

Je sais compter jusqu'à un
Je sais compter jusqu'à deux
Je sais compter jusqu'à trois
Je sais compter jusqu'à quatre
fini

On peut avoir besoin de connaitre non seulement la valeur, mais aussi la position dans la liste à chaque itération. Dans ce cas on peut énumérer la liste.

maliste = ["un", "deux", "trois", "quatre"]
for machin, truc in enumerate(maliste):
    print(machin, truc)

0 un
1 deux
2 trois
3 quatre

Pour les boucles for, on a aussi les instructions break et continue

maliste = ["un", "deux", "trois", "quatre"]
for pos, val in enumerate(maliste):
    # dans la première varialbe : la position
    # dans la deuxième variable : la valeur
    print("Position ", pos)
    if val == "deux":
        continue
    print("Valeur", val)
    if val == "trois":
        break
Position  0
Valeur un
Position  1
Position  2
Valeur trois

Une fonction très pratique : la fonction range(debut, fin, pas), ou range(debut, fin) ou range(fin) : elle renvoie une liste de nombre, de début inclus, jusqu'à fin non inclus, avec un pas

for i in range(0,10,3):
    print(i, end=", ")
0, 3, 6, 9,
for i in range(10):
    print(i, end=", ")
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
for i in range(2,10):
    print(i, end=", ")
2, 3, 4, 5, 6, 7, 8, 9,

Exercices

Exercice 1 : Ajouter à une liste

Ecrire une fonction bonus(notes, valeur) qui ajoute valeur à chaque note de la liste notes et calcule la moyenne de l'élève.

Exemple : notes : 12, 14, 13 / valeur : 3 moyenne

def bonus(notes, valeur):
    total = 0 # sert d'accumulateur
    for n in notes:
        total += n
        total += valeur
    return total/len(notes)

bonus([12,14,13], 3)
16.0

Exercice 1 bis

Ecrire une fonction moyenne(notes) qui renvoie la moyenne des notes données dans la liste notes

def moyenne(notes):
    tot = 0
    for note in notes:
        tot = tot + note
    return tot/len(notes)

moyenne([10, 12, 14, 16])
13.0

Exercice 1 ter

Ecrire une fonction mini(notes) qui renvoie la plus petite de toutes les notes données dans notes

Ecrire une fonction maxi(notes) qui renvoie la plus grande de toutes les notes données dans notes

def mini(notes):
    derniermini = 100000000
    for note in notes:
        if note < derniermini:
            derniermini = note
    return derniermini

print(mini([14, 11, 13]))

def maxi(notes):
    derniermaxi = -100000000
    for note in notes:
        if note > derniermaxi:
            derniermaxi = note
    return derniermaxi

print(maxi([12, 14, 13]))
11
14

Exercice 2 : Moyenne coefficientée

Ecrire une fonction moyenne(notes) qui calcule la moyenne d'une liste de notes avec leur barème et leur coefficient (chaque note est donnée sous forme [12, 20, 1] : note, barème, coefficient

def moyenne(notes):
    A = 0
    B = 0
    for n in notes:
        A = A + n[0]*n[2]
        B = B + n[1]*n[2]
    return A*20/B
moyenne([[3, 5, 1], [2, 10, 3], [16, 20, 2]])
10.933333333333334

Exercice 3 : Morpion (v2)

Faire une fonction verif(morpion) qui vérifie si une grille de morpion est gagnante ou non, en utilisant des boucles for et des boucles whiles

def verif(morpion):
    # morpion[ligne][colonne]
    # Est-ce que le joueur 1 a gagné ?
    for ligne in range(3):
        for colonne in range(3):
            print("l",ligne, "c",colonne)

verif([[0,0,0], [0,0,0], [1,1,1]])
l 0 c 0
l 0 c 1
l 0 c 2
l 1 c 0
l 1 c 1
l 1 c 2
l 2 c 0
l 2 c 1
l 2 c 2

Exercice 4 : Crible d'Eratosthène

Programmer le crible d'Eratosthène d'après l'algorithme donné sur : https://fr.wikipedia.org/wiki/Crible_d%27%C3%89ratosth%C3%A8ne

Arguments par référence ou par valeur

Les listes sont représentées par une "adresse" (une référence) en mémoire. Lorsqu'on assigne une liste à une variable, la variable ne contient qu'une "référence" vers cette liste. Si la liste est assignée à plusieurs variables, elle n'existe réellement qu'une seule fois.

Si on la modifie dans une des variables, elle sera modifiée partout.

maliste = [0,1,2,3]
taliste = maliste
taliste[0] = 42
print(maliste)
print(taliste)
[42, 1, 2, 3]
[42, 1, 2, 3]
def mafonction(toto):
    # toto: argument passé par référence
    toto[1]=42
mafonction(maliste)
print(maliste)
[42, 42, 2, 3]
# solution
# Pour une liste: on peut "copier la liste" (solution correcte..)
maliste = [0,1,2,3]
taliste = maliste[:]
taliste[0] = 42
print(maliste)
print(taliste)
[0, 1, 2, 3]
[42, 1, 2, 3]
## Contre exemple
# solution
# Pour une liste: on peut "copier la liste" (solution correcte..)
maliste = [[0,1,2,3],[4,5,6,7]]
taliste = maliste[:]
taliste[0][0] = 42
print(maliste)
print(taliste)
[[42, 1, 2, 3], [4, 5, 6, 7]]
[[42, 1, 2, 3], [4, 5, 6, 7]]
# Solution propre
from copy import deepcopy
maliste = [[0,1,2,3],[4,5,6,7]]
taliste = deepcopy(maliste)
taliste[0][0] = 42
print(maliste)
print(taliste)
[[0, 1, 2, 3], [4, 5, 6, 7]]
[[42, 1, 2, 3], [4, 5, 6, 7]]

Les "compréhensions" de liste

On se retrouve souvent à faire des opérations du genre :

carres = []
for nombre in range(1,11):
    carres.append(nombre**2)
print(carres)

on peut le réécrire en "plus court" et moins compréhensible :

carres = [nombre ** 2 for nombre in range(1,11)]

On peut même mixer des conditions dans les compréhensions de liste, mais attention aux excès qui enlèvent de la lisibilité au programme

carres_pairs = [nombre**2 for nombre in range(1,20) if nombre % 2 == 0 ]
print(carres_pairs)
[4, 16, 36, 64, 100, 144, 196, 256, 324]

Les dictionnaires

Les listes permettent de stocker les objets les uns à la suite des autres, les dictionnaires permettent d'associer des clefs avec des valeurs.

exemple: un contact doit stocker nom, prénom, adresse, tel, email...

moi = {"nom": "BARBIER", "prenom": "Jean-Matthieu",
      "mail": "jm.barbier@solidev.net", "clef": "valeur"}

Les clefs peuvent être des chaînes de caractères (le plus souvent), mais aussi (presque) n'importe quel type de données. Idem pour les valeurs, qui peuvent prendre absolument n'importe quel type.

moi = {"nom": "BARBIER", "prenom": "Jean-Matthieu",
      "mail": "jm.barbier@solidev.net",
      "adresse": { "numero": 4, "rue": "clos d'ivry",
                 "ville": "houlbec", "cp": "27120"}}
print(moi)
print(moi["nom"])
print(moi["adresse"])
print(moi["adresse"]["cp"])
{'nom': 'BARBIER', 'prenom': 'Jean-Matthieu',
 'mail': 'jm.barbier@solidev.net',
 'adresse': {
    'numero': 4,
    'rue': "clos d'ivry",
    'ville': 'houlbec',
    'cp': '27120'
  }
}
BARBIER
{'numero': 4, 'rue': "clos d'ivry", 'ville': 'houlbec', 'cp': '27120'}
27120

Pour rajouter un élément dans un dictionnaire, il suffit d'assigner une valeur à une clef.

  • si la clef n'existe pas dans le dictionnaire, elle est créée
  • si elle existe, la valeur correspondante est modifiée
moi = {}
moi["mail"] = "jm.barbier@solidev.net"
print(moi)
moi["nom"] = "BARBIER"
print(moi)
moi["prenom"] = "Toto"
print(moi)
moi["prenom"] = "Jean-Matthieu"
print(moi)
{'mail': 'jm.barbier@solidev.net'}
{'mail': 'jm.barbier@solidev.net', 'nom': 'BARBIER'}
{'mail': 'jm.barbier@solidev.net', 'nom': 'BARBIER', 'prenom': 'Toto'}
{'mail': 'jm.barbier@solidev.net', 'nom': 'BARBIER', 'prenom': 'Jean-Matthieu'}
# Pour supprimer une valeur
moi["portnawak"] = 42
print(moi)
del moi["portnawak"]
print(moi)
{'mail': 'jm.barbier@solidev.net', 'nom': 'BARBIER',
 'prenom': 'Jean-Matthieu', 'portnawak': 42}
{'mail': 'jm.barbier@solidev.net', 'nom': 'BARBIER',
 'prenom': 'Jean-Matthieu'}

Pour savoir si une clef est dans un dictionnaire : mot clef in :

dico = {"toto": 1, 22: "cuicui"}
print("toto" in dico) # True
print("titi" in dico) # False
print(22 in dico) # True

On peut parcourir un tableau de 3 manières :

  • en utilisant ses clefs
  • en utilisant ses valeur
  • en utilisant clefs et valeurs
# En utilisant les clefs
for aazeaze in moi:
    print(aazeaze)
mail
nom
prenom
# En utilisant les valeurs
for sdsdf in moi.values():
    print(sdsdf)
jm.barbier@solidev.net
BARBIER
Jean-Matthieu
# En utilisant les clefs et les valeurs
for clef, valeur in moi.items():
    print(clef, valeur)
mail jm.barbier@solidev.net
nom BARBIER
prenom Jean-Matthieu

Subtilité : pour obtenir la première clef / valeur d'un dictionnaire (lors d'une recherche de maximum/minimum par exemple):

dico = {"a": 3, "b": 5}
# Première valeur
print(list(dico.values())[0])
# ou bien (plus élégant mais complexe)
print(next(iter(dico.values())))

# Première clef
print(list(dico.keys())[0])
# ou bien (plus élégant mais complexe)
print(next(iter(dico.keys())))

# Première clef et valeur
# (full classe)
k,v = next(iter(dico.items()))
print(k,v)

Divers

# Imprimer joliment
moi = {"nom": "BARBIER", "prenom": "Jean-Matthieu",
      "mail": "jm.barbier@solidev.net",
      "adresse": { "numéro": 4, "rue": "clos d'Ivry",
                 "ville": "houlbec", "cp": "27120"}}
import pprint
pprint.pprint(moi)
{'adresse': {'cp': '27120',
             'numéro': 4,
             'rue': "clos d'évry",
             'ville': 'houlbec'},
 'mail': 'jm.barbier@solidev.net',
 'nom': 'BARBIER',
 'prenom': 'Jean-Matthieu'}
import yaml
print(yaml.dump(moi, allow_unicode=True))
adresse:
  cp: '27120'
  numéro: 4
  rue: clos d'évry
  ville: houlbec
mail: jm.barbier@solidev.net
nom: BARBIER
prenom: Jean-Matthieu

Intéractivité : fonction input(message) -> str

reponse = input("Quel est votre nom ?")
print("Votre nom est : ", reponse)
Quel est votre nom ? BARBIER


Votre nom est :  BARBIER

Exercice 1 : Création d'une fiche de carnet d'adresse

Créer une fonction qui demande à l'utilisateur son nom, son prénom et son email, et qui renvoie les infos dans un dictionnaire


Exercice 2 : Création d'un carnet d'adresse

Créer une fonction qui demande à l'utilisateur combien de personnes il veut entrer, et qui ensuite demande autant de fois que désiré le nom, prénom et email à ajouter, et qui stocke ces fiches stockées à la suite les unes des autres dans une liste


Exercice 3 : Recherche dans un carnet d'adresse

Créer une fonction prenant comme arguments un carnet d'adresses et un nom, et qui renvoie la fiche dont le nom correspond si elle existe, et ne renvoie rien si rien n'est trouvé.