Move 10-syntax to jour-1

This commit is contained in:
Julien Palard 2020-01-13 18:27:55 +01:00
parent 127f324e20
commit c748f87932
3 changed files with 363 additions and 357 deletions

View File

@ -1,65 +0,0 @@
# Les instructions
----
## if
```python
>>> if 1 in {2, 3, 5, 7, 11}:
... print("1 serait-il premier ?")
...
>>>
```
Notes:
Parler de l'indentation !
Notez le `...`, on a du appyer un coup en « entrée » pour fermer ce bloc.
1 était premier, avant, mais ça casse le théorème « Every possible
whole number can be written as a _unique_ product of primes ».
----
## for
```python
>>> d = {"zero": 0, "un": 1, "deux": 2}
>>> for number in d:
... print(number)
...
zero
un
deux
>>>
```
----
## for
```python
>>> d = {"zero": 0, "un": 1, "deux": 2}
>>> for number, value in d.items():
... print(number, value)
...
zero 0
un 1
deux 2
>>>
```
---
## for
```python
>>> for i in range(5):
... print(i)
0
1
2
3
4
```

View File

@ -1,292 +0,0 @@
# Les instructions (suite)
Notes:
On couvre un peu plus de syntaxe après quelques exercices.
----
## L'instruction `while`
Très rarement utilisée car le `for` est bien plus pratique, sert
cependant dans quelques cas:
- `while True:`
- `while il_reste_du_travail_à_faire:`
----
## L'instruction `while`
```python
>>> sq = 5
>>> gues = 2
>>> error = abs(sq - gues * gues)
>>> while error > 0.0001:
... gues = (gues + sq / gues) / 2
... error = abs(sq - gues * gues)
>>> gues
2.2360679779158037
```
Notes:
Je sais pour la faute de frappe sur guess, mais sinon ça dépasse.
Méthode_de_Héron.
----
## `break` et `continue`
Break sert à interrompre une boucle, continue sert à passer à l'élément
suivant. Qu'on soit dans un `for` ou dans un `while`.
----
## `break`
```python
>>> sq, gues = 5, 2
>>> while True:
... gues = (gues + sq / gues) / 2
... error = abs(sq - gues * gues)
... if error < 0.0001:
... break
>>> gues
2.2360679779158037
```
----
## `continue`
```python
>>> for i in range(5):
... if i == 0:
... continue
... print(i)
1
2
3
4
```
----
## Le `else`
Après un bloc `if`, on peut ajouter un bloc `else` :
```python
def fib(x):
if x < 2:
return 1
else:
return fib(x - 1) + fib(x - 2)
```
Notes:
(Juste pour doctest :)
```python
>>> [fib(x) for x in range(10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
----
## Le `elif`
Après un `if`, on peut ajouter un ou des bloc `elif` :
```python
def is_prime(n):
if n == 2:
return True
elif n == 1 or n % 2 == 0:
return False
else:
...
```
Notes: Parler de `pass` et de `...`.
----
## Les exceptions
```python
>>> int("abc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
```
----
## Les exceptions : `try`
```python
>>> try:
... int("abc")
... except ValueError:
... print("Raté")
Raté
```
---
## La notation par intension
C'est transformer ça :
```python
>>> accumulator = []
>>> for i in range(10):
... accumulator.append(2 ** i)
>>> accumulator
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
```
----
## La notation par intension
en :
```python
>>> [2 ** i for i in range(10)]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
```
----
## La notation par intension
Ou :
```python
def phi(n):
numbers = []
for i in range(n):
if math.gcd(i, n) == 1:
numbers.append(i)
return len(numbers)
```
----
## La notation par intension
en :
```python
def phi(n):
return len(
[
i
for i in range(n)
if math.gcd(i, n) == i
]
)
```
Notes: Elle devrait s'écrire sur une seule ligne, mais, vidéoprojecteur...
---
# Les variables (suite)
----
## Le type des variables
En Python, les variables ne sont que des noms.
*Des « étiquettes » qu'on colle aux objets.*
Seul les valeurs sont typées.
*Toutes les valeurs sont des objets.*
Notes: Sans. Exceptions.
On peut « coller » plusieurs étiquettes à une même valeur.
C'est pour ça que pour `n = 10` on dit "n est assigné à 10", et non "10 est mis dans n".
----
## La portée des variables
Dans une fonction :
- Si on ne fait qu'accéder, ce sera une globale.
- Si on affecte, c'est une locale.
Notes:
Pour l'accès pensez à `print` par exemple, l'utiliser n'en fait pas une locale.
Une variable ne peut *presque* jamais ne pas contenir de valeur, et on ne peut pas la "déclarer".
----
## Immuables vs modifiables
Certains types sont modifiables, d'autres, non.
Notes: On dit qu'elles sont immuables (*immutable* en anglais).
Attention, les variables sont toujours ... variables, nous n'avons pas
de constantes.
----
## Les types modifiables
Parmis les types modifiables on trouve :
Les listes, les dictionnaires, les ensembles, …
*On peut ajouter a une liste, modifier la valeur pour une clé d'un
dictionnaire, ou vider un ensemble par exemple.*
----
## les types immuables
Parmis les types immuables on trouve :
Les chaînes de caractères, les *n*-uplets, les entiers, les booléens, …
*On ne peut pas dire que maintenant 10 vaut 12, ni que faux est vrai.*
Notes:
Pour les chaînes c'est discutable, mais avoir des chaînes immuables
est confortable (clef de dictionnaires par exemple, ou la garantie
qu'un appel à une fonction avec une chaîne en paramètre ne va pas la
modifier).
----
## La vérité
En Python, ce qui est vide est faux, 0 est faux. Le reste est vrai :
```python
>>> bool("Non vide")
True
>>> bool([]) # Une liste vide
False
>>> bool(0.0)
False
```
Notes:
Attention à la sémantique : `if foo` est différent de `if foo is True`.
Leur rappeler que c'est pylint qui leur dira quand utiliser `is`, leur
dire quand même : pour `True`, `False`, et `None`.

363
jour-1.md
View File

@ -714,3 +714,366 @@ chaîne, help n'affichera pas la documentation des chaînes.
Appeler `exit()` quitte simplement le REPL.
Notes: Préferer `sys.exit()` dans un programme.
---
# Les instructions
----
## if
```python
>>> if 1 in {2, 3, 5, 7, 11}:
... print("1 serait-il premier ?")
...
>>>
```
Notes:
Parler de l'indentation !
Notez le `...`, on a du appyer un coup en « entrée » pour fermer ce bloc.
1 était premier, avant, mais ça casse le théorème « Every possible
whole number can be written as a _unique_ product of primes ».
----
## for
```python
>>> d = {"zero": 0, "un": 1, "deux": 2}
>>> for number in d:
... print(number)
...
zero
un
deux
>>>
```
----
## for
```python
>>> d = {"zero": 0, "un": 1, "deux": 2}
>>> for number, value in d.items():
... print(number, value)
...
zero 0
un 1
deux 2
>>>
```
---
## for
```python
>>> for i in range(5):
... print(i)
0
1
2
3
4
```
---
# Les instructions (suite)
Notes:
On couvre un peu plus de syntaxe après quelques exercices.
----
## L'instruction `while`
Très rarement utilisée car le `for` est bien plus pratique, sert
cependant dans quelques cas:
- `while True:`
- `while il_reste_du_travail_à_faire:`
----
## L'instruction `while`
```python
>>> sq = 5
>>> gues = 2
>>> error = abs(sq - gues * gues)
>>> while error > 0.0001:
... gues = (gues + sq / gues) / 2
... error = abs(sq - gues * gues)
>>> gues
2.2360679779158037
```
Notes:
Je sais pour la faute de frappe sur guess, mais sinon ça dépasse.
Méthode_de_Héron.
----
## `break` et `continue`
Break sert à interrompre une boucle, continue sert à passer à l'élément
suivant. Qu'on soit dans un `for` ou dans un `while`.
----
## `break`
```python
>>> sq, gues = 5, 2
>>> while True:
... gues = (gues + sq / gues) / 2
... error = abs(sq - gues * gues)
... if error < 0.0001:
... break
>>> gues
2.2360679779158037
```
----
## `continue`
```python
>>> for i in range(5):
... if i == 0:
... continue
... print(i)
1
2
3
4
```
----
## Le `else`
Après un bloc `if`, on peut ajouter un bloc `else` :
```python
def fib(x):
if x < 2:
return 1
else:
return fib(x - 1) + fib(x - 2)
```
Notes:
(Juste pour doctest :)
```python
>>> [fib(x) for x in range(10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
----
## Le `elif`
Après un `if`, on peut ajouter un ou des bloc `elif` :
```python
def is_prime(n):
if n == 2:
return True
elif n == 1 or n % 2 == 0:
return False
else:
...
```
Notes: Parler de `pass` et de `...`.
----
## Les exceptions
```python
>>> int("abc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
```
----
## Les exceptions : `try`
```python
>>> try:
... int("abc")
... except ValueError:
... print("Raté")
Raté
```
---
## La notation par intension
C'est transformer ça :
```python
>>> accumulator = []
>>> for i in range(10):
... accumulator.append(2 ** i)
>>> accumulator
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
```
----
## La notation par intension
en :
```python
>>> [2 ** i for i in range(10)]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
```
----
## La notation par intension
Ou :
```python
def phi(n):
numbers = []
for i in range(n):
if math.gcd(i, n) == 1:
numbers.append(i)
return len(numbers)
```
----
## La notation par intension
en :
```python
def phi(n):
return len(
[
i
for i in range(n)
if math.gcd(i, n) == i
]
)
```
Notes: Elle devrait s'écrire sur une seule ligne, mais, vidéoprojecteur...
---
# Les variables (suite)
----
## Le type des variables
En Python, les variables ne sont que des noms.
*Des « étiquettes » qu'on colle aux objets.*
Seul les valeurs sont typées.
*Toutes les valeurs sont des objets.*
Notes: Sans. Exceptions.
On peut « coller » plusieurs étiquettes à une même valeur.
C'est pour ça que pour `n = 10` on dit "n est assigné à 10", et non "10 est mis dans n".
----
## La portée des variables
Dans une fonction :
- Si on ne fait qu'accéder, ce sera une globale.
- Si on affecte, c'est une locale.
Notes:
Pour l'accès pensez à `print` par exemple, l'utiliser n'en fait pas une locale.
Une variable ne peut *presque* jamais ne pas contenir de valeur, et on ne peut pas la "déclarer".
----
## Immuables vs modifiables
Certains types sont modifiables, d'autres, non.
Notes: On dit qu'elles sont immuables (*immutable* en anglais).
Attention, les variables sont toujours ... variables, nous n'avons pas
de constantes.
----
## Les types modifiables
Parmis les types modifiables on trouve :
Les listes, les dictionnaires, les ensembles, …
*On peut ajouter a une liste, modifier la valeur pour une clé d'un
dictionnaire, ou vider un ensemble par exemple.*
----
## les types immuables
Parmis les types immuables on trouve :
Les chaînes de caractères, les *n*-uplets, les entiers, les booléens, …
*On ne peut pas dire que maintenant 10 vaut 12, ni que faux est vrai.*
Notes:
Pour les chaînes c'est discutable, mais avoir des chaînes immuables
est confortable (clef de dictionnaires par exemple, ou la garantie
qu'un appel à une fonction avec une chaîne en paramètre ne va pas la
modifier).
----
## La vérité
En Python, ce qui est vide est faux, 0 est faux. Le reste est vrai :
```python
>>> bool("Non vide")
True
>>> bool([]) # Une liste vide
False
>>> bool(0.0)
False
```
Notes:
Attention à la sémantique : `if foo` est différent de `if foo is True`.
Leur rappeler que c'est pylint qui leur dira quand utiliser `is`, leur
dire quand même : pour `True`, `False`, et `None`.