Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier

La page est créée Fabrice David
 
CONTINUER À LIRE
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Logiciels scientifiques - HLMA310
         Partie 1 : Python

             Joseph Salmon
        http://josephsalmon.eu

         Université de Montpellier

                                     1 / 79
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Enseignant : cours magistral

‚ Joseph Salmon :
    § Situation actuelle : Professeur à l’université de Montpellier
    § Précédemment : Paris Diderot-Paris 7, Duke University,
      Télécom ParisTech, University of Washington
    § Spécialités : statistiques en grande dimension, optimisation,
      agrégation, traitement des images
    § Bureau : 415, Bat.9

  Contact:                       Joseph Salmon
                                  joseph.salmon@umontpellier.fr

 Github: @josephsalmon               Twitter: @salmonjsph

                                                                      2 / 79
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Enseignant : TPs

‚ Tiffany Cherchi :
    §   Situation actuelle : Doctorante à l’université de Montpellier
    §   Spécialités : probabilités
    §   Email : tiffany.cherchi@umontpellier.fr
    §   Bureau : ? ? ?, Bat. 9

‚ Pascal Azerad :
    § Situation actuelle : Maître de conférences à l’université de
      Montpellier
    § Spécialités : analyse numérique et mécanique des fluides
    § Email : pascal.azerad@umontpellier.fr
    § Bureau : ? ? ?, Bat 9

                                                                        3 / 79
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Calendrier de validation (pour la partie 1)

  ‚ TP noté : 40% de la note finale
      § Date de mise en ligne : lundi 8 octobre, et à rendre sur le
        Moodle du cours pour le vendredi 12, 23h59. Rendu sous
        forme de jupyter notebook (un unique fichier .ipynb).
        Plus d’informations en cours et en TP !

  ‚ Contrôle continu : 60% de la note finale
      § effectué le mardi 16 octobre.

ATTENTION : le travail sera un rendu individuel ! ! !

                                                                      4 / 79
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Ressources en ligne

Informations principales : site du cours
http://josephsalmon.eu/index.php?page=teaching_18_19&lang=fr

  § Slides (au fil de l’eau)
  § Poly (en cours)
  § Feuilles de TP

Rendu TP : Moodle de l’université
https://moodle.umontpellier.fr/course/view.php?id=5558

                                                               5 / 79
Logiciels scientifiques - HLMA310 Partie 1 : Python - Joseph Salmon Université de Montpellier
Notation pour le TP noté
Rendu : par Moodle en déposant un fichier nom_prenom.ipynb
dans le dossier adéquat.
Détails de la notation du TP (noté sur 20) :
 § Qualité des réponses aux questions : 14 pts
  § Qualité de rédaction et d’orthographe : 1 pt
  § Qualité des graphiques (légendes, couleurs) : 1 pt
  § Style PEP8 valide : 2 pts
  § Qualité d’écriture du code (nom de variable clair,
    commentaires utiles, code synthétique, etc.) : 1 pt
  § Notebook reproductible (i.e., Restart & Run all marche
    correctement) et absence de bug : 1 pt
Pénalités :
  § Envoi par mail : zéro
  § Retard : zéro, sauf excuse validée par l’administration
                                                              6 / 79
Bonus

2 pt supplémentaire sur la note finale (de la partie 1) pour toute
contribution à l’amélioration des cours (présentations, codes, etc.)

