La programmation, je me lance!

Qui suis-je?

  • Ingénieur en développement logiciel
  • Développeur web depuis une quinzaine d’années
  • Passionné par la programmation
  • Nul en maths

J’aime partager ma passion

Peut-être même
un peu trop

Pourquoi apprendre à programmer?

Pour plein de raisons!

  • Ça aide à comprendre les outils qu’on utilise au quotidien
  • Il y a une grosse demande dans ce domaine (et un manque de diversité flagrant)
  • Ça vous permettra de créer vos propres programmes pour vous simplifier la vie
  • Ça nécessite peu d’outils (un ordinateur et
    une connexion)
  • C'est marrant et stimulant!

Dans deux heures vous aurez appris les bases
d’une nouvelle langue

Avertissement: deux heures, c’est court

… pour apprendre des nouveaux concepts, un nouveau vocabulaire, et une nouvelle syntaxe

Avertissement 2: vous allez faire des erreurs,
c’est normal!

Mensonges et vérités au sujet de la programmation

  • C’est de la magie
  • Vous devez être doué·e en maths
  • Vous devez être patient·e
  • C’est un métier d’hommes
  • Cela nécessite de longues études
  • Vous ne saurez jamais tout ce qu’il y a à savoir

Quels programmes connaissez-vous?

Alors c’est quoi un programme?

Un programme est un ensemble d’instructions, qui réalise une certaine tâche lorsqu’il est exécuté par un ordinateur

Une recette de cuisine est un ensemble d’instructions, qui réalise un certain plat lorsqu’elle est exécutée par un-e humain-e

Instructions

Résultat

(normalement)

Exercice!

  • Formez des groupes de 2 personnes
  • Une personne prend le rôle de programmeuse, l’autre de robot
  • La programmeuse doit faire en sorte que le robot lui ramène la balle de ping-pong en utilisant uniquement les instructions suivantes:
  • Faire un pas
  • En avant
  • En arrière
  • Tourner
  • X fois
  • X degrés
  • Lever
  • Baisser
  • Bras
  • Main
  • Ouvrir
  • Fermer
  • Gauche
  • Droite
  • Vous pouvez combiner ces instructions, par exemple «Faire un pas en avant 3 fois»

Exercice!

  • Aidez-moi à faire un sandwich!
  • Vous ne pouvez utiliser que les instructions suivantes, rien d’autre
  • TODO
  • Faire un pas
  • En avant
  • En arrière
  • Tourner
  • X fois
  • X degrés
  • Lever
  • Baisser
  • Bras
  • Main
  • Ouvrir
  • Fermer
  • Gauche
  • Droite
  • Vous pouvez combiner ces instructions, par exemple «Faire un pas en avant 3 fois»

Quelle langue parlent les ordinateurs?

(Indice: pas le français)

😨

(Indice 2: pas le néerlandais)

Les ordinateurs parlent le binaire

ou langage machine

C’est une langue trop difficile à apprendre pour nous

Comment faire?

Instructions 🇳🇱

Interprète

😌

Instructions 🇬🇧

Je peux exécuter les instructions!

🧑‍🦰

Instructions (langage compréhensible)

Interpréteur (Python)

💻

1000010110111111011101101010110111111101011110010

Instructions (code machine / binaire)

L'ordinateur exécute les instructions

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

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

🎊 Résultat 🎉

Un langage de programmation est la combinaison d’une syntaxe et d’un programme pour traduire cette syntaxe en langage machine

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

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

Interpréteur

10000101 10111111 01110110
10101101 11111101 01111001

Il existe des milliers de langages de programmation

(comme les langues!)

😱

Pas besoin de tous les connaître!

(comme les langues!)

Objectif du jour:

Apprendre Python
en créant un jeu!

Enfin, le voilà! Le livre que vous cherchiez tant, le Necronomicon,
placé entre "Nettoyer sa maison avec le bicarbonate de soude" et
"Naturellement naturel: renouer avec la nature à l’aide de son smartphone".
Alors que vous tentez de sortir l’ouvrage du rayon, vous entendez un déclic,
l’étagère coulisse d’une quarantaine de centimètres, laissant deviner un
couloir obscur dans le mur. Personne autour de vous ne semble avoir remarqué
quoi que ce soit.

a) Observer le couloir
b) Vous faufiler dans le couloir
c) Vous rendre à l’accueil pour signaler le comportement suspect de ce rayon

Que souhaitez-vous faire? c

