Aller au contenu

Algo & Prog 1 Python : CM séance 01

0. Description de l'UE

Présentation :

  • UE SMI3U12L - "Algorithmique et Programmation 1 Python"
  • Responsable : Edouard.Thiel@univ-amu.fr
  • 8 séances : CM 1h30, TP 2h
  • Site du cours : https://j.mp/py-et

Objectifs :

  • approfondir la programmation orientée objets en Python 3 ;
  • interfaces graphiques et dessins avec TkInter ;
  • programmation d'algorithmes orientés mathématiques.

Comment travailler ce cours ?

  • prenez beaucoup de notes ;
  • téléchargez le fichier du cours et annotez-le ;
  • après chaque séance, complétez le cours avec vos remarques ;
  • tenez à jour un "pense-bête" avec les points et exemples qui vous semblent importants ;
  • installez Python3 (sur ordinateur ou tablette) ;
  • testez chaque instruction, chaque programme, faites des variantes ;
  • imaginez des petits exercices.

MCCC : 1

  • Note finale session 1 = max { ET ; 0.7 ET + 0.3 CC }
  • À l'examen :
    • calculette : non
    • document autorisé : un pense-bête personnel sur 1 feuille A4 recto-verso
  • TP : utilisation d'IAs génératives interdite.
  • Présence aux CM et TP obligatoire.

1. Rappels de Python 3

1.1. Présentation du langage

Créé par Guido van Rossum (informaticien hollandais) depuis 1989 (soit 35 ans)
objectif = facile à apprendre et puissant

Langage de plus en plus utilisé :

  • recherche scientifique, applications web, administration système, transactions boursières, prototypage...
  • enseigné partout (lycées, prépas, écoles, licences, masters...)
  • idéal pour débutants jusqu'aux développeurs confirmés

Amélioration du langage : communautaire

Versions :

  • 2.0 en 2000
  • 2.7 en 2010 - obsolète
  • 3.0 en 2008 - rupture
  • 3.12 en 2023

v 2.7 obsolète depuis 2020, mais encore utilisé dans de nombreux programmes
v >= 3.8 conseillée
versions les plus récentes : améliorations techniques, efficacité

Langage interprété, pas besoin de phase de compilation comme en C ou java. l'interpréteur est python3.

En TP : sous Linux ou WSL

  • Ouvrir un terminal (par le menu ou CTRL-ALT-T)
  • Connaître la version installée :

    $ python3 --version
    Python 3.8.10
    

1.2. Modes

Il y a 2 modes : interactif (calculette) et programme (script).

1.2.1. Mode interactif

Utile pour tester des choses, ou faire un petit calcul.

Ouvrir un terminal (CTRL-ALT-T) : le prompt du shell est $, celui de python3 est >>> :

$ python3      # on lance l'interpréteur Python
>>> 5+3.2      # 8.2
>>> 5/3        # 1.6666666666666667
>>> 5//3       # 1
>>> 5**3       # 125
>>> 7**50      # 1798465042647412146620280340569649349251249   : big int
>>> "hip" + "hop"   # hiphop  = concaténation
>>> "hop"*3         # hophophop
>>> True and False  # False

Les commentaires commencent par #

Il existe de nombreux modules, par exemple math pour les réels :

>>> import math
>>> math.factorial(40)     # 815915283247897734345611269596115894272000000000
>>> math.cos(math.pi/4)*2  # 1.4142135623730951

Le module cmath est utile pour les nombre complexes :

>>> a = complex(1,2)
>>> a                      # (1+2j)
>>> a*a.conjugate()        # (5+0j)
>>> import cmath
>>> cmath.sqrt(a)          # (1.272019649514069+0.7861513777574233j)

Pour obtenir l'aide en ligne :

>>> help(math)      # Tout est documenté dans l'interpréteur
: <space>           # page suivante
: /cos              # recherche d'un mot clé
: n ou b            # suivant ou précédent
: q                 # quitter l'aide

On peut aussi taper help() puis un mot clé, ou help('mot clé')

>>> help('if')
>>> q

>>> quit()   # ou Ctrl-D, pour quitter python3

1.2.2. Mode programme

Dès que l'on dépasse quelques lignes de python il vaut mieux les écrire dans un fichier, avec l'extension .py

Ouvrir un terminal (CTRL-ALT-T)

  • Dans le terminal :

    $ mkdir InfoS3                   # on créé un répertoire de travail
    $ cd InfoS3                      # on va dans ce répertoire
    $ gedit essai1.py &              # on ouvre ou crée essai1.py avec gedit
    
  • Dans gedit, taper

    print ("Hello World!")
    

puis enregistrer ; on peut laisser gedit ouvert.

  • Dans le terminal, on exécute le programme python :

    $ python3 essai1.py
    

L'idéal est de laisser les 2 fenêtres côte à côte.

Remarque :

En mode script, python n'affiche pas la valeur des expression, il faut utiliser print.

Exemple dans gedit :

3+5                         # n'affichera rien
print (3+5)                 # affichera 8
Transformer un fichier python en script Unix
  • Rajouter en première ligne

    #! /usr/bin/env python3
    
  • donner les droits d'exécution

    $ chmod +x toto.py
    
  • on peut maintenant faire

    $ ./toto.py
    

→ plus besoin d'invoquer python3

1.3. Variables et types

1.3.1. Variables

Pas de déclaration, variable créée par affectation :

$ python3
>>> a = 5
>>> a         # 5
>>> a+3       # 8
>>> a = a*2
>>> a         # 10
>>> a++       # SyntaxError
>>> a += 1
>>> a         # 11

Nom de variable : 1 lettre + 0 ou plusieurs {lettre,chiffre} :

a, x1, couleur, nb_formes, nombreFormes

Sensible à la casse, lettres accentuées possibles → gare aux confusions :

>>> cafe = "froid" ; Cafe = "chaud" ; café = "moulu"
>>> cafe ; Cafe ; café      # 'froid' 'chaud' 'moulu'

Bon usage : éviter de commencer les variables avec majuscule ou _

1.3.2. Typage dynamique

Les valeurs ont un type :

>>> type(2)                 # <class 'int'>
>>> type(2.5)               # <class 'float'>
>>> type("salut")           # <class 'str'>   chaînes délimitées par "" ou ''
>>> type(True)              # <class 'bool'>
>>> type(None)              # <class 'NoneType'>   équiv NULL en C

Type d'une variable selon sa valeur courante : typage dynamique

>>> a = 2 ; type(a)         # <class 'int'>
>>> a = 2.5 ; type(a)       # <class 'float'>

Vérification de types :

>>> a = 5 ; type(a) == int          # True

idem avec float, bool, str (mais pas NoneType)

Exemple d'utilisation :

a = ...
if type(a) == int :
    print("c'est un entier")

On peut aussi faire :

a = ...
est_réel = type(a) == float   # expression booléenne valant True ou False
if est_réel :
    print("c'est un réel")

Il y a beaucoup d'autres types (vus plus tard) : tuples, listes, ensembles, dictionnaires, tableaux, classes...

1.3.3. Manipulation de types

Transformations de types :

>>> str(5)          # '5'
>>> int("5")        # 5
>>> int(2.5)        # 2
>>> float("3.14")   # 3.14
>>> int(True)       # 1
>>> bool(0)         # False
>>> int("toto")     # ValueError

Mélanges de types :

>>> type(2+3.14)    # <class 'float'> : type plus général
>>> type(2+True)    # <class 'int'>
>>> type(2+"toto")  # TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> type(2*"hop")   # <class 'str'>

1.3.4. Chaînes de caractères

Opérations sur les str :

>>> s = "Je mange un {légume} et un {fruit}"
>>> len(s)          # 34
>>> s[:8]           # 'Je mange'
>>> s[13:19]        # 'légume'
>>> s.format(fruit="kiwi", légume="concombre")
'Je mange un concombre et un kiwi'

Les f-strings (python 3.6) sont plus concis que la méthode format :

>>> fruit = "abricot" ; légume = "radis"
>>> f"Je mange un {légume} et un {fruit}"
'Je mange un radis et un abricot'

Les f-strings permettent aussi d'afficher un calcul avec une précision :

>>> x = 5 ; y = 7
>>> f"Le résultat de {x} divisé par {y} est {x/y:.3}"
'Le résultat de 5 divisé par 7 est 0.714'

1.3.5. Références

Qu'est-ce qu'une variable en python ?

C'est une référence (une adresse) vers un objet en mémoire.

Quand on écrit

>>> x = 1.4142

alors Python crée un objet de type float en mémoire, stocke la valeur 1.4142 dans l'objet, puis mémorise dans la variable x l'adresse de l'objet.

On peut obtenir l'adresse de l'objet avec la fonction id().

>>> id(x)
140630251125296         # adresse de l'objet de type float qui stocke la valeur

Une affectation dans une variable est une copie de la référence, pas du contenu de l'objet.

>>> y = x
>>> id(y)
140630251125296         # même adresse

L'opérateur is permet de savoir si deux variables désignent le même objet :

>>> x is y
True

Quand on demande le type d'une variable, on obtient en réalité le type de l'objet référencé :

>>> type(x)
<class 'float'>

Lorsqu'on fait une affectation avec une variable qui existe déjà, on remplace simplement la référence mémorisée par une autre :

>>> id(x)
140630251125296
>>> x = 'foo'       # un nouvel objet de type str est créé pour stocker 'foo'
>>> id(x)
140630272263024

Si plus aucune variable ne connait l'objet précédemment mémorisé, l'objet est détruit automatiquement par le ramasse-miette (uk : garbage collector).