Contraintes :
  § seule la première amélioration reçue est “rémunérée”
  § déposer un fichier .txt (taille
Prérequis - à revoir seul

§ Bases de probabilités : probabilité, densité, espérance,
  théorème central limite
  Lecture : Foata et Fuchs (1996)
§ Bases de l’algèbre (bi-)linéaire : espaces vectoriels, normes,
  produit scalaire, matrices, diagonalisation
  Lecture : Horn et Johnson (1994)

                                                                   8 / 79
Prérequis - à revoir seul

§ Bases de probabilités : probabilité, densité, espérance,
  théorème central limite
  Lecture : Foata et Fuchs (1996)
§ Bases de l’algèbre (bi-)linéaire : espaces vectoriels, normes,
  produit scalaire, matrices, diagonalisation
  Lecture : Horn et Johnson (1994)
§ Bases de l’algèbre linéaire numérique : résolution de
  système, pivot de Gauss, factorisation de matrices,
  conditionnement, etc.
  Lecture : Golub et VanLoan (2013), Applied Numerical
  Computing par L. Vandenberghe

                                                                   8 / 79
Prérequis - à revoir seul

§ Bases de probabilités : probabilité, densité, espérance,
  théorème central limite
  Lecture : Foata et Fuchs (1996)
§ Bases de l’algèbre (bi-)linéaire : espaces vectoriels, normes,
  produit scalaire, matrices, diagonalisation
  Lecture : Horn et Johnson (1994)
§ Bases de l’algèbre linéaire numérique : résolution de
  système, pivot de Gauss, factorisation de matrices,
  conditionnement, etc.
  Lecture : Golub et VanLoan (2013), Applied Numerical
  Computing par L. Vandenberghe

                                                                   8 / 79
Description du cours

Objectifs : utilisation de Python pour le traitement et la
visualisation de données.
  § méthodes basiques de programmation/algorithmique en
    Python
  § librairies standards de méthodes numériques (numpy,scipy)
  § librairies standards de traitement de bases de données
    (pandas)
  § visualisation (matplotlib, seaborn)
  § introduire des bonnes pratiques numériques valables pour tous
    les langages (lisibilité, documentation)

                                                                    9 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python

Conditions et boucles

Fonctions en Python

                                              10 / 79
Aspects algorithmiques : quelques conseils

(TODO : Démo sur une machine de l’université)
Python : installation fonctionnelle sur les machines de l’université,
Utiliser anaconda3 et anaconda-navigator.

Informations détaillées sur le polycopié disponible ici :
http://josephsalmon.eu/enseignement/Montpellier/HLMA310/IntroPython.pdf

Rem: premier TP principalement sur la prise en main

                                                                          11 / 79
Installation personnelle

Installation de Python sur machines personnelles :
Utiliser Conda / Anaconda (tous OS) (et pip seulement pour les
packages les plus rares, non disponibles sous Anaconda)

Attention : pas d’aide des enseignants sur ce point ;
entraidez-vous !

Format de rendus de TP : jupyter notebook

Rem: en TP, prenez vos portables si vous préférez garder votre
environnement (packages, versions, etc.)

                                                                 12 / 79
Python 2 vs. Python 3

Principales différences :

  print "bonjour"                vs.        print("bonjour")

et aussi
  xrange                         vs.        range()

Migration en cours de toutes les librairies populaires :
Exemple: Numpy : arrête de supporter Python 2.7 en 2019

Rem: détails des différences dans le poly
Rem: je suis passé à Python 3 en 2017

                                                               13 / 79
Conseils généraux pour l’année
  § Adoptez des règles d’écriture de code et tenez-y vous !
    Exemple: PEP8 pour Python (utiliser AutoPEP8, ou pour
    les notebooks https://github.com/kenkoooo/jupyter-autopep8)
  § Utilisez Markdown (.md) pour les parties rédigées /
    comptes-rendus (e.g., markdown-preview-plus avec Atom)

     "A (wo)man must have a code."
                           - Bunk
             Source : The Wire, épisode 7, saison 1.

  § Apprenez de bons exemples (ouvrez les codes sources !) :
    https://github.com/scikit-learn/,
    http://jakevdp.github.io/, etc.
TODO : exemple de jupyter notebook, ouvrir IntroPython.ipynb
                                                                  14 / 79
Éditeurs de texte (pas seulement pour Python)

Motivation : les jupyter notebooks sont excellents pour des projets
courts. Cas plus long, utiliser : IPython + éditeur de texte avancé

Éditeurs recommandés :
  § Visual Studio Code,
  § Atom
  § Sublime Text
  § vim (fort coût d’entrée, déconseillé)
  § emacs (fort coût d’entrée, déconseillé)

Bénéfices : coloration syntaxique, auto-complétion du code,
débogueur graphique

                                                                      15 / 79
Environnement intégré (plus avancé)

PyCharm :
  § coloration syntaxique
  § auto-complétion
  § vérification de code dans l’environnement
  § débogueur graphique
  § intégration avec gestionnaires de versions (git)
  § gestion des environnements virtuels (VirtualEnv)
  § gestion des tests, etc.

                                                       16 / 79
Versionnement de code

Motivation : garder trace de son code et de l’évolution
incrémentale de ses fichiers, notamment (mais pas uniquement)
pour le travail en groupe

  § système privilégié Git
  § utilisable avec des solutions en ligne (Bitbucket, Github)

Historique : popularisé par la communauté logiciel libre et créé en
2005 par Linus Torvalds (auteur du noyau Linux)

Exemple: https://github.com/scikit-learn/scikit-learn

                                                                      17 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python

Conditions et boucles

Fonctions en Python

                                              18 / 79
Popularité de Python sur Stackoverflow

 Source :   https://stackoverflow.blog/2017/09/06/incredible-growth-python/

                                                                              19 / 79
Popularité de Python sur Stackoverflow

 Source :   https://stackoverflow.blog/2017/09/06/incredible-growth-python/

                                                                              19 / 79
Python dans les médias : découverte du Boson
          de Higgs (CERN, 2012)

                                      Collisions
Sources :
  § https://home.cern/fr/science/physics/higgs-boson
  § https://cms.cern/news/observing-higgs-over-one-petabyte-new-cms-open-data
                                                                                20 / 79
Python dans les médias : découverte du Boson
          de Higgs (CERN, 2012)

                      Matplotlib (pour la visualisation)
Sources :
  § https://home.cern/fr/science/physics/higgs-boson
  § https://cms.cern/news/observing-higgs-over-one-petabyte-new-cms-open-data
                                                                                20 / 79
Python dans les médias : découverte du Boson
          de Higgs (CERN, 2012)

                 Jupyter notebook (pour la présentation)
Sources :
  § https://home.cern/fr/science/physics/higgs-boson
  § https://cms.cern/news/observing-higgs-over-one-petabyte-new-cms-open-data
                                                                                20 / 79
Python dans l’académique :
                 aspect enseignement

Python est au programme des classes préparatoires aux
grandes écoles (depuis 2013)

“Depuis la réforme des programmes de 2013, l’informatique est présente
dans les programmes de CPGE à deux niveaux. Un tronc commun à
chacune des trois filières MP, PC et PSI se donne pour objectif
d’apporter aux étudiants la maîtrise d’un certain nombre de concepts de
base : conception d’algorithmes, choix de représentations appropriées des
données, etc. à travers l’apprentissage du langage Python.”

Source : https://info-llg.fr/

                                                                            21 / 79
Python dans l’académique :
                  aspect recherche
Exemple d’une package populaire d’apprentissage automatique
(   : machine learning) : scikit-learn

Source : Google Scholar (8/09/2018)

  § « 1000 pages de documentation
  § « 500, 000 utilisateurs les 30 derniers jours (fin 2017)
  § « 42, 000, 000 pages vues sur le site (2017)
Source : Alexandre Gramfort (INRIA - Parietal)
                                                               22 / 79
Python dans l’académique :
                  aspect recherche
Exemple d’une package populaire d’apprentissage automatique
(   : machine learning) : scikit-learn

Source : Google Scholar (8/09/2018)

  § « 1000 pages de documentation
  § « 500, 000 utilisateurs les 30 derniers jours (fin 2017)
  § « 42, 000, 000 pages vues sur le site (2017)
Source : Alexandre Gramfort (INRIA - Parietal)
                                                               22 / 79
Explication du succès de Python
Proverbe (récent) :
     : Python ; the second best language for everything !
     : Python ; le deuxième meilleur langage pour tout !

Autres bénéfices de Python :
  § langage compact (5X plus compact que Java ou C++)
  § ne requiert pas d’étape — potentiellement longue — de
    compilation (comme le C) ùñ débogage plus facile
  § portabilité sur les systèmes d’exploitation courants (Linux,
    MacOS, Windows)

En résumé : Python = excellent “couteau suisse” numérique

                                                                   23 / 79
Les limites (car il en existe !)

§ vitesse d’exécution souvent inférieure vs. C/C++, Fortran
  (langage compilé de plus bas niveau)

§ langage permissif, un programme peut “tourner” avec des
  “erreurs” non dépistées ; vigilance donc !

                                                              24 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python

Conditions et boucles

Fonctions en Python

                                              25 / 79
Popularisation récente : richesse des librairies
        “libres” (    : open source) (1)

Apprentissage automatique (   : Machine learning) :
               § sklearn (2010)
               § tensorflow (2015)
Traitement du langage (   : Natural Language Processing) :
               § nltk (2001)
Traitement des images (   : image processing) :
               § skimage (2009)
Développement web :
              § django (2005)

(1) ce n’est pas le cas de matlab par exemple ; dont le coût = plusieurs dizaines de milliers d’euros pour l’université
                                                                                                                          26 / 79
Librairies indispensables en Python
                    (pour ce cours)

  § Numpy
    https://github.com/agramfort/liesse_telecom_paristech_python/blob/master/2-Numpy.ipynb

    https://www.labri.fr/perso/nrougier/from-python-to-numpy/index.html

  § Scipy :
    https://github.com/agramfort/liesse_telecom_paristech_python/blob/master/3-Scipy.ipynb

  § Matplotlib :
    https://www.labri.fr/perso/nrougier/teaching/matplotlib/matplotlib.html

    https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003833

  § Pandas :      https://github.com/jorisvandenbossche/pandas-tutorial

Tutos/Vidéos de Jake Vanderplas OBLIGATOIRE ! :
Reproducible Data Analysis in Jupyter

                                                                                             27 / 79
Écosystème Python :
Panorama partial et partiel

                              28 / 79
Livres et ressources en ligne complémentaires

   Général : Skiena, The algorithm design manual, 1998 (en
             anglais)
   Général : Courant et al., Informatique pour tous en classes
             préparatoires aux grandes écoles : Manuel
             d’algorithmique et programmation structurée avec
             Python, 2013
Général / Science des données : Guttag, Introduction to
             Computation and Programming, 2016 (en anglais)
Science des données : J. Van DerPlas, With Application to
             Understanding Data, 2016 (en anglais)
Code et style : Boswell et Foucher, The Art of Readable Code,
              2001 (en anglais)
   Python : http://www.scipy-lectures.org/
Visualisation (sous R) : https://serialmentor.com/dataviz/

                                                                 29 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python
   Affichage et aide
   Chaînes et nombres
   Listes et variantes

Conditions et boucles

Fonctions en Python

                                              30 / 79
Affichage
Afficher :
  >>> print('Salut tout le monde')e
  Salut tout le monde

Obtenir de l’aide sur une fonction/commande que l’on connaît :
  >>> print?

On peut aussi obtenir la liste des attributs disponibles par objet :
  >>> dir('Salut tout le monde')
  ['__add__',
   '__class__',
   '__contains__', ...

                                                                       31 / 79
Erreur et bugs

Exemple: une erreur simple
  >>> print('Salut
  SyntaxError: EOL while scanning string literal

Python est (assez) explicite dans les messages d’erreur. Il faut
généralement commencer par lire ces messages par le bas.
Ici, l’erreur indique une mauvaise syntaxe, et que la fin de la ligne
(      : End Of Line) a été atteinte pendant la lecture de la chaîne
de caractères.

                                                                        32 / 79
Chaînes de caractères (                                        : string)
Chaînes de caractères : permettent de représenter du texte. Elles
peuvent être entourées par des apostrophes ou des guillemets.

Ainsi :
   >>> salutation_apostrophe = 'Salut tout le monde'
   >>> salutation_guillemet = "Salut tout le monde"

sont en fait deux chaînes identiques (2)

Rem: pour connaître la taille (                       : length) il suffit d’utiliser len
   >>> len(salutation_apostrophe)
   >>> len(salutation_guillemet)
   20
   20

(2) on pourra tester ce fait en utilisant la commande : salutation_apostrophe == salutation_guillemet, ou
plus naïvement, en visualisant les deux chaînes
                                                                                                            33 / 79
Propriétés des chaînes de caractères

Polymorphisme : le signe plus ’+’ signifie différentes choses pour
            différents objets : l’addition pour les entiers et la
            concaténation pour les chaînes de caractères
            Propriété générale de Python : la nature d’une
            opération dépend des objets sur lesquels ils agissent
Immuabilité : Les chaînes sont immuables en Python - elles ne
             peuvent pas être modifiées sur place (en anglais in
             place) après leur création. L’immuabilité : utilisée
             pour assurer qu’un objet reste constant tout au long
             d’un programme

                                                                     34 / 79
Chaînes de caractères (raffinements)
Une version de print qui permet d’afficher des listes de caractères
plus évoluées et contenant des paramètres est la suivante :

  >>>first_name = 'Joseph'
  >>>last_name = 'Salmon'
  >>>print('Prénom : {} ;
           nom : {};'.format(first_name,last_name))
  >>> print(type(salutation_guillemet))
  str

Rem: pour l’épineuse question des accents et des encodages, le
lecteur curieux pourra découvrir les joies de l’utf8 ici :
   § http://sdz.tdct.org/sdz/comprendre-les-encodages.html
  § http://sametmax.com/
    lencoding-en-python-une-bonne-fois-pour-toute/

                                                                      35 / 79
Caractères spéciaux

Quelques chaînes spéciales méritent d’être connues comme
l’apostrophe, le retour à la ligne ou la tabulation :
  >>> print('l\'apostrophe dans une chaîne')
  ... print('Hacque ,\n post \n postridie')
  ... print('\t \t descriptione, post \npostridie')
  l'apostrophe dans une chaîne
  Hacque ,
   post
   postridie
       descriptione, post
  postridie

                                                           36 / 79
Opérations sur les chaînes de caractères
Concaténation :
  >>> 'Et un,' + ' et deux,' + ' et trois zéros'
  'Et un, et deux, et trois zéros'

Répétition :
  >>> 'Et un,' * 8
  'Et un,Et un,Et un,Et un,Et un,Et un,Et un,Et un,'

Remplacement :
  >>> 'Et un,'.replace('un', 'deux')
  'Et deux,'

Découpage :
  >>> chaine = 'aaa, bbb, cccc, dd'
  >>> chaine.split(',')
  ['aaa', ' bbb', ' cccc', ' dd']
                                                       37 / 79
Opérations sur les chaînes de caractères

Extractions et slicing :
   >>> chef_gaulois = 'Abraracourcix'
   ... print(chef_gaulois[0], chef_gaulois[-1])
   ... print(chef_gaulois[4:], chef_gaulois[:4])
   ... print(chef_gaulois[2:5])
   ... print(chef_gaulois[::2])
   ... print(chef_gaulois[::-1])
   A x
   racourcix Abra
   rar
   Arrcucx xicruocararbA

plus d’info sur les chaînes :
http://www.fil.univ-lille1.fr/~wegrzyno/portail/Info/Doc/HTML/seq4_chaines_caracteres.html

                                                                                             38 / 79
Les entiers

Nombres les plus simples manipulables : les entiers (    : integers).

Type le plus simple et disposant des 4 opérations usuelles :
+,-,*,//

Exemple: calcul de 5!
  >>> fact5 = 1 * 2 * 3 * 4 * 5
  >>> print(fact5)
  120
  >>> type(fact5)
  int

                                                                        39 / 79
Attention aux divisions !
L’opération de division est particulière : la division entière est en
fait obtenue par la commande // et le reste par %. Ainsi,
  >>> 7 // 3
  2
  >>> 7 % 3
  1

mais en revanche :
  >>> 7 / 3
  2.3333333333333335

Une manière de comprendre cela est que
  >>> type(7 / 3)
  float
  >>> type(7 // 3)
  int

                                                                        40 / 79
Explications

Python a changé le type d’entier vers flottant (float), que nous
allons voir maintenant.

Vigilance donc sur ce type d’opération !

                                                                   41 / 79
Nombres flottants (                  : float)

Bref aperçu : ce concept sera revu en détails par Vanessa Lleras
(Partie Matlab)

Rem: les nombres réels mathématiques sont représentés par des
suites infinies de chiffres, e.g., π ; impossible pour un ordinateur !

Nombres flottants (numériques) : nombres qui permettent de
représenter, à précision choisie (ou donnée par défaut), les nombres
réels que l’on manipule en mathématique.

  >>> nb_flottant = 3.2
  >>> print(type(nb_flottant))
  float

                                                                         42 / 79
Flottants opérations usuelles

Notation exponentielle :

  >>> 1e-3
  0.001
  >>> 1e10
  10000000000.0

permet d’afficher les nombres voulus en format scientifique

Opérations usuelles : ici il n’y pas de soucis pour les 4 opérations
usuelles : +,-,*,/
Rem: le carré d’un nombre x s’écrit par contre x** 2

                                                                       43 / 79
Flottants et arithmétique étrange
Gestion de l’arrondi : “l’arithmétique” associée aux flottants est
troublante
   § quand on retranche des quantités petites du même ordre
   § quand on ajoute des nombres trop grands
Pour comprendre l’aspect délicat des flottants, on pourra tenter de
comprendre ce qui se passe quand on tape :
  >>> nb_small1 = 1e-41
  >>> nb_small2 = 1e-40
  >>> nb_small1 - nb_small2
  -8.999999999999999e-41

ou pour des grand nombres :
  >>> nb_big1 = 1e150
  >>> nb_big2 = 1e150
  >>> nb_big1 * nb_big2
  9.999999999999999e+299
                                                                      44 / 79
inf et nan

Pour des nombres trop grand on atteint la valeur “infinie”,
représentée par inf en Python.
Une quantité tout aussi étrange mais parfois fort utile à connaître
est le nan (    : not a number) représente un nombre qui n’en est
pas un !
Exemple: pour obtenir des nan’s
  >>> too_big = nb_big1 * nb_big2 ** 2
  >>> print(too_big)
  inf
  >>> too_big / too_big
  nan
  >>>too_big - too_big
  nan

                                                                      45 / 79
Conversion float/int/str
Passer de float à int
  >>> int(3.0), type(int(3.0))
  (3, int)

Passer de int à float
  >>> float(3), type(float(3))
  (3.0, float)

Passer de float à str
  >>> str(3.), type(str(3.))
  ('3.0', str)

Passer de str à float
  >>> float('3.'), type(float('3.'))
  (3.0, float)

                                            46 / 79
Nombres complexes
Représentation des nombres complexes : le nombre complexe dont
le carré est -1 s’écrit 1j sous Python.
Par exemple :
  >>> (1j)**2
  (-1+0j)

On peut aussi utiliser la librairie cmath pour avoir accès au
module, à la phase, etc.
  >>>   import cmath
  >>>   z = complex(4, 3)
  >>>   print(abs(z), cmath.polar(z))
  >>>   print(z.real, z.imag)
  5.0   (5.0, 0.6435011087932844)
  4.0   3.0

                                                                 47 / 79
Booléens
Booléens (3) : variables qui valent zéro ou un, ou de manière
équivalente en Python True (vrai) ou False (faux).
L’opération commune pour créer ce genre de variable est un test :
   >>> a = 3
   >>> b = 4
   >>> print(a == 4)
   False

En revanche noter que :
   >>> petit_nb = 0.1 + 0.2 - 0.3
   >>> mon_test = petit_nb == 0
   >>> print(mon_test)
   False

(3) le nom est associé à George Boole (1815-1864)
                                                                    48 / 79
Test flottants

Le test qu’on attendrait plutôt, peut être fait avec la librairie
math :
  >>> import math
  >>> print(petit_nb)
  5.551115123125783e-17
  >>> print(math.isclose(0., petit_nb, abs_tol=1e-5))
  True
  >>> print(math.isclose(0., petit_nb, abs_tol=1e-17))
  False

Ici on peut tester la précision que l’on désire pour savoir si deux
nombres sont “proches” ou non

                                                                      49 / 79
Opérations sur les booléens

Comme en logique on a les opérations
  § “ou” (   : or), commande or
  § “et” (    : and), commande and
  § “non” (     : not), commande not
  § “ou exclusif” (     : xor), commande !=

                                              50 / 79
Tables logiques : and

   Expression      Résultat
 True and True      True
 True and False     False
 False and True     False
 False and False    False
Table – Table logique de and

                               51 / 79
Tables logiques : or

  Expression      Résultat
 True or True      True
 True or False     True
 False or True     True
 False or False    False
Table – Table logique de or

                              52 / 79
Tables logiques : not

   Expression   Résultat
     True        False
     False       True
Table – Table logique de not

                               53 / 79
Tables logiques : !=

  Expression      Résultat
 True != True      False
 True != False     True
 False != True     True
 False != False    False
Table – Table logique de xor

                               54 / 79
Listes

Les listes (   : list) peuvent être créées en écrivant une suite de
valeurs séparées par des virgules, le tout entre crochet
  >>> ma_liste = ["bras", "jambes", 10, 12]
  >>> ma_liste
  ['bras', 'jambes', 10, 12]

Rem: les items d’une liste peuvent être de types différents

Comme les chaînes de caractères :
  § le premier item d’une liste est à l’indice 0
  § les listes supportent le slicing
  § les listes supportent la concaténation

                                                                      55 / 79
Listes (suite)

>>> a[0:2] = [] # Enlève quelques items
>>> a
[10, 12]
>>> a[1:1] = ['main', 'coude'] # Insertion
[10, 'main', 'coude', 12]
>>> a[:] = [] # Vider la liste
>>> a, len(a), type(a)
([], 0, list)

                                             56 / 79
Dictionnaire
Notion de clef / valeur : le dictionnaire est une structure dont les
indices (clefs) peuvent avoir un sens (valeur) et fonctionne par
paires :
  >>> dico = {}
  >>> dico['car'] = 'voiture'
  >>> dico['plane'] ='avion'
  >>> dico['bus'] ='bus'
  >>> print(dico)
  {'car': 'voiture', 'plane': 'avion', 'bus': 'bus'}

Notions de clef (    : key) / valeur (    : value) :
  >>> print dico.keys()
  >>> print dico.values()

                                                                       57 / 79
Dictionnaire / flexibilité

Un dictionnaire peut mélanger plusieurs types de valeur :

  >>> dico_3 = {'nom': {'first': 'Alexandre', 'last': 'PetitChateau'},
  ...           'emploi': ['enseignant', 'chercheur'],
  ...           'age': 36}

                                                                         58 / 79
Opérations sur les dictionnaires

Effacer un couple clef / valeur :
  >>> del(dico['bus'])
  >>> dico
  {'car': 'voiture', 'plane': 'avion'}

Pour aller plus loin :   https://fr.wikibooks.org/wiki/Programmation_Python/Listes

                                                                                     59 / 79
Limite des dictionnaires

Attention : les opérations comme la concaténation et l’extraction
n’ont pas de sens pour un dictionnaire :
  >>> print(dico[1:2])
  TypeError: unhashable type: 'slice'
  >>> print(dico + dico)
  unsupported operand type(s) for +: 'dict' and 'dict'

                                                                    60 / 79
Autres types non décrits dans le cours

   § tuple, sorte de liste immuable
   § set (    : ensemble), notamment pour avoir les opérations de
     la théorie des ensembles
Pour plus de détails sur les types, voir par exemple :
https://github.com/sergulaydore/EE551A_Fall_2018/blob/master/lectures/lecture3/Lecture3.ipynb

                                                                                                61 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python

Conditions et boucles
   if then else et autres tests
   Boucle for
   Boucle while

Fonctions en Python

                                              62 / 79
Instruction “if ... then ... else ...”

Instruction “if ... then ... else ...” : permet de créer des tests pour
en fonction de la valeur d’un booléen (une instruction) est vraie ou
fausse.

Exemple: tester si un nombre est pair
  >>> nb_a = 14
  >>> if nb_a%2==0:
  >>>    print("nb_a est pair")
  >>> else:
  >>>    print("nb_a est impair")
  nb_a est pair

                                                                          63 / 79
Instruction “if ... elif ... else ...”
Pour des tests impliquant plus de deux cas possibles, la syntaxe
nécessite d’utiliser elif
Exemple: c’est le cas si l’on cherche à tester le reste d’un nombre
modulo 3
  nb_a = 11
  if nb_a % 3 == 0:
      print("nb_a est      congru à 0 modulo 3")
  elif nb_a % 3 == 1:
      print("nb_a est      congru à 1 modulo 3")
  else:
      print("nb_a est      congru à 2 modulo 3")
  nb_a est congru à 2      modulo 3

Attention : ici les “...” sont juste une convention pour dire qu’on a
continué l’instruction à la ligne

                                                                        64 / 79
Boucle for : premiers pas

Boucle for (       : pour) : permet d’itérer des opérations sur un
objet dont la taille est prédéfinie
Exemple: pour afficher (avec 3 chiffres après la virgule) la racine
des nombres de 0 à 10 il suffit d’écrire
  >>> for i in range(4):
  ....   print("La racine de {:d} est {:.3f}".
               format(i, i**0.5))
  Racine de 0: 0.000
  Racine de 1: 1.000
  Racine de 2: 1.414
  Racine de 3: 1.732

                                                                      65 / 79
Commande enumerate
Commande utile en Python : enumerate, permet d’obtenir les
éléments d’une liste et leurs indices pour itérer sur eux

Exemple: supposons que l’on ait créé la liste des carrées de 1 à 10
  >>> liste_carres =[] # init: liste vide
  ... for i in range(4):
  ...    liste_carres.append(i**2)

Maintenant pour itérer sur cette liste et par exemple trouver la
racine des nombres de cette liste on écrit
  >>> for i, carre in enumerate(liste_carres):
  ...    print(int(carre**0.5))
  0.0
  1.0
  2.0
  3.0

                                                                      66 / 79
Compréhensions et boucle for

Python inclus une opération avancée connue sous le nom de
compréhension de liste (en anglais : list comprehension)

  >>> a = [1,4,2,7,1,9,0,3,4,6,6,6,8,3]
  >>> [x for x in a if x > 5]
  [7, 9, 6, 6, 6, 8]

Un second exemple :
  >>>print([c * 2 for c in 'ohé'])
  ['oo', 'hh', 'éé']

                                                            67 / 79
Boucle while
while (en français : “tant que”) permet d’itérer des opérations
tant qu’une condition n’est pas satisfaite
  >>> i = 0
  ... print("Nb x t.q. 2^x < 10:")
  ... while (2**i < 10):
  ...     print("{0}".format(i))
  ...     i += 1 # incrémente le compteur
  ... 1+2
  Nb x t.q. 2^x < 10:
  0
  1
  2
  3

En effet 16 “ 24 ą 10 mais 8 “ 23 ă 10

Attention : on peut créer des boucles sans fin, si le critère d’arrêt
n’est jamais vérifié
                                                                        68 / 79
Sommaire

Conseils numériques : pour le cours et delà

Introduction et motivation

Écosystème Python : les librairies

Formats et commandes usuelles en Python

Conditions et boucles

Fonctions en Python

                                              69 / 79
Premiers éléments
Définition d’une fonction en Python :
  § utiliser le mot clé def
  § faire suivre du nom de la fonction
  § puis de la signature entre parenthèses ()
  § terminer la ligne par un symbole “ :” ligne.
  § ensuite il faut indenter de quatre espaces à partir de la
    seconde ligne

  >>> def fonction1():
  ...   print("mon test")

Pour la lancer il suffit alors de taper la commande suivante
  >>> fonction1()
  mon test

                                                                70 / 79
Aide (         : docstring)

Aide d’une fonction : primordiale !

Rappel : sklearn dispose par exemple de plus de 1000 pages de
documentation / aide.

Motivations multiples :
 § permet d’accélérer l’écriture sur un gros projet
 § facilite l’échange en travail en groupe
  § facilite l’échange avec soi-même dans le futur

Rem: test unitaire (autre pratique utile) : créer un test de la
fonction, potentiellement avant même de terminer son écriture.Voir
par exemple pytest et https://docs.pytest.org/en/latest/
pour automatiser cette pratique

                                                                     71 / 79
Création / visualisation
Création de la documentation : commencer la fonction par des
commentaires entre """ et """
  >>>   def fonction2(s):
  ...   """
  ...   Affichage d'une chaîne et de sa longueur
  ...   """
  ...   print("{} est de longueur: ".format(s) + str(len(s)))

Vérifier la fonction
  >>> fonction2("Cette chaîne de test")
  Cette chaîne de test est de longueur : 20

Afficher l’aide avec la commande help ou la commande ?
  >>> fonction2?

                                                                72 / 79
Usage de help / ?

Affichage de l’aide : diffère selon l’environnement (IPyhton,
notebook, etc.) mais syntaxe identique

  >>> fonction2?
  Signature: fonction2(s)
  Docstring: Affichage d'une chaîne et de sa longueur
  ...

Fonctionne pour toutes les fonctions standard de Python, e.g.,
  >>> print?

                                                                 73 / 79
Sortie de fonctions

Définition d’une sortie de fonction : mot clef return :
  >>> def square(x):
  ...     """
  ...     Retourne le carré de x.
  ...     """
  ...     return x ** 2

Vérification de la fonction : sur des int ou des float (type
d’entrée/sortie non précisé : polymorphisme) :
  >>> square(3), square(0.4)
  (9, 0.16000000000000003)

                                                               74 / 79
Sortie multiples
Il est aussi possible de retourner plusieurs valeurs :
  >>> def powers(x):
  ...     """
  ...     Retourne les premières puissances de x.
  ...     """
  ...     return x ** 2, x ** 3, x ** 4

L’appel de la fonction renvoie un triplet :
  >>> out = powers(3)
  >>> print(out)
  >>> print(type(out))
  >>> x2, x3, x4 = powers(3)
  >>> print(x2, x3)
  (9, 27, 81)
  
  9 27
                                                         75 / 79
Arguments optionnels

Arguments optionnels : s’ils ne sont pas donnés en appel de la
fonction ils prennent la valeur donnée par défaut

  >>> def ma_puissance(x, exposant=3, verbose=True):
  ...     """
  ...     Fonction calculant une puissance
  ...
  ...     Parameters
  ...     ----------
  ...     x : float,
  ...       Valeur du nombre dont on calcule la puissance
  ...
  ...     exposant : float, default 3
  ...       Paramètre de l'exposant choisi
  ...
  ...     verbose : bool, default False
  ...       Paremètre d'affichage
  ...
  ...     Returns:
  ...     -------
  ...     Retourne x élevé à la puissance exposant (default=3)
          """
  ...     if verbose is True:
  ...          print('version verbeuse')
  ...     return x ** exposant

                                                                 76 / 79
Arguments optionnels (suite)

Arguments optionnels : appel possible avec ou sans eux

  >>> ma_puissance(5)
  version verbeuse
  125
  >>> ma_puissance(5, verbose=False, exposant=2)
  25

Rem: ordre de saisie des paramètres sans importance en Python
(Attention : faux pour les autres arguments)

                                                                77 / 79
Bibliographie I
§   Boswell, D. et T. Foucher. The Art of Readable Code.
      O’Reilly Media, 2011.
§   Courant, J. et al. Informatique pour tous en classes
      préparatoires aux grandes écoles : Manuel d’algorithmique et
      programmation structurée avec Python. Eyrolles, 2013.
§   Foata, D. et A. Fuchs. Calcul des probabilités : cours et
      exercices corrigés. Masson, 1996.
§   Golub, G. H. et C. F. van Loan. Matrix computations. Fourth.
      Johns Hopkins University Press, Baltimore, MD, 2013,
      p. xiv+756.
§   Guttag, J. V. Introduction to Computation and Programming
      Using Python : With Application to Understanding Data. MIT
      Press, 2016.
§   Horn, R. A. et C. R. Johnson. Topics in matrix analysis.
      Corrected reprint of the 1991 original. Cambridge : Cambridge
      University Press, 1994, p. viii+607.
                                                                      78 / 79
Bibliographie II

§   Skiena, S. S. The algorithm design manual. T. 1. Springer
      Science & Business Media, 1998.
§   VanderPlas, J. Python Data Science Handbook. O’Reilly
      Media, 2016.

                                                                79 / 79
Vous pouvez aussi lire