Vous prenez place derrière la file composée d’une douzaine de personnes.
Vous apercevez d’où vous vous trouvez l’ouverture dans le mur. Vous ne la
quittez pas des yeux. Après dix longues minutes d’attente, remarquant que la
file n’avance pas, vous décidez de retourner voir l’ouverture.

a) Observer le couloir
b) Vous faufiler dans le couloir

Que souhaitez-vous faire? 

Python est un langage de programmation général

Avec ce langage vous pourrez créer:

  • Des sites web
  • Des jeux
  • Des applications graphiques
  • Des programmes de statistique et d’analyse (machine learning)
  • À peu près n’importe quoi!

Exercice!

  • Ouvrez votre navigateur et allez sur https://repl.it/languages/python3
  • Entrez le code suivant:
print("Salut!")
print("C'est mon premier programme!")
  • Cliquez sur le bouton en haut de l'écran
  • Observez le résultat dans la fenêtre de droite

https://repl.it/@sephii/intro#exercice_1.py

Les fonctions

Fonction

Paramètre

print("Hello world")

Les fonctions

Fonction

Paramètre

avancer_de(3 pas)

Les fonctions

Fonction

Paramètres

max(3, -5, 8)

Une fonction peut renvoyer une valeur

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

Si la valeur renvoyée n’est pas utilisée, elle finit à la poubelle !

Les valeurs de retour peuvent être utilisées dans d’autres fonctions

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

Par composition, les fonctions permettent de créer de nouveaux éléments de langage

Niveau d’abstraction

Avancer de X pas

Générer un signal électrochimique

Transporter un signal jusqu’au muscle

Contracter un muscle

Assurer l’équilibre du corps

Bouger un membre

Niveau d’abstraction

Danser la Carioca

Générer un signal électrochimique

Transporter un signal jusqu’au muscle

Contracter un muscle

Assurer l’équilibre du corps

Bouger un membre

Avancer de X pas

Faire X pas de côté

Niveau d’abstraction

print

Réserver un espace mémoire

Interagir avec le système d’affichage

Exemples de fonctions imaginaires

  • check_password
  • send_mail
  • print_error
  • reset_user_password
  • validate_order

Créer ses propres fonctions

def greet(name):
    return "Salut " + name + "!"

print(greet("Sylvain"))
print(greet("Julie"))
print(greet("Harold"))

def signifie define

nom de la fonction

paramètre

corps de la fonction
(avec renvoi de valeur)

exécution de la fonction greet

def nom_de_la_fonction(parametre1, parametre2):
    ...
    return ...

Exercice!

Créez une fonction scene_1 pour décrire la première scène de votre jeu d’aventure avec des instructions print, puis exécutez-la. Par exemple:

  • Alors que vous suivez un cours d'introduction à la programmation, l'écran de votre ordinateur scintille d'une lumière étrange. Vous sentez que la réalité autour de vous perd de sa substance
  • Vous êtes un enfant perdu dans un supermarché. Les gens vous bousculent et se ruent sur le papier toilettes. Où sont vos parents?
  • Vous vous trouvez dans la station spatiale internationale. Un panneau solaire indique une anomalie. Il faudrait sortir le réparer mais vos collègues ont disparu et vous êtes seule à bord.
  • Laissez parler votre imagination!
print("Vous vous trouvez...")

https://repl.it/@sephii/intro#exercice_2.py

Les variables

Servent à garder une information pour plus tard

my_name = "Julie"
print("Salut " + my_name + "!")

Salut Julie!
  • Pas de guillemets autour du nom de la variable!
my_name = "Julie"
print("Salut " + "my_name" + "!")

Salut my_name!

nom_variable = valeur

Exercice!

Modifiez votre fonction scene_1 pour demander le nom du joueur ou de la joueuse, puis affichez-le (par exemple un personnage interpelle le joueur ou la joueuse).

Indices

  • La fonction input permet de récupérer du texte rentré au clavier
  • Vous pouvez passer en paramètre à cette fonction la question à afficher (p.ex. "Entrez votre nom: ")
  • Utilisez une variable pour stocker le nom de la personne
  • Utilisez l’opérateur + pour concaténer le nom au reste du texte
  • Coincé·e? Jetez un œil à https://repl.it/@sephii/intro#exercice_3.py

Types

Un type sert à catégoriser des valeurs. Chaque valeur a un type.

Exemples de catégories dans le monde réel:

  • Chien
  • Arbre
  • Nombre
  • ...

Types

Les types sont importants pour définir le comportement des valeurs

