Skip to content
Snippets Groups Projects
Commit fb9b9222 authored by Vincent N's avatar Vincent N
Browse files

Ajout NB If et test autoformat

parent e79656fb
Branches
No related tags found
No related merge requests found
Pipeline #36916 passed
%% Cell type:markdown id: tags:
<div style="padding:20px;background-color:papayawhip;" >
<h3 style="color:chocolate"> <i class="fa fa-info" aria-hidden="true"> </i> &nbsp; Remarque introductive &nbsp; <i class="fa fa-info" aria-hidden="true"></h3>
<p> Ce fichier est fait pour être lu sur le site <a href="https://notebook.basthon.fr/"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style="border: 0; display:inline; margin: 0 5px; height:30px" alt="Basthon"/></a>. <br>
Si vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>
Veuillez cliquez sur <a href="https://notebook.basthon.fr/">ce lien</a> et y charger ce fichier à l'aide du bouton "Ouvrir" &nbsp; <i class="fa fa-folder" aria-hidden="true"> </i>
</p> </div>
%% Cell type:markdown id: tags:
# Décider - `if`
Dans ce chapitre, nous allons voir comment un programme peut faire des choix, et comment il peut exécuter du code de façon sélective. Nous allons voir que :
- le mot-clé `if` permet une exécution conditionnelle,
- le mot-clé `if-else` permet de choisir entre deux alternatives,
- le mot-clé `elif` (else if) permet d'ajouter différentes conditions.
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
```
En Python, `if` est suivi
A) d'un bloc
B) d'une condition
C) de parenthèses
D) d'un deux-points
```
%% Cell type:raw id: tags:
Ma réponse :
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">B) d'une condition
</div>
</details>
%% Cell type:markdown id: tags:
## Comparer
Un programme doit parfois comparer deux valeurs.
Python connait six types de comparaisons :
- plus petit (`<`),
- plus petit ou égal (`<=`),
- égal (`==`),
- différent (`!=`),
- plus grand (`>`),
- plus grand ou égal (`>=`).
Dans des formules mathématiques nous utilisons les symboles ≤, ≥ et ≠. En Python vous devez utiliser deux symboles: `<=`, `>=` et `!=` à la place.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 1 </h3>Ajoutez des exemples avec les autres 5 comparateurs.
%% Cell type:code id: tags:
``` python
x = 3
print('x =', x)
print('(x < 2) =', x < 2)
```
%% Output
x = 3
(x < 2) = False
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
```
L'expression `x == 2`
A) met la valeur 2 dans la variable x
B) compare deux valeurs
C) affecte la variable x avec une valeur
D) retourne True ou False
```
%% Cell type:raw id: tags:
Ma réponse :
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">D) retourne True ou False
</div>
</details>
```{caution}
!! Il ne faut pas confondre l'opérateur d'affectation (`x = 2`) avec l'opérateur de comparaison (`x == 2`) !!
```
Le résultat d'une comparaison est une valeur booléenne, soit `True` soit `False`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 2 </h3>Que se passe-t-il si vous échangez les deux éléments dans `x == 2` ?
Et si vous échangez les deux éléments dans `x = 2` ?
%% Cell type:code id: tags:
``` python
x = 2 # affectation
x == 2 # comparaison
print(x)
print(x == 2)
```
%% Cell type:markdown id: tags:
### Êtes-vous majeur ?
Basé sur votre âge, le programme exécute soit le premier bloc (`if`) soit le deuxième bloc (`else`). Il affiche si vous êtes majeur ou pas.
%% Cell type:code id: tags:
``` python
age = input('Entrez votre âge: ')
if int(age) < 18:
print('accès interdit - vous êtes mineur')
else:
print('accès OK - vous êtes majeur')
```
%% Cell type:markdown id: tags:
### Le signe d'un nombre
Le mot-clé `elif` est une contraction de **else if** et permet de continuer à tester d'autres conditions.
Trouvez le signe d'un nombre.
%% Cell type:code id: tags:
``` python
n = input('Entrez un nombre: ')
n = int(n)
if n > 0:
print('positif')
elif n < 0:
print('négatif')
else:
print('zéro')
```
%% Cell type:markdown id: tags:
Sans le mot-clé `elif` nous devrions mettre le bloc `if` à l'intérieur du bloc `else` en indentation.
Avec multiples conditions, les blocs se décalent de plus en plus et rendent le programme illisible.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 3 </h3>Testez le programme avec -2, 0, 3.
%% Cell type:code id: tags:
``` python
n = input('Entrez un nombre: ')
n = int(n)
if n > 0:
print('positif')
else:
if n < 0:
print('négatif')
else:
print('zéro')
```
%% Cell type:markdown id: tags:
## Visualiser la comparaison
Dans l'exemple suivant, nous visualisons le résultat des 6 comparateurs en affichant graphiquement le résultat des 6 comparaisons du type `i < n`.
- La variable `i` va de -9 à 9
- La variable `n` est marquée en rouge
- Le résultat `True ` est exprimé avec un grand point, `False` avec un petit
Que fait l'expression `'red' if i == n else 'black'` ?
Elle renvoie `'red'` si `i == n` et `'black'` autrement.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 4 </h3>Modifiez la variable `n` et exécutez le code de nouveau.
%% Cell type:code id: tags:
``` python
from turtle import *
d = 20 # dimension de base
n = 2 # valeur de comparaison
up()
for j in range(7):
for i in range(-10, 10):
goto(i*d, 100-j*d)
color('red' if i == n else 'black')
if i == -10:
c = ('i', '< n', '<= n', '== n', '!= n', '>= n', '> n')[j]
write(c, font=(None, d//2), align='right')
elif j == 0:
write(i, font=(None, d//2), align='center')
else:
result = (0, i<n, i<=n, i==n, i!=n, i>=n, i>n)[j]
dot(d if result else d/4)
done()
```
%% Cell type:markdown id: tags:
## Une position aléatoire
Dans ce chapitre nous allons prendre des décisions basées sur la position `(x, y)` d'un point.
Nous avons donc besoin d'un certain nombre de points, pour ensuite prendre des décisions.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 5 </h3>Les variables `w, h` (width, height) représentent largeur et hauteur de la plage rectangulaire des valeurs aléatoires.
Modifiez-les vers `280, 180` et exécutez le code de nouveau.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 10, 100
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
dot(d)
done()
```
%% Cell type:markdown id: tags:
## Exécution conditionnelle
La structure `if` ci-dessous permet d'exécuter une action seulement si `condition` est `True`.
``` python
if condition:
action
```
Dans notre exemple nous affichons un point rouge seulement si x est positif (`x > 0`)
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 6 </h3>Ajoutez une deuxième condition `if` pour colorier un point en `lime` si `x < -100`.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 10, 100
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > 100:
dot(2*d, 'red')
dot(d)
done()
```
%% Cell type:markdown id: tags:
## La structure `if else`
La structure `if else` ci-dessous permet d'exécuter une **action_1** seulement si une **condition** est vraie et une **action_2** autrement
``` python
if condition:
action_1
else:
action_2
```
Dans l'exemple ci-dessous la condition de test est `y > 0`.
Si cette condition est vraie, le point est colorié en rouge, autrement en bleu.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 20, 300
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if y > 0:
dot(d, 'red')
else:
dot(d, 'blue')
done()
```
%% Cell type:markdown id: tags:
## L'opération `and`
L'opération logique `and` permet de connecter deux conditions.
Les deux conditions doivent être vraies pour que l'expression soit vraie.
Pour accélérer le dessin, nous désactivons l'animation avec `tracer(0)`.
Pour afficher le résultat, nous devons alors appeler la fonction `update()` à la fin.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 7 </h3>Modifiez le code pour que les points aient une couleur différente dans chaque quadrant.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > 0 and y > 0:
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Région en diagonale
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 8 </h3>Modifiez le code pour que les points aient 4 couleurs, divisées par les 2 diagonales.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 1000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > y:
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Dans un cercle
Un cercle est défi par une distance donnée d'un point.
Le cercle autour de l'origine avec un rayon r est donné par la formule
$ x^2 + y^2 = r^2 $
Cette formule nous permet de décider si un point aléatoire est à l'intérieur ou à l'extérieur d'un cercle.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if (x**2 + y**2) > 150**2 :
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
La fonction `in_circle(p, q, r)` vérifie si le point `p` se trouve
à l'intérieur d'un cercle de rayon `r` qui se trouve à la position `q`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 9 </h3>Ajoutez un deuxième cercle avec un rayon r=100, colorié en rouge, qui se trouve à la position (100, -50).
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
def in_circle(p, q, r):
d = (p[0]-q[0])**2 + (p[1]-q[1])**2
return d < r**2
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_circle(p, (-100, 50), 80):
dot(d, 'lime')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Diagramme de Venne
Avec les 3 opérateurs logiques:
- `and`
- `or`
- `not`
nous pouvons trouver des expressions pour trouver les points qui se trouvent dans l'intersection (`and`) ou dans l'union (`or`) de deux cercles.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 10 </h3>Modifiez le code pour que les points appartenant à l'intersection des deux cercles soient dessinés en jaune.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
r, q, q2 = 120, (-60, 0), (60, 0)
def in_circle(p, q, r):
d = (p[0]-q[0])**2 + (p[1]-q[1])**2
return d < r**2
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_circle(p, q, r) and not in_circle(p, q2, r):
dot(d, 'lime')
elif in_circle(p, q2, r):
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Dans un rectangle
Dans des programmes interactifs, on doit souvent déterminer si un clic de la souris (x, y) a eu lieu à l'intérieur d'un bouton, qui est normalement une région rectangulaire.
Pour tester si la valeur $x$ se trouve dans l'intervalle $[x_0, x_1]$ nous devons faire deux comparaisons.
Python permet de remplacer `(x0 < x) and (x < x1)` par l'expression plus compacte `x0 < x < x1`.
%% Cell type:code id: tags:
``` python
x0, x1 = 5, 10
x = 8
if x0 < x < x1:
print(x, "est entre", x0, 'et', x1)
else:
print(x, "n'est entre", x0, 'et', x1)
```
%% Cell type:markdown id: tags:
La fonction `in_rect(p, x0, x1, y0, y1)` détermine si la position du point `p` est à l'intérieur du rectangle indiqué par les coordonnées `x0, x1, y0, y1`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 11 </h3>Ajoutez un deuxième rectangle ou les points ont une autre couleur.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
def in_rect(p, x0, x1, y0, y1):
return x0 < p[0] < x1 and y0 < p[1] < y1
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_rect(p, 50, 220, -50, 100):
dot(d, 'lime')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## À gauche d'une droite
La fonction `is_left(p, q, q2)` est vraie si le point `p` se trouve à gauche de la droite définie par les deux points (q, q2).
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
q, q2 = (-160, -100), (60, 0)
def is_left(p, q, q2):
return (p[0]-q[0])*(q2[1]-q[1]) - (p[1]-q[1])*(q2[0]-q[0]) < 0
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if is_left(p, q, q2):
dot(d, 'lime')
else:
dot(d, 'blue')
for p in (q, q2):
goto(p)
dot(3*d, 'red')
update()
done()
```
%% Cell type:markdown id: tags:
La fonction `in_poly(p, poly)` est vraie si le point `p` se trouve à l'intérieur d'un polygone convexe dont les points sont dans l'ordre du sens de l'horloge.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
poly = ((-160, -100), (100, 100), (60, -100))
def is_left(p, q, q2):
return (p[0]-q[0])*(q2[1]-q[1]) - (p[1]-q[1])*(q2[0]-q[0]) < 0
def in_poly(p, poly):
n = len(poly)
for i in range(n):
q = poly[i]
q2 = poly[(i+1)%n]
if is_left(p, q, q2):
return False
return True
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_poly(p, poly):
dot(d, 'lime')
else:
dot(d, 'blue')
for p in poly:
goto(p)
dot(3*d, 'red')
update()
done()
```
%% Cell type:markdown id: tags:
---
#### Remarque générale
Ce document est une adaptation d'un ressource pédagogique tiré du catalogue modulo https://modulo-info.ch/. Il est sous license Creative Commons [BY-NC-SA](https://creativecommons.org/licenses/?lang=fr)
![Licence Creative Commons](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)
%% Cell type:markdown id: tags:
<div style="padding:20px;background-color:papayawhip;" >
<h3 style="color:chocolate"> <i class="fa fa-info" aria-hidden="true"> </i> &nbsp; Remarque introductive &nbsp; <i class="fa fa-info" aria-hidden="true"></h3>
<p> Ce fichier est fait pour être lu sur le site <a href="https://notebook.basthon.fr/"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style="border: 0; display:inline; margin: 0 5px; height:30px" alt="Basthon"/></a>. <br>
Si vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>
Veuillez cliquez sur <a href="https://notebook.basthon.fr/">ce lien</a> et y charger ce fichier à l'aide du bouton "Ouvrir" &nbsp; <i class="fa fa-folder" aria-hidden="true"> </i>
</p> </div>
%% Cell type:markdown id: tags:
# Décider - `if`
Dans ce chapitre, nous allons voir comment un programme peut faire des choix, et comment il peut exécuter du code de façon sélective. Nous allons voir que :
- le mot-clé `if` permet une exécution conditionnelle,
- le mot-clé `if-else` permet de choisir entre deux alternatives,
- le mot-clé `elif` (else if) permet d'ajouter différentes conditions.
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
```
En Python, `if` est suivi
A) d'un bloc
B) d'une condition
C) de parenthèses
D) d'un deux-points
```
%% Cell type:raw id: tags:
Ma réponse :
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">B) d'une condition
</div>
</details>
%% Cell type:markdown id: tags:
## Comparer
Un programme doit parfois comparer deux valeurs.
Python connait six types de comparaisons :
- plus petit (`<`),
- plus petit ou égal (`<=`),
- égal (`==`),
- différent (`!=`),
- plus grand (`>`),
- plus grand ou égal (`>=`).
Dans des formules mathématiques nous utilisons les symboles ≤, ≥ et ≠. En Python vous devez utiliser deux symboles: `<=`, `>=` et `!=` à la place.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 1 </h3>Ajoutez des exemples avec les autres 5 comparateurs.
%% Cell type:code id: tags:
``` python
x = 3
print('x =', x)
print('(x < 2) =', x < 2)
```
%% Output
x = 3
(x < 2) = False
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
```
L'expression `x == 2`
A) met la valeur 2 dans la variable x
B) compare deux valeurs
C) affecte la variable x avec une valeur
D) retourne True ou False
```
%% Cell type:raw id: tags:
Ma réponse :
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">D) retourne True ou False
</div>
</details>
```{caution}
!! Il ne faut pas confondre l'opérateur d'affectation (`x = 2`) avec l'opérateur de comparaison (`x == 2`) !!
```
Le résultat d'une comparaison est une valeur booléenne, soit `True` soit `False`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 2 </h3>Que se passe-t-il si vous échangez les deux éléments dans `x == 2` ?
Et si vous échangez les deux éléments dans `x = 2` ?
%% Cell type:code id: tags:
``` python
x = 2 # affectation
x == 2 # comparaison
print(x)
print(x == 2)
```
%% Cell type:markdown id: tags:
### Êtes-vous majeur ?
Basé sur votre âge, le programme exécute soit le premier bloc (`if`) soit le deuxième bloc (`else`). Il affiche si vous êtes majeur ou pas.
%% Cell type:code id: tags:
``` python
age = input('Entrez votre âge: ')
if int(age) < 18:
print('accès interdit - vous êtes mineur')
else:
print('accès OK - vous êtes majeur')
```
%% Cell type:markdown id: tags:
### Le signe d'un nombre
Le mot-clé `elif` est une contraction de **else if** et permet de continuer à tester d'autres conditions.
Trouvez le signe d'un nombre.
%% Cell type:code id: tags:
``` python
n = input('Entrez un nombre: ')
n = int(n)
if n > 0:
print('positif')
elif n < 0:
print('négatif')
else:
print('zéro')
```
%% Cell type:markdown id: tags:
Sans le mot-clé `elif` nous devrions mettre le bloc `if` à l'intérieur du bloc `else` en indentation.
Avec multiples conditions, les blocs se décalent de plus en plus et rendent le programme illisible.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 3 </h3>Testez le programme avec -2, 0, 3.
%% Cell type:code id: tags:
``` python
n = input('Entrez un nombre: ')
n = int(n)
if n > 0:
print('positif')
else:
if n < 0:
print('négatif')
else:
print('zéro')
```
%% Cell type:markdown id: tags:
## Visualiser la comparaison
Dans l'exemple suivant, nous visualisons le résultat des 6 comparateurs en affichant graphiquement le résultat des 6 comparaisons du type `i < n`.
- La variable `i` va de -9 à 9
- La variable `n` est marquée en rouge
- Le résultat `True ` est exprimé avec un grand point, `False` avec un petit
Que fait l'expression `'red' if i == n else 'black'` ?
Elle renvoie `'red'` si `i == n` et `'black'` autrement.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 4 </h3>Modifiez la variable `n` et exécutez le code de nouveau.
%% Cell type:code id: tags:
``` python
from turtle import *
d = 20 # dimension de base
n = 2 # valeur de comparaison
up()
for j in range(7):
for i in range(-10, 10):
goto(i*d, 100-j*d)
color('red' if i == n else 'black')
if i == -10:
c = ('i', '< n', '<= n', '== n', '!= n', '>= n', '> n')[j]
write(c, font=(None, d//2), align='right')
elif j == 0:
write(i, font=(None, d//2), align='center')
else:
result = (0, i<n, i<=n, i==n, i!=n, i>=n, i>n)[j]
dot(d if result else d/4)
done()
```
%% Cell type:markdown id: tags:
## Une position aléatoire
Dans ce chapitre nous allons prendre des décisions basées sur la position `(x, y)` d'un point.
Nous avons donc besoin d'un certain nombre de points, pour ensuite prendre des décisions.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 5 </h3>Les variables `w, h` (width, height) représentent largeur et hauteur de la plage rectangulaire des valeurs aléatoires.
Modifiez-les vers `280, 180` et exécutez le code de nouveau.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 10, 100
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
dot(d)
done()
```
%% Cell type:markdown id: tags:
## Exécution conditionnelle
La structure `if` ci-dessous permet d'exécuter une action seulement si `condition` est `True`.
``` python
if condition:
action
```
Dans notre exemple nous affichons un point rouge seulement si x est positif (`x > 0`)
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 6 </h3>Ajoutez une deuxième condition `if` pour colorier un point en `lime` si `x < -100`.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 10, 100
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > 100:
dot(2*d, 'red')
dot(d)
done()
```
%% Cell type:markdown id: tags:
## La structure `if else`
La structure `if else` ci-dessous permet d'exécuter une **action_1** seulement si une **condition** est vraie et une **action_2** autrement
``` python
if condition:
action_1
else:
action_2
```
Dans l'exemple ci-dessous la condition de test est `y > 0`.
Si cette condition est vraie, le point est colorié en rouge, autrement en bleu.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 300, 200
d, n = 20, 300
up()
speed(0)
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if y > 0:
dot(d, 'red')
else:
dot(d, 'blue')
done()
```
%% Cell type:markdown id: tags:
## L'opération `and`
L'opération logique `and` permet de connecter deux conditions.
Les deux conditions doivent être vraies pour que l'expression soit vraie.
Pour accélérer le dessin, nous désactivons l'animation avec `tracer(0)`.
Pour afficher le résultat, nous devons alors appeler la fonction `update()` à la fin.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 7 </h3>Modifiez le code pour que les points aient une couleur différente dans chaque quadrant.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > 0 and y > 0:
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Région en diagonale
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 8 </h3>Modifiez le code pour que les points aient 4 couleurs, divisées par les 2 diagonales.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 1000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if x > y:
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Dans un cercle
Un cercle est défi par une distance donnée d'un point.
Le cercle autour de l'origine avec un rayon r est donné par la formule
$ x^2 + y^2 = r^2 $
Cette formule nous permet de décider si un point aléatoire est à l'intérieur ou à l'extérieur d'un cercle.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
for i in range(n):
x, y = randint(-w, w), randint(-h, h)
goto(x, y)
if (x**2 + y**2) > 150**2 :
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
La fonction `in_circle(p, q, r)` vérifie si le point `p` se trouve
à l'intérieur d'un cercle de rayon `r` qui se trouve à la position `q`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 9 </h3>Ajoutez un deuxième cercle avec un rayon r=100, colorié en rouge, qui se trouve à la position (100, -50).
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
def in_circle(p, q, r):
d = (p[0]-q[0])**2 + (p[1]-q[1])**2
return d < r**2
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_circle(p, (-100, 50), 80):
dot(d, 'lime')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Diagramme de Venne
Avec les 3 opérateurs logiques:
- `and`
- `or`
- `not`
nous pouvons trouver des expressions pour trouver les points qui se trouvent dans l'intersection (`and`) ou dans l'union (`or`) de deux cercles.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 10 </h3>Modifiez le code pour que les points appartenant à l'intersection des deux cercles soient dessinés en jaune.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
r, q, q2 = 120, (-60, 0), (60, 0)
def in_circle(p, q, r):
d = (p[0]-q[0])**2 + (p[1]-q[1])**2
return d < r**2
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_circle(p, q, r) and not in_circle(p, q2, r):
dot(d, 'lime')
elif in_circle(p, q2, r):
dot(d, 'red')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## Dans un rectangle
Dans des programmes interactifs, on doit souvent déterminer si un clic de la souris (x, y) a eu lieu à l'intérieur d'un bouton, qui est normalement une région rectangulaire.
Pour tester si la valeur $x$ se trouve dans l'intervalle $[x_0, x_1]$ nous devons faire deux comparaisons.
Python permet de remplacer `(x0 < x) and (x < x1)` par l'expression plus compacte `x0 < x < x1`.
%% Cell type:code id: tags:
``` python
x0, x1 = 5, 10
x = 8
if x0 < x < x1:
print(x, "est entre", x0, 'et', x1)
else:
print(x, "n'est entre", x0, 'et', x1)
```
%% Cell type:markdown id: tags:
La fonction `in_rect(p, x0, x1, y0, y1)` détermine si la position du point `p` est à l'intérieur du rectangle indiqué par les coordonnées `x0, x1, y0, y1`.
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 11 </h3>Ajoutez un deuxième rectangle ou les points ont une autre couleur.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
def in_rect(p, x0, x1, y0, y1):
return x0 < p[0] < x1 and y0 < p[1] < y1
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_rect(p, 50, 220, -50, 100):
dot(d, 'lime')
else:
dot(d, 'blue')
update()
done()
```
%% Cell type:markdown id: tags:
## À gauche d'une droite
La fonction `is_left(p, q, q2)` est vraie si le point `p` se trouve à gauche de la droite définie par les deux points (q, q2).
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
q, q2 = (-160, -100), (60, 0)
def is_left(p, q, q2):
return (p[0]-q[0])*(q2[1]-q[1]) - (p[1]-q[1])*(q2[0]-q[0]) < 0
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if is_left(p, q, q2):
dot(d, 'lime')
else:
dot(d, 'blue')
for p in (q, q2):
goto(p)
dot(3*d, 'red')
update()
done()
```
%% Cell type:markdown id: tags:
La fonction `in_poly(p, poly)` est vraie si le point `p` se trouve à l'intérieur d'un polygone convexe dont les points sont dans l'ordre du sens de l'horloge.
%% Cell type:code id: tags:
``` python
from turtle import *
from random import *
w, h = 280, 180
d, n = 10, 2000
tracer(0)
up()
poly = ((-160, -100), (100, 100), (60, -100))
def is_left(p, q, q2):
return (p[0]-q[0])*(q2[1]-q[1]) - (p[1]-q[1])*(q2[0]-q[0]) < 0
def in_poly(p, poly):
n = len(poly)
for i in range(n):
q = poly[i]
q2 = poly[(i+1)%n]
if is_left(p, q, q2):
return False
return True
for i in range(n):
p = randint(-w, w), randint(-h, h)
goto(p)
if in_poly(p, poly):
dot(d, 'lime')
else:
dot(d, 'blue')
for p in poly:
goto(p)
dot(3*d, 'red')
update()
done()
```
%% Cell type:markdown id: tags:
---
#### Remarque générale
Ce document est une adaptation d'un ressource pédagogique tiré du catalogue modulo https://modulo-info.ch/. Il est sous license Creative Commons [BY-NC-SA](https://creativecommons.org/licenses/?lang=fr)
![Licence Creative Commons](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment