Apprendre à programmer avec

Cet après-midi, vous saurez parler une nouvelle langue

Cet après-midi, vous aurez créé un jeu avec Python

Bienvenue dans le quiz ultime!

Je pense à un nombre entre 0 et 15… devine-le !

Entre un nombre: 5

Trop petit !

Entre un nombre: 8

Trop grand !

Entre un nombre: 6

Wowwww tu as deviné en 3 essais, pas mal ! 🎉

Cet après-midi, vous aurez envie de continuer à programmer avec Python

Bonjour, moi c’est Sylvain

  • 👨‍🎓 Ingénieur logiciel
  • 👨‍💻 Développeur web depuis 20 ans
  • 💘 J’a(n)ime (des ateliers de) la programmation
  • 📖 PS : j’ai écrit un livre pour apprendre à programmer

PPS : j’aime bien les emojis 😊👍

C’est quoi un
programme ?

class LinuxArtifactJob(ArtifactJob):
    package_re = r"public/build/target\.tar\.bz2"
    product = "firefox"

    _package_artifact_patterns = {
        "{product}/crashreporter",
        "{product}/dependentlibs.list",
        "{product}/{product}",
        "{product}/{product}-bin",
        "{product}/minidump-analyzer",
        "{product}/pingsender",
        "{product}/plugin-container",
        "{product}/updater",
        "{product}/**/*.so",
    }

    @property
    def package_artifact_patterns(self):
        return {p.format(product=self.product) for p in self._package_artifact_patterns}

    def process_package_artifact(self, filename, processed_filename):
        added_entry = False

        with JarWriter(file=processed_filename, compress_level=5) as writer:
            with tarfile.open(filename) as reader:
                for p, f in UnpackFinder(TarFinder(filename, reader)):
                    if not any(
                        mozpath.match(p, pat) for pat in self.package_artifact_patterns
                    ):
                        continue

                    # We strip off the relative "firefox/" bit from the path,
                    # but otherwise preserve it.
                    destpath = mozpath.join("bin", mozpath.relpath(p, self.product))
                    self.log(
                        logging.DEBUG,
                        "artifact",
                        {"destpath": destpath},
                        "Adding {destpath} to processed archive",
                    )
                    writer.add(destpath.encode("utf-8"), f.open(), mode=f.mode)
                    added_entry = True

        if not added_entry:
            raise ValueError(
                'Archive format changed! No pattern from "{patterns}" '
                "matched an archive path.".format(
                    patterns=LinuxArtifactJob.package_artifact_patterns
                )
            )


class MacArtifactJob(ArtifactJob):
    package_re = r"public/build/target\.dmg"
    product = "firefox"

    # These get copied into dist/bin without the path, so "root/a/b/c" -> "dist/bin/c".
    _paths_no_keep_path = (
        "Contents/MacOS",
        [
            "crashreporter.app/Contents/MacOS/crashreporter",
            "{product}",
            "{product}-bin",
            "*.dylib",
            "minidump-analyzer",
            "pingsender",
            "plugin-container.app/Contents/MacOS/plugin-container",
            "updater.app/Contents/MacOS/org.mozilla.updater",
            # 'xpcshell',
            "XUL",
        ],
    )

Programme

Code source

  1. Allumer les moteurs
  2. Ajuster la vitesse à 18km/h
  3. Attendre de toucher le sol
  4. Couper les moteurs
  5. Planter le drapeau

Programme d’alunissage

  1. Mettre du sucre, de la farine et du cacao dans un saladier
  2. Ajouter de l’huile et des pépites de chocolat
  3. Mélanger
  4. Mettre au four 23 minutes à 180°
  5. Sortir du four et manger

Brownies double chocolat

🤤

Conclusion

Un programme est une recette de cuisine

écrite dans une langue appelée langage de programmation

On appelle cette suite d’instructions un « algorithme »

Python c’est…

  • 💻 Un langage de programmation interprété
  • 🎂 Créé en 1991
  • 🧔🇳🇱 Par un néerlandais
  • 📈 Un des langages les plus populaires¹
  • 🆓 Et libre
  • 👩‍🎓👩‍💻 Et utilisé dans le monde académique et professionnel

¹Source: TIOBE index, septembre 2021

Avec Python on peut créer…

  • 🌐 Des sites web (par exemple YouTube)
  • 🎮 Des jeux
  • 🆒 Des applications graphiques
  • 📊 Des programmes de statistique et d’analyse (machine learning)
  • 💡 À peu près n’importe quoi!

C’est quoi un

langage interprété ? 🤔

Instructions
(langage plus ou moins compréhensible)