nombre1 = "3"
nombre2 = "10"
print("3 est-il plus grand que 10?")
print(nombre1 > nombre2)

Qu’affiche ce programme ? Pourquoi ?

Il affiche True (vrai), parce qu’il s’agit d’une comparaison textuelle

Types

Les types sont importants pour définir le comportement des valeurs

nombre1 = 3
nombre2 = 10
print("3 est-il plus grand que 10?")
print(nombre1 > nombre2)

On compare bien des nombres !

Types

3 types de base importants :

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

Types et opérateurs

print(1 + 1)
2
print("Salut " + "Sylvain")
Salut Sylvain
print(2 * 2)
4
print("Sylvain" * 2)
SylvainSylvain

Opérateurs arithmétiques: +, -, *, /

Types et opérateurs

print(1 > 1)
False
print("Sylvain" == "sylvain")
False
print(1 + 1 == 3)
False
print("Sylvain" != "Georges")
True

Opérateurs de comparaison: >, <, ==, !=

Attention au mélange des types

print("J'ai " + 34 + " ans")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
print("J'ai " + "34" + " ans")
J'ai 34 ans

Attention aux opérateurs de comparaison

print(1 + 1 = 2)
  File "<stdin>", line 1
SyntaxError: cannot assign to operator
print(1 + 1 == 2)
True

print(12 != 12)
False

== : est égal à

!= : est différent de

Conditions

Conditions

Trame linéaire

import datetime

name = input("Comment vous appelez-vous?")
print("Salut " + name + "!")
print("Aujourd'hui nous sommes " +
    datetime.date.today().strftime("j")
)

Conditions

Conditions

Trame non linéaire

Conditions

Trame non linéaire

Conditions

Syntaxe des conditions

Si nom vaut "Sylvain"

Afficher "On se connaît!"

Afficher "Merci d’utiliser mon programme!"

name = input("Comment vous appelez-vous? ")

if name == "Sylvain":
    print("On se connaît!")
    print("À bientôt!")

print("Merci d’utiliser mon programme!")

Bloc d’instructions (espaces!)

Condition

Afficher "À bientôt!"

Demander le nom

En dehors du bloc (pas d'espaces)

Conditions avec
2 branches

Si nom == "Sylvain"

Afficher "On se connaît!"

Afficher "Merci d’utiliser mon programme!"

name = input("Comment vous appelez-vous? ")

if name == "Sylvain":
    print("On se connaît!")
    print("À bientôt!")
else:
    print("Merci d’utiliser mon programme!")

Bloc d’instructions (espaces!)

Comparaison

Afficher "À bientôt!"

Demander le nom

Sinon

Conditions avec
n branches

Si nom == "Sylvain"

Afficher "On se connaît!"

Afficher "Salut Julie!"

name = input("Comment vous appelez-vous? ")

if name == "Sylvain":
    print("On se connaît!")
    print("À bientôt!")
elif name == "Julie":
    print("Salut Julie!")
else:
    print("Merci d’utiliser mon programme!")

Afficher "À bientôt!"

Demander le nom

Sinon

Si nom == "Julie"

Afficher "Merci d’utiliser mon programme!"

Bloc exécuté seulement si on est entré dans aucune autre branche

Exercice!

Ajoutez un choix après la description de votre première scène. Par exemple en proposant au joueur ou à la joueuse de faire une action (se déplacer, interagir avec un objet, etc).

Indices

  • Utilisez la fonction input pour récupérer une lettre liée à l’option
  • Utilisez une structure if ... elif ... else en comparant l’option entrée aux lettres a, b, c, etc
  • Affichez un dénouement différent suivant l’option choisie
  • Ne gérez pas les entrées invalides pour l’instant
  • Coincé·e? Jetez un œil à https://repl.it/@sephii/intro#exercice_4.py

a) regarder si les personnes autour de vous ont remarqué cette lueur

b) appuyer sur des touches de votre clavier en espérant que cela fasse disparaître cette lueur étrange

Faites un choix:

Exercice!

Créez une fonction get_choice dans votre programme, qui demande de faire un choix avec le texte "Que souhaitez-vous faire? ", et qui renvoie le choix. Remplacez les appels à la fonction input dans votre programme par get_choice.

Indices

  • Utilisez le mot-clef def pour créer une fonction
  • La fonction n’a pas de paramètre
  • Utilisez le mot-clef return pour renvoyer la valeur entrée
  • Coincé·e? Jetez un œil à https://repl.it/@sephii/intro#exercice_5.py

