... | ... | @@ -4,9 +4,8 @@ Normalement, on commence par les bases et on évoque ensuite des propriétés pl |
|
|
|
|
|
:books: Pour commencer, vous pouvez tester le [tuto officiel :three:.:one: :zero:](https://docs.python.org/3.10/tutorial/index.html) ou trouver un cours en ligne qui vous correspondra ; vous pouvez consulter [ma sélection](Tutographie).
|
|
|
|
|
|
:bulb: Pour mieux comprendre, n'hésitez pas à exécuter des petits bouts de code sur le site : :bulb: [PYTHON TUTOR](http://pythontutor.com) :bulb:
|
|
|
|
|
|
PYTHON TUTOR est un outil pédagogique, qui exécute du code en ligne, pas à pas, en représentant graphiquement tous les **objets** créés (chiffres, chaînes de caractères et conteneurs (listes, tuples...) contenant les objets élémentaires), et ceci dans leurs espaces de nommage respectifs, avec les liens avec les noms de variables.
|
|
|
:bulb: PYTHON TUTOR est votre allié ! :bulb:
|
|
|
:bulb: n'hésitez pas à tester des bouts de code sur le site [PYTHON TUTOR](http://pythontutor.com) ! C'est est un outil pédagogique, qui exécute du code en ligne, pas à pas, en représentant graphiquement tous les **objets** créés (chiffres, chaînes de caractères et conteneurs (listes, tuples...) ), et ceci dans leurs espaces de nommage respectifs, avec les liens avec les noms de variables.
|
|
|
Cela vous permettra en particulier de voir comment la modification d'une variable impacte (ou pas) certaines autres.
|
|
|
Il est limité par le nombre d'instructions, et ne permet pas l'import de modules (en particulier, pas de matplotlib...)
|
|
|
|
... | ... | @@ -79,21 +78,21 @@ print("fini") # l'indentation a cessé, on a quitté le bloc |
|
|
print (ma_liste)
|
|
|
```
|
|
|
Le programme se déroule comme suit :
|
|
|
1
|
|
|
après modification 3
|
|
|
2
|
|
|
après modification 4
|
|
|
5
|
|
|
après modification 7
|
|
|
10
|
|
|
après modification 12
|
|
|
50
|
|
|
après modification 52
|
|
|
<kbd>1</kbd>
|
|
|
<kbd>après modification 3</kbd>
|
|
|
<kbd>2</kbd>
|
|
|
<kbd>après modification 4</kbd>
|
|
|
<kbd>5</kbd>
|
|
|
<kbd>après modification 7</kbd>
|
|
|
<kbd>10</kbd>
|
|
|
<kbd>après modification 12</kbd>
|
|
|
<kbd>50</kbd>
|
|
|
<kbd>après modification 52</kbd>
|
|
|
|
|
|
Et pourtant, à la fin print(ma_liste) montre que la liste est inchangée !
|
|
|
La ligne " element = element + 2" a bien modifié l'élément extrait de la liste, mais n'a pas modifié la liste...)
|
|
|
La ligne `"element = element + 2` a bien modifié l'élément **extrait de la liste**, mais n'a pas modifié l'objet **dans** liste...
|
|
|
|
|
|
On peut vérifier sur [cette capture d'écran Python Tutor](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/python_tutor_modif_elements_liste.png) que au cours de la 2e itération la variable element qui valait 2 (2e élément de la liste) est bien passée de 2 à 4, mais que cela n'a pas du tout modifié la liste originale.
|
|
|
On peut vérifier sur [cette capture d'écran Python Tutor](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/python_tutor_modif_elements_liste.png) que au cours de la 2e itération la variable `element` qui valait 2 (2e élément de la liste) est bien passée de 2 à 4, mais que cela n'a pas du tout modifié la liste originale.
|
|
|
|
|
|
Une manière de transformer la liste en ajoutant deux consiste à recréer une liste :
|
|
|
```python
|
... | ... | @@ -119,17 +118,16 @@ ma_liste = [1, 2, 5, 10, 50] # une liste d'entiers |
|
|
for rang, element in enumerate(ma_liste):
|
|
|
print("L'élement de rang ",rang, " est :", element)
|
|
|
```
|
|
|
L'élement de rang 0 est : 1
|
|
|
L'élement de rang 1 est : 2
|
|
|
L'élement de rang 2 est : 5
|
|
|
L'élement de rang 3 est : 10
|
|
|
L'élement de rang 4 est : 50
|
|
|
<kbd>L'élement de rang 0 est : 1</kbd>
|
|
|
<kbd>L'élement de rang 1 est : 2</kbd>
|
|
|
<kbd>L'élement de rang 2 est : 5</kbd>
|
|
|
<kbd>L'élement de rang 3 est : 10</kbd>
|
|
|
<kbd>L'élement de rang 4 est : 50</kbd>
|
|
|
|
|
|
Hé oui, les indices commencent à zéro !
|
|
|
|
|
|
Parcourons maintenant deux listes en parallèle, en prenant à chaque itération un élément de même rang, comme une fermeture éclair parcourt deux bords crantés : *zip*
|
|
|
|
|
|
|
|
|
```python
|
|
|
ma_liste_numeros = [1, 2, 5, 10, 50] # une liste d'entiers
|
|
|
ma_liste_mots = [ "un", "deux", "cinq", "dix", "cinquante" ]
|
... | ... | @@ -137,11 +135,11 @@ for numero, mot in zip(ma_liste_numeros, ma_liste_mots): |
|
|
print("Le numéro ",numero, " s'écrit :", mot)
|
|
|
```
|
|
|
|
|
|
Le numéro 1 s'écrit : un
|
|
|
Le numéro 2 s'écrit : deux
|
|
|
Le numéro 5 s'écrit : cinq
|
|
|
Le numéro 10 s'écrit : dix
|
|
|
Le numéro 50 s'écrit : cinquante
|
|
|
<kbd>Le numéro 1 s'écrit : un</kbd>
|
|
|
<kbd>Le numéro 2 s'écrit : deux</kbd>
|
|
|
<kbd>Le numéro 5 s'écrit : cinq</kbd>
|
|
|
<kbd>Le numéro 10 s'écrit : dix</kbd>
|
|
|
<kbd>Le numéro 50 s'écrit : cinquante</kbd>
|
|
|
|
|
|
### A3) Les fonctions
|
|
|
La fonction est un objet comme les autres (ou presque) !
|
... | ... | @@ -198,9 +196,9 @@ On peut remplacer **self** par **this**, comme en java ; ce n'est pas du tout re |
|
|
return aplusb
|
|
|
```
|
|
|
|
|
|
machin = MonObjet(4,5,6)
|
|
|
`machin = MonObjet(4,5,6)`
|
|
|
|
|
|
bidule = machin.ma_methode(1,2)
|
|
|
`bidule = machin.ma_methode(1,2)`
|
|
|
|
|
|
Un point de vocabulaire : **paramètres** et **arguments**
|
|
|
En Python vous trouverez ces deux termes. Pour la documentation des fonctions (les "docstrings"), qui est une bonne pratique [recommandée dans les PEPs](https://peps.python.org/pep-0257/), sphinx "paramètres" de les définir comme `:param nom_variable: ` ([Sphinx](https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html) ) tandis que le format Google utilise Argas... Attributes:
|
... | ... | @@ -341,33 +339,32 @@ print(ma_liste_mots) # la liste n'a pas été modifiée |
|
|
|
|
|
```
|
|
|
Le code ci-dessus affiche :
|
|
|
bonjour
|
|
|
Nous sommes dans la fonction, on a passé en argument bonjour
|
|
|
dzień dobry
|
|
|
teraz mówimy po polsku
|
|
|
Chopin
|
|
|
Le numéro 1 s'écrit : jeden
|
|
|
Le numéro 2 s'écrit : dwa
|
|
|
Le numéro 5 s'écrit : pięć
|
|
|
Le numéro 10 s'écrit : dziesięć
|
|
|
Le numéro 50 s'écrit : pięćdziesiąt
|
|
|
Le numéro 100 s'écrit : sto
|
|
|
None
|
|
|
Nous sommes sortis de la fonction, on a passé en argument bonjour
|
|
|
ici on parle français
|
|
|
[1, 2, 5, 10, 50, 100]
|
|
|
['un', 'deux', 'cinq', 'dix', 'cinquante']
|
|
|
|
|
|
|
|
|
Sur la [Copie d'écran de Python tutor, code en cours d'exécution à pas à pas](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/python_tutor_chiffres_en_polonais.png), on remarque qu'il y a en mémoire 2 versions différentes de ma_liste_mots, dont une dans l'espace de nommage de la fonction, qui a été créée par l'instruction ma_liste_mots=[ ...]. La liste ma_liste_numeros n'existe en revanche qu'en un seul exemplaire.
|
|
|
<kbd>bonjour</kbd>
|
|
|
<kbd>Nous sommes dans la fonction, on a passé en argument bonjour</kbd>
|
|
|
<kbd>dzień dobry</kbd>
|
|
|
<kbd>teraz mówimy po polsku</kbd>
|
|
|
<kbd>Chopin</kbd>
|
|
|
<kbd>Le numéro 1 s'écrit : jeden</kbd>
|
|
|
<kbd>Le numéro 2 s'écrit : dwa</kbd>
|
|
|
<kbd>Le numéro 5 s'écrit : pięć</kbd>
|
|
|
<kbd>Le numéro 10 s'écrit : dziesięć</kbd>
|
|
|
<kbd>Le numéro 50 s'écrit : pięćdziesiąt</kbd>
|
|
|
<kbd>Le numéro 100 s'écrit : sto</kbd>
|
|
|
<kbd>None</kbd>
|
|
|
<kbd>Nous sommes sortis de la fonction, on a passé en argument bonjour</kbd>
|
|
|
<kbd>ici on parle français</kbd>
|
|
|
<kbd>[1, 2, 5, 10, 50, 100]</kbd>
|
|
|
<kbd>['un', 'deux', 'cinq', 'dix', 'cinquante']</kbd>
|
|
|
|
|
|
Sur la [Copie d'écran de Python tutor, code en cours d'exécution à pas à pas](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/python_tutor_chiffres_en_polonais.png), on remarque qu'il y a en mémoire 2 versions différentes de `ma_liste_mots`, dont une dans l'espace de nommage de la fonction, qui a été créée par l'instruction ma_liste_mots=[ ...]. La liste `ma_liste_numeros` n'existe en revanche qu'en un seul exemplaire.
|
|
|
|
|
|
|
|
|
d) *une méthode modifie l’objet en place ou en renvoie un nouveau* selon le cas…
|
|
|
Bien vérifier dans la doc comment se comporte la méthode que l’on utilise ! ! !
|
|
|
Selon les cas, une *méthode* peut :
|
|
|
* modifier un objet (exemple *append*) ; en général elles retournent « None »
|
|
|
* modifier un objet (exemple *append*) ; en général elles retournent « `None` »
|
|
|
* retourner un nouvel objet sans modifier le premier
|
|
|
* laisser le choix (argument *inplace*=True ou =False) :
|
|
|
* laisser le choix (argument *inplace*=`True` ou =`False`) :
|
|
|
|
|
|
Exemples courants pour comprendre
|
|
|
méthode *sort* _vs_ fonction *sorted*
|
... | ... | @@ -436,10 +433,10 @@ Ce qui va donner à l'appel de fonction suivant : |
|
|
```python
|
|
|
affichage_hybride("param1", "param2", "infini1", "infini2", kwinfini1=1, kwinfini2=2)
|
|
|
```
|
|
|
param1
|
|
|
param2
|
|
|
('infini1', 'infini2')
|
|
|
{'kwinfini1': 1, 'kwinfini2': 2}
|
|
|
<kbd>param1 </kbd>
|
|
|
<kbd>param2 </kbd>
|
|
|
<kbd>('infini1', 'infini2') </kbd>
|
|
|
<kbd>{'kwinfini1': 1, 'kwinfini2': 2} </kbd>
|
|
|
|
|
|
On va expliquer tout ça dans la suite, et vous pouvez également regarder les 2 tutos mis en ref ci-dessus. Et surtout, MANIPULEZ
|
|
|
|
... | ... | @@ -477,9 +474,9 @@ print (ma_fonction(2,5)) # je n'ai pas précisé nb_decimales donc nb_decimales |
|
|
print (ma_fonction(2,5, nb_decimales=5 )) # je précise nb_decimales
|
|
|
print (ma_fonction(b=5,a=2, nb_decimales=5 )) # si je précise les noms, je peux intervertir les arguments "de position"
|
|
|
```
|
|
|
2 divisé par 5 = 0.40
|
|
|
2 divisé par 5 = 0.40000
|
|
|
2 divisé par 5 = 0.40000
|
|
|
<kbd>2 divisé par 5 = 0.40</kbd>
|
|
|
<kbd>2 divisé par 5 = 0.40000</kbd>
|
|
|
<kbd>2 divisé par 5 = 0.40000</kbd>
|
|
|
|
|
|
**nombre indéfini d'arguments *args avec le _splat_ (*)**
|
|
|
|
... | ... | |