name = input("Quel est ton nom?")

print("Salut " + name + "!")
print("Bienvenue dans mon premier programme.")

Instructions
(code machine / binaire)

Interpréteur
(Python)

1000010110111111011101101010110111111101011110010

L’ordinateur exécute les instructions

💻

Exécution d’un programme Python

1️⃣

2️⃣

3️⃣

4️⃣

🎉

⚠️
C’est de la culture générale, pas besoin de connaître ça par cœur !

Bon on écrit du code ou quoi ⁉️

Ouvrez votre navigateur et allez sur
https://repl.it/languages/python3

Éditeur de code (écrivez ici !)

Zone d’affichage

Cliquez pour exécuter votre code

print("Salut!")
print("C'est mon premier programme!")

Votre premier programme

print("Salut!")
print("C'est mon premier programme!")

Code Python

Exécution

  1. Afficher "Salut!"
  2. Afficher "C’est mon premier programme!"

C’est quoi ce print ?

print("Quel est ton nom?")

Fonction

Paramètre

Certaines fonctions renvoient une valeur

max(5, 8, 2, 1, -2)

🛠 Outil : les fonctions 🛠

Une fonction est un raccourci pour exécuter plusieurs instructions

On peut créer ses propres fonctions
(mais pas aujourd’hui)

  • check_password("Sylvain", "1234")
  • fire_thrusts(90)
  • play_music("Idioteque.mp3")

Quelques fonctions de Python

  • print("Bonjour")
  • input("Entrez un nombre: ")
  • max(5, -3, 1)
  • round(3.1415, 2)

Liste complète: https://docs.python.org/fr/3/library/functions.html

🛠️ Outil : les variables 🛠️

Une variable est un nom donné à une valeur

Exemples de variables

  • my_name = "Sylvain"
  • secret = "1234"
  • current_date = "04.10.2021"

Nom de la variable

Valeur

« Hé Python, mets cette étiquette sur cette valeur »

Bien choisir le nom de ses variables

  1. Réfléchir à ce que la variable représente
  2. Trouver un nom en anglais qui correspond
  3. Tout mettre en minuscule et séparer les mots par des sous-tirets
  1. Le nombre que la personne doit deviner
  2. "Number to guess"
  3. number_to_guess

Par exemple

Pas d’espaces ni de caractères spéciaux dans les noms de variables !

🐿

⚠️

Utilisation des variables

« Hé Python, utilise la valeur qui a cette étiquette »

my_name = "Sylvain"
secret = "1234"
max_number = max(8, 1, -5, 42)

print(my_name)
print("Mon mot de passe est " + secret)
print(max_number + 5)

Pourquoi on utilise des variables?

  • Pour éviter d’exécuter plusieurs fois une fonction
  • Pour exécuter une fonction et utiliser son résultat plus tard
print("Bienvenue " + input("Entre ton nom: "))
print("Hey " + input("Entre ton nom: ") +
      ", et si tu me donnais aussi ton mot de passe?")
print(input("Entre ton mot de passe: "))
Bienvenue Entre nom nom: Sylvain Sylvain
Hey Entre ton nom: Cyril Cyril, et si tu me donnais aussi ton mot de passe?
Entre ton mot de passe: 1234 1234

😕

Les variables à la rescousse

name = input("Entre ton nom: ")
print("Bienvenue " + name)
print("Hey " + name + ", et si tu me donnais aussi ton mot de passe?")
password = input("Entre ton mot de passe: ")
print(password)
Entre ton nom: Sylvain
Bienvenue Sylvain
Hey Sylvain, et si tu me donnais aussi ton mot de passe?
Entre ton mot de passe: 1234
1234

💪🥳🤳

Bon on écrit du code ou quoi ⁉️

print("Bienvenue dans mon programme!")
password = input("Entrez le code secret pour l’utiliser: ")
print("Vous avez entré le code " + password)
  1. Afficher "Bienvenue dans mon programme!"
  2. Poser la question "Entrez le code secret pour l’utiliser: " et mettre le résultat dans la variable password
  3. Afficher "Vous avez entré le mot de passe " + password

Afficher ➡️ print
Poser une question ➡️ input

🛠️ Outil : les conditions 🛠️

Les conditions servent à créer des embranchements

Exemple d’embranchement

  1. Poser la question "Entre le mot de passe: " et le mettre dans la variable password
  2. Si la valeur de la variable password est "trèsSecret", alors
    1. Afficher "C’est le bon mot de passe!"
  3. Sinon
    1. Afficher "Ce n’est pas le bon mot de passe"

Exemple de programme avec une condition