Exercice!

Organisez les post-it pour représenter le programme suivant:

Afficher "Présentation de scene_1"

Demander choix et stocker dans variable "choice"

Exécuter scene_2

Exécuter scene_3

Si choix vaut "a"

Sinon, si choix vaut "b"

scene_1

Afficher "Présentation de scene_2"

scene_2

Afficher "Présentation de scene_3"

scene_3

def scene_1():
  ...

Les boucles

À quoi ça sert?

print("a) Ouvrir la porte")
print("b) Coller l’oreille contre la porte")

choice = input("Faites un choix: ")

if choice == "a":
    print("...")
elif choice == "b":
    print("...")
else:
    print("Veuillez entrer un choix valide!")

Le programme se termine si le choix n’est pas valide!

Demander choix et stocker dans la variable "choice"

Afficher "..."

Afficher "..."

Afficher "Veuillez entrer un choix valide!"

Fin du programme

Si choix vaut "a"

Sinon, si choix
vaut "b"

Sinon

Déroulement d’une boucle (schéma)

Demander choix et stocker dans la variable "choice"

Afficher "..."

Afficher "..."

Afficher "Veuillez entrer un choix valide!"

Si choix vaut "a"

Sinon, si choix
vaut "b"

Sinon

Initialiser choice = ""

Si choix vaut
"a" ou "b"

Fin du programme

Sinon

* ce schéma est plus complexe que le code

Déroulement d’une boucle (code)

print("a) Ouvrir la porte")
print("b) Coller l’oreille contre la porte")

choice = ""

while choice != "a" and choice != "b":
  choice = input("Faites un choix: ")

  if choice == "a":
    print("...")
  elif choice == "b":
    print("...")
  else:
    print("Veuillez entrer un choix valide!")

Les listes

def get_choice(options):
  choice = input("Faites un choix: ")
  
  if choice not in options:
    print("Ce choix n’est pas valide!")
  else:
    print("Vous avez choisi " + choice)
    
get_choice(["a", "b", "c"])

Nouveau type de données ! Elles permettent de regrouper des données. Les éléments d’une liste sont placés entre [] et séparés par des virgules

Cette liste a 3 éléments: "a", "b" et "c"

Exercice!

Ajoutez un paramètre options à votre fonction get_choice. Faites en sorte qu’elle empêche d’entrer un choix qui ne fait pas partie de la liste options.

Indices

  • Utilisez une boucle while pour demander un choix tant qu’il n’est pas valide
  • Initialisez choice avec une valeur vide avant de démarrer la boucle
  • N’oubliez pas de modifier les appels à get_choice pour y ajouter les choix valides
  • Coincé·e? Jetez un œil à https://repl.it/@sephii/intro#exercice_7.py
def get_choice(options):
  choice = input("Faites un choix: ")
  
  if choice not in options:
    print("Ce choix n’est pas valide!")
  else:
    print("Vous avez choisi " + choice)
    
get_choice(["a", "b", "c"])

Exercices

from typing import List

def get_average(numbers: List[int]) -> int:
  """
  Renvoie la moyenne de tous les nombres de la liste `numbers`,
  arrondie vers l’entier le plus bas.
  
  La moyenne est définie par la somme des nombres divisée par
  le nombre de nombres
  """
  ...
  
assert get_average([5, 8, 8, 10]) == 7
assert get_average([]) == 0
from typing import List

def count_by(number: int, times: int) -> List[int]:
    """
    Renvoie les premiers `times` nombres du "livret" `number`.

    Par exemple:

    >>> count_by(2, 5)
    [2, 4, 6, 8, 10]
    """
    ...
    
    
assert count_by(2, 5) == [2, 4, 6, 8, 10]
assert count_by(5, 3) == [5, 10, 15]
from typing import List

def count_by(number: int, times: int) -> List[int]:
    """
    Renvoie les premiers `times` nombres du "livret" `number`.

    Par exemple:

    >>> count_by(2, 5)
    [2, 4, 6, 8, 10]
    """
    # Approche classique
    numbers = []
    for i in range(1, times + 1):
        numbers.append(number * i)

    return numbers
        
    # Compréhension de liste
    # return [number * i for i in range(1, times + 1)]

  
assert count_by(2, 5) == [2, 4, 6, 8, 10]
assert count_by(5, 3) == [5, 10, 15]
def untroll(text: str) -> str:
    """
    Renvoie la chaîne `text` sans les voyelles.
    """
    ...
  
  
