Constructions élémentaires I

Objectifs

À la fin de cette séquence vous serez capable de :

  • Manipuler les objets de base Python
  • Enregistrer des données dans la mémoire d'un ordinateur
  • Utiliser une variable pour accéder et manipuler l'objet référencé
  • Obtenir des données d'un utilisateur

Un mini-projet

No description has been provided for this image

1. Quelques généralités sur le langage Python

Dans un programme informatique en langage Python, tout est un objet.

Un objet est une entité qui contient des données (sous forme binaire) et un ensemble de comportements propres permettant de manipuler ces données. Ces comportements sont appelés méthodes.

Tout objet a un type (une nature : int, bool, tuple...). Le type d’un objet est le comportement par défaut défini pour cet objet. Autrement dit, le type permet de déterminer les méthodes associées à un objet.

Un objet a besoin d’être identifié pour être manipulé.

Une variable peut être vue comme un nom attaché à un objet particulier. Elle sert à identifier cet objet.
Techniquement, une variable est une référence vers une adresse mémoire, c’est-à-dire un emplacement précis dans la mémoire de l’ordinateur.
L’opération consistant à associer un nom (une variable) à un objet s’appelle une affectation (ou assignation, ou encore référencement ).
Par exemple, lorsquel'on écrit :

In [ ]:
moyenne = 13.5

On dit que l'on affecte (ou assigne) à la variable dont le nom est moyenne l'objet (la valeur) 13,5. On dit aussi que la variable moyenne référence l'objet 13,5 comme un nom permet d'identifier une personne.

Règles de nommage

  • Un nom de variable peut contenir lettres, chiffres, et tiret-bas ( _ appelé underscore) ;
    Exemples valides : variable2, ma_variable, _
  • Un nom de variable ne peut commencer par un nombre.
    La variable 2variable est interdite.

Bonnes pratiques de nommage

  • Il conseillé de choisir des noms de variable assez courts, mais aussi explicites que possible, de manière à exprimer clairement ce que la variable est censée représentée.
    Par exemple, les noms de variable tels que moyenne, moy conviennent mieux que m ou x pour exprimer une moyenne.
  • Les noms de variables sont sensibles à la casse (les caractères majuscules et minuscules sont distingués). Par exemple, Moyenne, moyenne, MOYENNE sont trois variables différentes !
  • Éviter d’utiliser les noms réservés par Python tel print, return, max, assert…
  • Rester cohérent dans la façon de nommer ses variables.
  • Bien qu'il soit légal d'utiliser des lettres majuscules, par convention, on n'utilise que des minuscules pour les noms de variables et des majuscules pour les constantes.
  • Même si cela est autorisé, éviter l'utilisation de lettres accentuées dans les noms de variables.

Pour finir, Python est un langage dit à typage dynamique.
En d'autres termes, le type n’est pas lié à la variable mais à l’objet qui est référencé par cette variable. Dans ce sens, en Python, les variables n'ont pas besoin d'être déclarées ou définies à l'avance, comme c'est le cas dans de nombreux autres langages de programmation. Le type d'une variable peut changer au cours de sa durée de vie.

In [ ]:
x = 3

la variable x est de type int car x identifie l’entier 3 ;

In [ ]:
x = 7.2

x est du type float car x identifie plutôt un réel ;

In [ ]:
x = 'élève'

x est du type str car on lui affecte un objet chaîne de caractère.

2. Les Types Numériques

2.1. Présentation

En Python, il existe quatre types numériques :

  • les « int » (integer) qui représentent les nombres entiers relatifs ;
  • les « float » qui représentent les nombres à virgule ;
  • les « complex » qui représentent les nombres complexes ;
  • les « bool » qui représentent les booléens.

2.2. Manipuler les objets numériques

2.2.1. Python utilisé comme une calculatrice