if password == "trèsSecret":
    print("C’est le bon mot de passe!")
else:
    print("Ce n’est pas le bon mot de passe")
  • 4 espaces
  • Exécuté seulement si la condition est vraie

Les gens cool utilisent la touche tabulation (⭾) pour insérer les espaces (indentation) !

🍸😎🤳

Ne pas oublier les deux-points !

Bon on écrit du code ou quoi ⁉️

password = input("Entrez le mot de passe: ")

if password == "trèsSecret":
    print("Bienvenue!")
else:
    print("Ce n’est pas le bon mot de passe.")
  1. Poser la question "Entre le mot de passe: " et le mettre dans la variable password
  2. Si la valeur de la variable password est égale à "trèsSecret", alors
    1. Afficher "C’est le bon mot de passe!"
  3. Sinon
    1. Afficher "Ce n’est pas le bon mot de passe"

Bon on écrit du code ou quoi ⁉️

  1. Mettre "4" dans la variable number
  2. Poser la question "Entre un chiffre: " et mettre le résultat dans la variable guess
  3. Si la valeur de la variable guess est égale (==) à number, alors
    1. Afficher "Bravo!"
  4. Sinon, si guess est < number, alors
    1. Afficher "Trop petit!"
  5. Sinon
    1. Afficher "Trop grand!"
if condition1:
    ...
elif condition2:
    ...
else:
    ...

Transformons le programme de demande de mot de passe en jeu !

Modifiez le programme pour faire deviner un nombre plus grand que 9. Que se passe-t-il ?

(le nombre à deviner est 14)
Entre un nombre: 2
Trop grand!

🛠️ Outil : les types 🛠️

Les types servent à catégoriser des valeurs

Les catégories dans le monde « réel »

  • Chien
  • Livre
  • Nombre

3 types de base importants

  1. Chaînes de caractères (délimitées par des guillemets, p.ex. "Salut!")
  2. Nombres (sans guillemets, p.ex. 42)
  3. Booléens (valeur vraie au fausse, mots-clés True et False)

La fonction type permet de connaître le type d’une valeur

type("Bonjour")
# <class 'str'>

type(42)
# <class 'int'>

type(True)
# <class 'bool'>

guess = input("Entre un chiffre: ")
print(guess)
# '4'
type(guess)
# <class 'str'>

Le type d’une valeur influence son comportement

Par exemple pour les comparaisons

"14" < "2"
# True

14 < 2
# False

14 > "2"
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '>' not supported between instances of 'int' and 'str'

guess = input("Entre un nombre: ")
14 > guess
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '>' not supported between instances of 'int' and 'str'

Le type d’une valeur influence son comportement

… et pour d’autres opérations

2 + 2
# 4

"Salut " + "Sylvain"
# Salut Sylvain

"2" + "2"
# 22

"2" + 2
# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# TypeError: can only concatenate str (not "int") to str

On peut convertir un type à un autre grâce à des fonctions

int("45")
# 45
type(int("45"))
# <class 'int'>

int("14") > int("2")
# True

int("Bonjour")
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: invalid literal for int() with base 10: 'Bonjour'

guess = int(input("Entre un nombre: "))
print(guess)
# 4
14 > guess
# True

Modifiez votre programme pour que la comparaison avec des nombres plus grands que 9 fonctionne

(indice : convertissez le retour de la fonction input en nombre avec la fonction int)

  1. Créer une variable number avec la valeur 42
  2. Poser la question "Entre un nombre: ", convertir le résultat en nombre, et le mettre dans la variable guess
  3. Si guess == number, alors:
    1. Afficher "Bravo!"
  4. Si guess < number, alors:
    1. Afficher "Trop petit!"
  5. Sinon:
    1. Afficher "Trop grand!"

🛠️ Outil : la bibliothèque Python 🛠️

Dans Python, les piles sont incluses

https://docs.python.org/fr/3/library/index.html

(le lien le plus important de cette présentation)

Le but : faire plein de trucs sans avoir à les programmer nous-mêmes !

  • Manipulation de dates
  • Accès aux fichiers
  • Statistiques
  • E-mails
  • Web
  • Aléatoire

Plein de trucs comme :

import datetime

print(datetime.date(1986, 4, 11).strftime("%A"))
# Friday

Exemple : le module datetime

import random

print(random.randint(0, 42))
# 39
print(random.randint(0, 42))
# 18

Exemple : le module random

Comme de par hasard c’est pile ce qu’il nous faut !

Modifiez votre programme pour faire deviner un nombre aléatoire

(astuce: utilisez random.randint(low, high))

🛠️ Outil : les boucles 🛠️