1.4. Entrées sorties

Affichage dans le terminal :

>>> print("bonjour")
>>> a = 2 ; b = 3
>>> print("mangez", a, "pommes et", b, "poires")
>>> print("mangez", a, "pommes et", b, "poires", sep="--")   # par défaut " "
>>> print("mangez", a, "pommes et", b, "poires", end="++")   # par défaut "\n"
>>> help(print)

Saisie dans le terminal :

>>> a = input()
>>> b = input("poires : ")
>>> type(b)                         # str : input() renvoie toujours un str
>>> b = int(input("poires : "))
>>> type(b)                         # int

Exemple : programme fruits.py

a = input("pommes : ")
b = input("poires : ")
n = a+b
print("Il y a", n, "fruits")

Exécution :

$ python3 toto.py
pommes : 3
poires : 5
Il y a 35 fruits

Oups ! a et b sont des str, donc a+b concatène les chaînes
a = int(input(...)) et idem pour b

Compléments : écriture et lecture dans un fichier

>>> f = open("toto.txt", "w")
>>> f.write("salut")  # ou print("salut", file=f)
>>> f.close()
>>> 
>>> f = open("toto.txt", "r")
>>> s = f.read()
>>> f.close()
>>> s                   # 'salut\n'

1.5. Blocs d'instructions

Blocs d'instructions non délimités par { } ou begin end comme en C, java, Pascal

Blocs définis par l'indentation :
    des lignes qui se suivent avec la même indentation forment un bloc
    une instruction nécessitant un sous-bloc est terminé par :
        un sous-bloc a une indentation plus grande
        en général on indente de 4 espaces
le premier bloc a une indentation de 0

Structures de contrôle nécessitant un sous-bloc : conditionnelle, boucle, fonction

Possibilités de mettre une instruction sur plusieurs lignes :

on peut découper une instruction en mettant un \
    à la fin d'une ligne pour dire qu'elle a une suite.

on peut aussi revenir à la ligne lorsqu'une (
    est ouverte), ou un [
    pour les listes ou les ensembles], ou encore un {
    pour les dictionnaires}.

L'indentation des suites de lignes n'est pas obligatoire, mais conseillée.

1.5.1. Conditionnelle

if condition1 :
    bloc1

if condition1 :
    bloc1
else :
    bloc2

if condition1 :
    bloc1
elif condition2 :
    bloc2
...
else :
    blocN

Exemple :

nb_pommes = 5
fruit = input("Entrez un fruit : ")
if fruit == "pomme" :
    nb_pommes += 1
    print("Il y a", nb_pommes, "pommes.")
else :
    print("Je ne connais pas ce fruit.")

Remarque : un sous-bloc doit comporter au moins une instruction, sinon pass

if x % 2 == 0 :
    pass
else :
    print("x est impair")

On aurait pu écrire plus simplement

if not (x % 2 == 0) :
    print("x est impair")

Remarque : depuis v3.10 il y a l'équivalent d'un switch en python : match,case

1.5.2. Boucle while

while condition1 :
    bloc1

Exemple : calculer la somme des entiers de 1 à n

i = 1 ; n = 10 ; somme = 0
while i <= n :
    somme += i
    i += 1          # en mode interactif sauter 1 ligne pour sortir du bloc
print ("Le résultat est", somme)

Vus plus tard :

  • on peut contrôler la boucle avec : break, continue, else
  • il y a aussi une boucle for, différente du C et java

1.5.3. Fonction

Déclarer une fonction :

def nom_fonction (paramètre1, paramètre2, ...) :
    bloc1

Étant donné que en Python toutes les variables sont des références, le passage de paramètres à une fonction est toujours un passage par référence.

Appeler la fonction :

résultat = nom_fonction (valeur1, valeur2,...)
nom_fonction (valeur1, valeur2,...)             # résultat ignoré

Dans le bloc principal de la fonction :

return valeur
return          # renvoie None

→ sort immédiatement de la fonction

Exemple : somme des entiers de 1 à n

def calculer_somme (n) :
    if n <= 0 :
        return 0        # sortie immédiate, "early return"
    i = 1 ; somme = 0
    while i <= n :
        somme += i
        i += 1
    return somme

# Programme principal
n = int(input("Entrez n : "))
s = calculer_somme (n)
print ("Le résultat pour n =", n, "est", s)

Portée des variables (scope) :

Les paramètres et variables internes à la fonction sont locales
→ hors de la fonction pas d'accès à n, i, somme

Vus plus tard : variables globales, paramètres nommés, optionnels, etc

Très important : bonne structuration dans un fichier python pour faciliter la relecture :

# 1) Les imports

# 2) Les fonctions

# 3) Le programme principal

  1. MCCC = Modalités de contrôle des connaissances et des compétences ; ET = Examen Terminal ; CC = Contrôle Continu.