In [ ]:
x = 2
y = 3
#L'addition et la soustraction
print(x + y)
print(10 - 3)
In [ ]:
#La multiplication
print(x * y)
In [ ]:
#La division
print(7 / 3)
In [ ]:
#La division entière
print(7 // 3)
In [ ]:
#Le reste de la division entière
print(7 % 3)
In [ ]:
#La puissance (exponentiation)
print(3 ** 2)
In [ ]:
#valeur absolue
abs(-5.7)
In [ ]:
543.15e20

Certaines fonctions mathématiques (comme la racine carrée ou le sinus) ne font pas partie des fonctions intégrées de Python. Il est donc nécessaire de les importer depuis un module (comme math) avant de pouvoir les utiliser. C'est l'idée d'une « boîte à outils » où certains outils sont toujours à portée de main, et d'autres sont dans des compartiments spéciaux que l'on ouvre quand on en a besoin.

In [ ]:
#Importer le module mathématique
import math
print(math.pi)
In [ ]:
#Arrondir avec deux chiffres après la virgule (arrondir au centième)
round(math.pi, 3)
In [ ]:
print(math.sqrt(2))
In [ ]:
#Autre façon d'importer la bibliothèque mathématique
from math import*
print(pi)

Notation abrégée :

In [ ]:
a = 2 
a += 1 # a = a + 1
print(a)
In [ ]:
b = 5
b -= 2 # b = b - 2
print(b)
In [ ]:
a *= 4 # a = a * 4
print(a)
In [ ]:
a /= 3 # a = a / 2
In [ ]:
a //= 5 # a = a // 5
print(a)
In [ ]:
a %= 2 # a = a % 2
In [ ]:
a **= 2 # a = a**2

2.2.2. La fonction type()

In [ ]:
type(5)
In [ ]:
type(5.)
In [ ]:
type(True)
In [ ]:
type("a")

3. Les Chaînes de caractères (string en anglais)

3.1. Définition et syntaxe

Une chaîne de caractères est un objet encadré par des guillemets ou des apostrophes.

In [ ]:
"d"
In [ ]:
'pizza'
In [ ]:
"connais-toi toi-même."
In [ ]:
"123"

Les chaînes de caractères en Python sont immuables : une fois créées, elles ne peuvent pas être modifiées. Toute transformation (comme un changement de casse) crée une nouvelle chaîne, différente de l’originale.
Exemple :
La chaîne "papa" est différente de la chaîne "Papa" car le caractère p a été transformé en majuscule.
On peut le vérifier avec les opérateurs == (égalité de contenu) et is (identité en mémoire), ainsi qu’avec la fonction id().

In [ ]:
a = 'papa'
b = 'Papa'
In [ ]:
# vérification
a == b  # # Les objets référencés par a et b ont-ils le même contenu ? (égalité de valeur)
In [ ]:
#Vérification
a is b  # a et b désignent-ils le même objet en mémoire ? (égalité d'identité)
In [ ]:
id(a)  # montre où est stockée la chaîne "papa" en mémoire
id(b)  # montre où est stockée la chaîne "Papa" en mémoire (différente de a)

3.2. La fonction print() : afficher la valeur d’une variable

In [ ]:
print()
In [ ]:
#print() ajoute une ligne à la fin
print("Que nul n’entre ici s’il n’est géomètre.")
In [ ]:
print('orange', 'banane', 'pomme')
In [ ]:
print('orange', 'banane', 'pomme', sep=', ')
In [ ]:
print('orange', 'banane', 'pomme', sep=' | ')
In [ ]:
print('orange', 'banane', 'pomme', sep='\n') # avec saut à la ligne
In [ ]:
print('orange')
print('banane')
print('pomme')
In [ ]:
print('orange', 'banane', 'pomme', sep=' ')

Le séparateur par défaut est un espace.

In [ ]:
print('orange', end=' ') # On ajoute un espace à la fin
print('banane')
In [ ]:
print('orange', 'banane', 'pomme', end='.') # On ajoute un point à la fin
In [ ]:
print('*', 'orange', end='\n')
print('*', 'banane', end='\n')
print('*', 'pomme')
In [ ]:
print('*', 'orange', end='\n') 
print('\t*', 'banane', end='\n') # avec une tabulation
print('\t\t*', 'pomme')
In [ ]:
print("Nom", "Âge", "Ville", sep=" | ", end="\n" + "-"*20 + "\n")
print("Alice", 30, "Paris", sep=" | ")
print("Bob", 25, "Los Angeles", sep=" | ")

3.3. Accéder aux éléments d'une chaîne

In [ ]:
ma_chaine = 'abracadabra'

Une chaîne de caractères est un objet séquence.
Un objet séquence est un ensemble fini et ordonné d’éléments numérotés de 0 à n-1 si la chaîne comporte n caractères.
Ainsi, une chaîne de caractères peut être parcourue de manière séquentielle c'est-à-dire caractère par caractère. On dit qu’une chaîne de caractères est un objet itérable.
Exemple :
ma_chaine = 'abracadabra'
No description has been provided for this image

Compléter le tableau ci-dessous :

Instruction à saisir Résultat affiché
print(ma_chaine[0])
print(ma_chaine[5])
\(c\)
\(d\)
print(ma_chaine[-1])
print(ma_chaine[-3])

3.4. Manipuler les chaînes de caractères

Déterminer la longueur d’une chaine : la fonction len()

In [ ]:
len(ma_chaine)

Application :
Combien de caractères contient l'objet référencé par la variable ci-après ?

In [ ]:
une_chaine = "Je pense donc je suis"

Que renvoie l'instruction suivante : une_chaine[len(une_chaine) - 1] ?
Remarque :
Si la chaîne contient n caractères, l'indice du dernier caractère est n-1 et non n.
Avec l'indexage négatif, le dernier caractère est d'indice -1.

Opérations de slicing ou découpage en tranches (création de sous-chaînes)

In [ ]:
une_chaine = "Je pense donc je suis"
print(une_chaine[0:8])
In [ ]:
print(une_chaine[6:])
In [ ]:
print(une_chaine[:5])
In [ ]:
print(une_chaine[0:11:2])
In [ ]:
print(une_chaine[::3])
In [ ]:
print(une_chaine[-10:-7])
In [ ]:
print(une_chaine[::-1])

Concaténation de chaînes

In [ ]:
ma_chaine = 'abracadabra'
ma_deuxieme_chaine = 'ntesque'
resultat = ma_chaine + ma_deuxieme_chaine
print(resultat)

Répétition d'une chaîne

In [ ]:
mon_str = 'hi !'
print(5 * mon_str)
In [ ]:
print('-------+++-------'*4)

Tests d'appartenance ou de non appartenance à une chaîne

In [ ]:
une_chaine = "Le méchant est un ignorant"
"méchant" in une_chaine
In [ ]:
"rant" in une_chaine
In [ ]:
"ma" in une_chaine

Méthodes associées aux chaînes de caractères

lower() et upper() : renvoient respectivement une chaîne en minuscule et une chaîne en majuscule.

In [ ]:
une_chaine.upper()

count() : renvoie le nombre d'occurrence d'un caractère dans une chaîne.

In [ ]:
une_chaine.count('e')

La variable une_chaine contient 2 fois la lettre e.

startswith() : teste si une chaîne commence par une sous-chaîne donnée :

In [ ]:
une_chaine.startswith('L')
In [ ]:
une_chaine.startswith('l')
In [ ]:
une_chaine.startswith('méchant')

isalpha() : renvoie True si tous les caractères de la chaînes sont alphabétiques ; False sinon.
isalnum() : renvoie True si tous les caractères de la chaînes sont alphanumériques ; False sinon.

La fonction dir() permet d'afficher toutes les méthodes qui agissent sur un objet.

In [ ]:
dir(une_chaine)

Et la fonction help() permet d'afficher de l'aide sur une méthode donnée.
Syntaxe : help(type.méthode)

In [ ]:
help(str.startswith)

Application :
Que renvoie la méthode index() sur une chaîne de caractère ?
Appliquez-la avec le caractère i.

Technique de formatage : Les Instructions format et f-strings
Ces instructions qui sont équivalentes permettent d’insérer dans une chaîne des contenus variables.

In [ ]:
nom = 'Eyoum'
prenom = 'Francine'
ecole = 'Lycée Saint Pierre'
In [ ]:
print("Je m'appelle {} {} et fréquente le {}".format(prenom, nom, ecole))
In [ ]:
#f-string
print(f"Je m'appelle {prenom} {nom} et fréquente le {ecole}")
In [ ]:
print(f"{name}", f"{age}", sep=" : ", end=".\n")
In [ ]:
x = 30
y = 15
print(f"x = {x}, y = {y}")
In [ ]:
print(f"{x = }, {y = }")
In [ ]:
print(f"{x + y = }")
In [ ]:
import math
math.pi
In [ ]:
print(f"pi arrondi au centième s'écrit {math.pi:.2f}")
In [ ]:
#5 chiffres significatifs
print(f"{math.pi:.5g}")
In [ ]:
nombre = 3454353453
In [ ]:
#Ecriture scientifique
print(f"L'écriture scientifique de nombre est : {nombre:e}")
In [ ]:
#5 chiffres significatifs
print(f"{nombre:.3g}")
In [ ]:
#Ecriture comptable
print(f"nombre en format comptabilité : {nombre :_d}")
In [ ]:
#Ecriture comptable
print(f"nombre en format comptabilité : {nombre :_d}".replace("_", " ")) # si nombre est un entier
In [ ]:
print(f"nombre en format français : {nombre :,.2f}")
In [ ]:
print(f"nombre en format français : {nombre :,.2f}".replace(",", " ")) # si nombre est un nombre quelconque
In [ ]:
taux = 0.31587
print(f"Le taux en pourcentage est {taux = :.2%}")

Conversion de type ou construction d'un objet à partir d'un autre type :
En Python, une conversion de type crée un nouvel objet à partir d’un autre. L’objet obtenu est distinct de l’original, que ce soit par son type, son contenu ou son identité en mémoire.

In [ ]:
n = 123
type(n)
In [ ]:
t = str(n)
In [ ]:
type(t)
In [ ]:
print(t)
In [ ]:
id(n) == id(t)

4. Le type booléen

En Python, le type booléen est utilisé pour représenter la valeur de vérité d’une expression logique. Il ne peut prendre que deux valeurs : True (vrai) et False (faux).
Ces valeurs sont des objets de type bool, une sous-classe de int (entier), où True équivaut à 1 et False à 0.

In [ ]:
3 > 5
In [ ]:
#Egalité
"papa" == "Papa"
In [ ]:
3 <= 5
In [ ]:
True == 1
In [ ]:
False == 0
In [ ]:
True + False/ True
In [ ]:
#Différent (N'est pas égal)
1 + 2 != 3
In [ ]:
False == 0.0
In [ ]:
0.1 + 0.2 == 0.3

Opérateurs booléens : NOT, AND, OR

Ils permettent de construire des expressions logiques plus complexes.
x > 5 AND x < 21

In [ ]:
x = 10
5 < x < 21
In [ ]:
5 <= 1 or 7 > 3.2

5. Interaction avec l'utilisteur : La fonction input()

La fonction input() permet de demander à l'utilisateur de saisir une valeur pendant l'exécution d’un programme.

In [ ]:
nom = input()
In [ ]:
a = input()

Très souvent, cette instruction est accompagnée d’un message d’invite, qui précise à l’utilisateur ce que le programme attend de lui.

In [ ]:
prenom = input("Entrer votre prénom : ")
In [ ]:
entier = input("Taper un nombre entier : ")

Remarque importante :
La fonction input() renvoie toujours une chaîne de caractères (de type str), quelle que soit la saisie de l’utilisateur.
Si l’on souhaite obtenir une valeur numérique, il faut convertir explicitement la chaîne avec une fonction de conversion :

  • int() pour obtenir un entier,
  • float() pour obtenir un nombre à virgule flottante (réel).
In [ ]:
nombre = input("Taper un nombre entier : ")
In [ ]:
type(nombre)
In [ ]:
entier = int(nombre)            # conversion explicite en entier
In [ ]:
entier = int(input("Taper un nombre entier : "))

6. Les commentaires Python

En Python, un commentaire est une ligne de texte destinée à expliquer le code. Il n’est pas exécuté par l’interpréteur Python.
On crée un commentaire à l’aide du symbole dièse ( # ).
Les commentaires doivent être clairs, concis et servir à expliquer des parties importantes ou complexes du code. Voici un exemple simple :

In [ ]:
# Ceci est un commentaire
# Le programme ci-dessous demande un prénom à l'utilisateur

prenom = input("Entrez votre prénom : ")  # Demande de saisie

Remarques utiles :

  • Les commentaires peuvent être sur une ligne seule ou en fin de ligne de code.
  • Ils ne doivent pas être trop longs : quelques mots ou phrases suffisent.
  • Il est bon de commenter l’intention plutôt que de décrire le code ligne par ligne inutilement.

Mise en garde :
Un bon code se lit facilement sans avoir besoin de commentaires ligne par ligne.
Les commentaires ne doivent pas décrire ce que fait le code, mais expliquer pourquoi il est écrit de cette façon.
Utiliser les commentaires pour

  • Justifier un choix de méthode ou d’algorithme.
  • Expliquer une exception ou un cas particulier.
  • Donner un contexte utile à la compréhension du programme.

Faites-vous plaisir

  1. Parmi ces variables, lesquelles sont incorrectes ?
    ma_variable, _, _nom, 51_moyenne, personne3, 82eleve, eleve_10, MOT.
  2. fruit = "pamplemousse"
    Que renvoie les expressions suivantes ?
    1. fruit[2]
    2. fruit[7]
    3. fruit[0]
    4. fruit[-1]
    5. fruit[-3]
    6. fruit[2:7]
    7. fruit[:7]
    8. fruit[2:]
    9. fruit[::-1]
    10. len(fruit)
  3. fruit = "pamplemousse"
    Écrire une expression qui renvoie
    1. l'index de l
    2. le nombre de m
  4. Écrire un programme qui permet à un élève (un utilisateur) d'entrer ses trois spécialités de première. Le programme affiche alors, en majuscules, le nom d'une nouvelle « matière » en joignant les noms des spécialités ensemble.
  5. Écrire un programme dans lequel l'utilisateur saisit le total d'une note de restaurant. Le programme affiche alors deux montants : un pourboire de 15 % et un pourboire de 20 %.
  6. Écrire un programme de vendeur de voitures où l'utilisateur entre le prix de base d'une voiture et affiche le prix réel de la voiture une fois tous les frais supplémentaires ajoutés :
    • la TVA : 20 % du prix de base
    • la licence du concessionnaire : 5 % du prix de base
    • la préparation du concessionnaire : 500 €.
In [ ]:
# Qu'affiche a après exécution de tout le code ?
a = 8
b = 5
a = a + b
b = a - b
a = a - b
print(a)