Les boucles permettent d’exécuter un bout de code plusieurs fois

  1. Générer un nombre entre 0 et 42
  2. Tant que le nombre n’a pas été trouvé:
    1. Demander d’entrer un nombre
counter = 0

while counter < 5:
    print("Le compteur est à " + str(counter))
    counter = counter + 1
    
print("Le compteur est terminé")
  
# Le compteur est à 0
# Le compteur est à 1
# Le compteur est à 2
# Le compteur est à 3
# Le compteur est à 4
# Le compteur est terminé

Deux-points, comme pour les if

4 espaces, comme pour les if

Exemple de boucle : un compteur

while True:
    print("Oups")    

print("Le compteur est terminé")
  
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# Oups
# ...

Une boucle infinie

😱

Jamais affiché !

counter = 0

while True:
    if counter >= 5:
        break
        
    print("Le compteur est à " + str(counter))
    counter = counter + 1

print("Le compteur est terminé")
  
# Le compteur est à 0
# Le compteur est à 1
# Le compteur est à 2
# Le compteur est à 3
# Le compteur est à 4
# Le compteur est terminé

Sortir d’une boucle infinie

Sortie de la boucle

  1. Créer une variable number avec un nombre aléatoire compris entre 0 et 42
  2. Boucle:
    1. Poser la question "Entre un nombre entre 0 et 42: ", convertir le résultat en nombre, et le mettre dans la variable guess
    2. Si guess == number, alors:
      1. Afficher "Bravo!"
      2. Sortir de la boucle
    3. Si guess < number, alors:
      1. Afficher "Trop petit!"
    4. Sinon:
      1. Afficher "Trop grand!"

Modifiez votre programme pour qu’il corresponde à ça

💡 Indices :

  • Utilisez "while True:" pour faire une boucle infinie
  • Utilisez "break" pour sortir de la boucle
import random

number = random.randint(0, 42)

while True:
    guess = int(input("Entre un nombre entre 0 et 42: "))

    if guess == number:
        print("Bravo! Le nombre à deviner était " + str(number))
        break
    elif guess < number:
        print("Trop petit!")
    else:
        print("Trop grand!")

Solution

Exercice supplémentaire : affichez le nombre d’essais qu’il a fallu au joueur ou à la joueuse !

🛠️ Outil : les exceptions 🛠️

Une exception survient quand Python ne sait pas quoi faire et ne peut pas continuer l’exécution du programme

À quoi ça ressemble ?

Entre un nombre entre 0 et 42: coucou! Traceback (most recent call last):
File "main.py", line 6, in
guess = int(input("Entre un nombre entre 0 et 42: "))
ValueError: invalid literal for int() with base 10: 'coucou!'

Emplacement du code qui a causé l’exception

Type de l’exception

  1. Boucle:
    1. Essayer de:
      1. Convertir le résultat de la question en nombre
    2. En cas d’erreur de conversion:
      1. Afficher "Ce n’est pas un nombre!"
      2. Continuer la boucle
while True:
    try:
        guess = input("Entre un nombre: ")
    except ValueError:
        print("Ce n’est pas un nombre!")
        continue

Modifiez votre programme pour qu’il ne plante pas si la personne entre autre chose qu’un nombre

try:
    ...
except ValueError:
    ...
    continue

Rappel de la syntaxe :

🛠️ Outil : les listes 🛠️

Les listes permettent de regrouper plusieurs valeurs

Comment garder un historique des nombres entrés par l’utilisateur ?

Tentative sans listes

guess1 = 0
guess2 = 0
guess3 = 0
current_guess = 1

while True:
    guess = input("Entre un nombre: ")
    
    if current_guess == 1:
        guess1 = guess
    elif current_guess == 2:
        guess2 = guess
    elif current_guess == 3:
        guess3 = guess
        
    current_guess = current_guess + 1
    
print("Votre historique: " + str(guess1) +
      ", " + str(guess2) + ", " + str(guess3))
  • Ne fonctionne que pour 3 essais
  • Répétition de code
  • Noms de variables peu explicites

C’EST MOCHE 👎

2/10

Ne faites pas ça à la maison

Amélioration du code grâce aux listes

  1. guess_history = liste vide
  2. Boucle:
    1. Poser une question "Entre un nombre: " et mettre le résultat dans la variable guess
    2. Ajouter la valeur de la variable guess à la liste guess_history
  3. Afficher le contenu de la liste guess_history

😌

Utilisation des listes

guess_history = []

while True:
    guess = input("Entre un nombre: ")
    guess_history.append(guess)
    
print("Historique: " + ", ".join(guess_history))

