Introduction Python
===================

.. image:: img/Python_logo.svg
  :width: 18%
  :align: center

Python est un langage de programmation multi-paradigme libre (régit par la *Python Software Foundation License*, équivalent à
BSD) créé en 1990 par Guido van Rossum, et géré depuis 2001 par la `Python Software Foundation`_.

Python est un langage orienté objet de haut niveau (la syntaxe est séparée des mécanismes de bas-niveau)
assez proche de Java, mais souvent considéré comme plus simple et moins ”verbeux”
(le code python est parfois très proche du pseudo-code).

Le langage connaît un fort succès depuis plusieurs années [#f1]_ aussi bien
pour le développement web (scripts CGI, Django, frameworks asynchrones, etc.)
que pour le traitement et l'analyse de données (packages Numpy_, Pandas_, Scipy_, scikit-learn_, etc.).

Comme il s'agit d'un language interprété, c'est un candidat de choix comme langage
de script au sein d'applications lourdes (et généralement développées dans un
langage de plus bas niveau).
On le retrouve ainsi dans des logiciels de modélisation 3d (*Autodesk Maya*, *Blender*),
de retouche d'image vectorielle (*Inkscape*) ou de SIG (*ArcGIS*, *QGIS*).

Python possède une grande bibliothèque standard et, en raison de son succès, il existe de
très nombreuses bibliothèques, développées par la communauté et spécialisées
pour un grand nombre de domaines, permettant aux développeurs de créer des outils rapidement
et simplement en utilisant la robustesse de fonctionnalités validées par une large
base d'utilisateurs.

Comme tout langage, Python possède quelques spécificités qu’il est utile de connaître avant de
commencer.

Language orienté objet
^^^^^^^^^^^^^^^^^^^^^^

Python est orienté-objet. Il supporte **l'héritage multiple** et la **surcharge des opérateurs**.
En Python toutes les données manipulées (y compris les types primitifs tels que les nombres et les chaînes de caractères) sont des objets : entier, flottant, liste, dictionnaire, etc. sont tous des objets.

Les objets de même nature ont le même type.

Ces objets contiennent notamment : des propriétés et des méthodes (qu'on va parfois retrouver sous le terme d'attributs).
Les propriétés permettent de stocker la valeur de l’objet et les méthodes représentent les fonctions permettant de manipuler la valeur de l’objet.


Typage dynamique fort
^^^^^^^^^^^^^^^^^^^^^

Le typage d'une variable consiste à associer un type à une variable.
Lorsque le typage est dit *statique* c'est à l'utilisateur de préciser le type
de la variable dans le code source de manière explicite. C'est par exemple le cas
du C ou du Java dans lesquels on peut retrouver des instructions de ce type :
::

  int ma_valeur = 12;

Par opposition, Python présente la particularité d'offrir un typage dynamique :
lorsqu'une variable est affectée, l'interpréteur trouvera automatiquement son
type sans que l'utilisateur ait besoin de le préciser :
::

  ma_valeur = 12
  mon_texte = "Une chaine de caractères"


Cela ne signifie pas que les variables n'ont pas de type, ni qu'il est possible
d'effectuer des opérations sans prendre en compte le type des variables qui sont
manipulées.

Sans rentrer dans les détails on gardera également en tête que Python est un langague fortement
typé : le langage garantit que le type des données employé décrit correctement les données en question.

| En effet les deux principales caractéristiques d'un typage fort sont :
| - la détection des erreurs de typage à la l'exécution (ou à la compilation),
| - l'interdiction des conversions implicites de types.


Langage interprété
^^^^^^^^^^^^^^^^^^

Python est dynamique : l'interpréteur peut évaluer des chaînes de caractères
représentant des expressions ou des instructions Python.
Il s'agit d'un langage *interprété* (comme le Java ou le Perl)
à l'inverse de langages comme le C, le C++ ou le Pascal qui sont *compilés*.

Les langages compilés vont nécessiter de transformer le code source en code binaire
(langage machine) lors d'une opération appelée la *compilation*.
Cette opération produit un fichier exécutable dépendant du système d'exploitation
et est à effectuer à chaque modification du code source.

Dans le cas d'un langage interprété (l'expression "langage de script" est synonyme),
les instructions (le code source) sont "transcrites"
par un *interpréteur* en langage machine au fur et à mesure de leur lecture.
L'exécution d'un script écrit en Python est donc conditionnée par la présence
de l'interpréteur Python (comme le serait du code Java avec la JVM par exemple).

Bloc d'instructions et indentation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

En programmation il est courant de faire des choix (*structures conditionnelles*),
de répéter des opérations (*boucles*) ou de définir de nouveaux objets.
Les instructions propres à ces cas sont appelées **bloc d'instructions**.

En python les blocs d'instructions sont toujours associés à
une **ligne d'en-tête contenant une instruction spécifique** (``if``, ``elif``, ``else``, ``while``, ``def``, ``class``, ...) **se terminant par un double point**.

**Les blocs sont délimités par l'indentation : toutes les lignes d'un même bloc doivent être indentées exactement de la même manière (c'est-à-dire décalées vers la droite d'un même nombre d'espaces).**
Le nombre d'espaces à utiliser sans importance, mais la plupart des programmeurs
utilisent des multiples de 4 et la lecture du code est plus agréable si ce nombre
ne varie pas au sein d'un même programme ou d'une même base de code.



.. rubric:: Footnotes

.. [#f1] https://stackoverflow.blog/2017/09/06/incredible-growth-python/



.. _`Python Software Foundation`: https://www.python.org/psf/
.. _Numpy: https://www.numpy.org/
.. _Pandas: https://pandas.pydata.org/
.. _Scipy: https://www.scipy.org/
.. _scikit-learn: https://scikit-learn.org/