assert untroll("PYTHON SAI NULLE") == "PTHN S NLL"
def untroll(text: str) -> str:
    """
    Renvoie la chaîne `text` sans les voyelles.
    """
    vowels = set("aeiouy")

    # Approche classique
    filtered_text = ""
    for letter in text:
        if letter.lower() not in vowels:
            filtered_text += letter

    return filtered_text

    # Compréhension de liste
    # return "".join(letter for letter in text if letter.lower() not in vowels)

assert untroll("PYTHON SAI NULLE") == "PTHN S NLL"
def multiple_sum(number: int) -> int:
  """
  Renvoie la somme des nombres inférieurs à `number` et qui
  sont des multiples de 3 ou de 5.
  """
  ...
  
assert multiple_sum(10) == 23
assert multiple_sum(11) == 33
def multiple_sum(number: int) -> int:
    """
    Renvoie la somme des nombres inférieurs à `number` et qui
    sont des multiples de 3 ou de 5.
    """
    # Approche classique
    number_sum = 0
    for i in range(1, number):
        if i % 3 == 0 or i % 5 == 0:
            number_sum += i

    return number_sum

    # Compréhension de liste
    return sum(i for i in range(1, number) if i % 3 == 0 or i % 5 == 0)
  
  
assert multiple_sum(10) == 23
assert multiple_sum(11) == 33
from typing import List


def like_this(names: List[str]) -> str:
  """
  Renvoie un texte indiquant les personnes qui "aiment ça".
  """
  ...
  
assert like_this([]) == "Personne n’aime ça"
assert like_this(["Georges"]) == "Georges aime ça"

assert like_this(
  ["Georges", "Paul-Alain"]
) == "Georges et Paul-Alain aiment ça"

assert like_this(
  ["Georges", "Paul-Alain", "Charles-Henri"]
) == "Georges, Paul-Alain et Charles-Henri aiment ça"

assert like_this(
  ["Georges", "Paul-Alain", "Charles-Henri", "Robert"]
) == "Georges, Paul-Alain et 2 autres aiment ça"
from typing import List


def like_this(names: List[str]) -> str:
    """
    Renvoie un texte indiquant les personnes qui "aiment ça".
    """
    if not names:
        return "Personne n’aime ça"

    if len(names) == 1:
        return f"{names[0]} aime ça"

    if len(names) == 2:
        return f"{names[0]} et {names[1]} aiment ça"

    if len(names) == 3:
        return ", ".join(names[:2]) + f" et {names[2]} aiment ça"

    return ", ".join(names[:2]) + f" et {len(names) - 2} autres aiment ça"

  
  
assert like_this([]) == "Personne n’aime ça"
assert like_this(["Georges"]) == "Georges aime ça"

assert like_this(
  ["Georges", "Paul-Alain"]
) == "Georges et Paul-Alain aiment ça"

assert like_this(
  ["Georges", "Paul-Alain", "Charles-Henri"]
) == "Georges, Paul-Alain et Charles-Henri aiment ça"

assert like_this(
  ["Georges", "Paul-Alain", "Charles-Henri", "Robert"]
) == "Georges, Paul-Alain et 2 autres aiment ça"
import json
from typing import List
from urllib.request import urlopen

def get_starships(character_name: str) -> List[str]:
    """
    Renvoie la liste des noms des vaisseaux du personnage `character_name`.
    cf. https://swapi.dev/documentation#people
    """
    response = urlopen("https://swapi.dev/api/people/")
    response_data = response.read()
    ...

  
print(get_starships("Luke Skywalker"))
import json
from typing import List
from urllib.request import urlopen

def get_starships(character_name: str) -> List[str]:
    """
    Renvoie la liste des noms des vaisseaux du personnage `character_name`.
    cf. https://swapi.dev/documentation#people
    """
    response = urlopen("https://swapi.dev/api/people/")
    response_data = response.read()
    json_data = json.loads(response_data)

    starships = []
    for result in json_data["results"]:
        if result["name"] == character_name:
            for starship_url in result["starships"]:
                starship_data = json.loads(urlopen(starship_url).read())
                starships.append(starship_data["name"])
                
    return starships

  
print(get_starships("Luke Skywalker"))

Bravo, vous parlez une nouvelle langue!

🥳

🎉

Pour aller plus loin

Sylvain Fankhauser (@roflmaokthxbye)

Génies du code (@geniesducode)

La programmation, je me lance plus loin!

By Sylvain Roflmao

La programmation, je me lance plus loin!

  • 229