😍

  1. guess_history = liste vide
  2. Boucle:
    1. Poser une question "Entre un nombre: " et mettre le résultat dans la variable guess
    2. Ajouter la valeur de la variable guess à la liste guess_history
  3. Afficher le contenu de la liste guess_history
my_list = ["pain", "pommes", "chocolat"]

print(my_list[0])
# pain
print(my_list[-1])
# chocolat

my_list.append("poires")
print(my_list[-1])
# poires

"pommes" in my_list
# True

print(" / ".join(my_list))
# pain / pommes / chocolat / poires

print(len(my_list))
# 4

Exemples d’utilisation d’une liste

Modifiez votre programme pour afficher l’historique des tentatives

ma_liste = []
ma_liste.append("Bonjour")
ma_liste.append("Sylvain")

print(", ".join(ma_liste))
# Bonjour, Sylvain

Rappel:

Comment écrire le programme suivant ?

  1. Initialiser la variable my_list avec la valeur ["La Powerhouse", "Yannick", "Magaly"]
  2. Pour chaque élément de la liste my_list:
    1. Afficher élément + " est cool"
my_list = ["La Powerhouse", "Yannick", "Magaly"]
current_item = 0

while current_item < len(my_list):
    print(my_list[current_item] + " est cool")
    current_item += 1

Première tentative

  • 👍 Ça marche
  • 👎 Mais c’est pas très poétique

La meilleure façon de parcourir les éléments d’une liste est d’utiliser
une
boucle for

my_list = ["La Powerhouse", "Yannick", "Magaly"]

for item in my_list:
    print(item + " est cool")

😍

🛠️ Outil : les objets 🛠️

Un objet est une valeur d’un certain type

  • "Bonjour" est un objet de type str (chaîne de caractères)
  • 42 est un objet de type int (nombre)
  • True est un objet de type bool (booléen)
  • ["Bonjour"] est un objet de type liste

Rappel

Le type d’une valeur influence son comportement

"14" < "2"
# True

14 < 2
# False

14 > "2"
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '>' not supported between instances of 'int' and 'str'

guess = input("Entre un nombre: ")
14 > guess
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '>' not supported between instances of 'int' and 'str'

Un type peut définir des fonctions disponibles uniquement sur les objets de ce type

my_list.append("Bonjour")

On appelle ça des « méthodes »

my_list = []
my_list.append("Bonjour")

print(my_list)
# ['Bonjour']

number = 42
number.append("Bonjour")
# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# AttributeError: 'int' object has no attribute 'append'

Les méthodes disponibles pour chaque type sont dans la documentation de Python

Les fonctions dir() et help() permettent d’accéder à la documentation d’un type ou d’un objet

dir("Bonjour")
# ['__add__', '__class__',  ..., 'capitalize', 'count']
print("Bonjour".count("o"))
# 2

help([])
# Help on list object:
#
# class list(object)
#  |  list(iterable=(), /)
#  |  
#  |  Built-in mutable sequence.
#  |  
#  |  If no argument is given, the constructor creates a new empty list.
#  |  The argument must be an iterable if specified.
#  |  
#  |  Methods defined here:
#  |  
#  |  __add__(self, value, /)
#  |      Return self+value.
#  ...

Naviguer dans l’aide

  • Espace : afficher plus
  • q : quitter l’aide

Exercice 1

Écrivez un programme qui demande un mot ou une phrase, et qui affiche le nombre de "e" qu’il contient.

S’il n’y en a pas, le programme doit afficher "Il n’y a aucun e dans ce texte!"

Exercice 2 (en groupe)

Écrivez un programme qui demande un mot ou une phrase, et qui affiche ce mot ou cette phrase en changeant la « casse » (majuscules/minuscules) des voyelles.

Par exemple, « Origami » devient « orIgAmI ».

Exercice 3

Écrivez un programme qui demande des nombres (positifs ou négatifs), séparés par des espaces, et qui affiche le nombre le plus grand et le nombre le plus petit, séparés par des espaces.

Exemple :

Entrez des nombres séparés par des espaces: 5 8 3 -2 1 5
8 -2

Indice: utilisez la méthode split() du type str

Exercice 4

Écrivez un programme qui demande une phrase, qui enlève les espaces de la phrase, et qui l’affiche avec des groupes de 3 lettres séparés par des espaces. Par exemple :

Entrez une phrase: les chaussettes de l’archiduchesse
les cha uss ett esd el’ arc hid uch ess e

Indice: utilisez la méthode replace() pour enlever les espaces

Et maintenant ?

Intro à Python

By Sylvain Roflmao

Intro à Python

  • 440