Introduction au langage Python à l'aide du module turtle

Dans cette activité, nous allons utiliser les connaissances que vous avez en Scratch pour découvrir le langage Python.

Un premier dessin

Voici un premier exemple d'utilisation du module turtle.

from turtle import *        # permet d'importer le module turtle
color('red')
down()
speed(1)
for i in range(4):
	forward(100)
	left(90)
up()
exitonclick()

Ouvrez un IDE Python (EduPython, PyScripter, Spyder, ...) et commentez ce code en prenant exemple sur ce qui a été fait dans la partie droite de la première ligne. On utilisera le symbole # devant les commentaires.

A retenir :Tout code doit être accompagné de commentaires pour en faciliter la lecture ou la relecture.

Voici deux tutoriels qui vous permettront d'approfondir le module turtle de Python :

https://fr.wikibooks.org/wiki/Programmation_Python/Turtle

https://docs.python.org/3/library/turtle.html

Voici les principales fonctions du module turtle dont on peut avoir besoin pour commencer.

reset()                       #On efface tout et on recommence   
goto(x,y)                     #aller au point de coordonnées (x,y)  
forward(d); backward(d)       #avancer, reculer d'une distance d 
up() ; down()                 #relever, abaisser le crayon 
left(alpha); right(alpha)     #tourner à gauche, tourner à droite d'un angle alpha (en degré)
color(couleur); width(l)      #couleur et épaisseur du tracé
fill(1)                       #Remplit un contour fermé à l'aide de la couleur sélectionnée   
speed(1)                      #Règle la vitesse de la tortue à 1                      
exitonclick()                 #permet de fermer la fenètre de dessin lorsque'on clique   

A vous de jouer

En utilisant les fonctions du module turtle que vous avez découvertes jusqu'ici, essayez de dessiner les 4 formes suivantes que vous avez déjà codées en utilisant un langage graphique dans l'activité code.org.

Dessin 1


Dessin 2


Dessin 3


Dessin 4


Remarque :On remarquera que pour éviter d'accumuler les lignes d'instructions répétitives la boucle bornée Pour (for) est bien utile. Nous allons voir dans la suite comment on peut encore optimiser ce code.

La notion de fonction Python

Avec Scratch, lorsqu’on doit dessiner plusieurs triangles équilatéraux dans une même figure, on a intérêt à utiliser un bloc (Ajouter blocs) pour diminuer le nombre de blocs utilisés.

Il en est de même avec Python. On peut créer une fonction Python comme ci-dessous.

from turtle import*

#Fonction qui dessine un triangle équilatéral de côté c

def triangle(c):
    for i in range(3):
        forward(c)
        right(120)

#Programme principal

color('red')
speed(1)
down()

for i in range(6):
    triangle(100)
    left(60)

up()
exitonclick()
				

A vous de jouer

En vous inspirant de ce qui précède, dessinez à l’aide de Python les dessins suivants.

Dessin 5


Dessin 6

Indication pour le Dessin 6:Les carrés ont des côtés de 50, 60, 70, 80 et 90 pixels.

Dessin 7

Indication pour le Dessin 7 :Les côtés des petits carrés mesurent 60 pixels et le côté du grand carré mesure 100 pixels

Dessin 8

Indication pour le Dessin 8 :Les côtés des carrés mesurent 30, 60 et 90 pixels.

Remarque 1 :Avez-vous pensé à créer une fonction maison pour obtenir les dessins 7 et 8 ?

Remarque 2 :Dans certains langages, on dira que les « fonctions » que vous venez de créer sont des procédures. En informatique, une procédure ne renvoie pas de valeur, par opposition à une fonction informatique qui elle renvoie une valeur. En Python, c’est très simple, procédures et fonctions sont désignées par le mot fonction !

Notion de fonction (suite)

Dans la suite, on va construire une fonction qui renvoie une valeur numérique.

On s’appuiera sur l’exemple de la fonction maSomme ci-dessous qui prend en paramètres deux nombres x et y et qui renvoie la somme de ces deux nombres.

def maSomme(x,y):        # maSomme prend 2 paramètres x et y
    som=x+y              # on affecte à la variable som la somme de x et y
    return som           # on retourne le contenu de la variable som

x=2                      # on affecte à la variable x la valeur 2
y=3                      # on affecte à la variable y la valeur 3

print(maSomme(2,3))      # On affiche dans la console, grâce à la fonction print(...),
                         # la valeur renvoyée par la fonction maSomme avec les  arguments 2 et 3

# On peut également, rendre plus convivial l'affichage dans la console :
print("La somme de",x," et ",y," est égale à :", maSomme(2,3))

A faire :Construire la fonction dist(xA,yA,xB,yB) qui prend en paramètres xA et yA l’abscisse et l’ordonnée d’un point A, xB et yB l’abscisse et l’ordonnée d’un point B et qui renvoie la distance euclidienne entre les points A et B:

Indications 1:On rappelle la propriété suivante.


Propriété : Si \(A(x_A;y_A)\) et \(B(x_B;y_B)\) sont deux points du plan, alors \(AB=\sqrt{(x_B-x_A)^2+(y_B-y_A)^2}\)

Indications 2:En Python, pour obtenir le carré d’un nombre il faut saisir l’instruction suivante.

x**2               # renvoie le carré du nombre x
Indications 3:En Python, pour obtenir la fonction racine carrée, il faut tout d’abord appeler le module math à l’aide de l’instruction suivante placée en début de code.
from math import*
Ce module contient la fonction sqrt(...) qui désigne la fonction racine carrée. Le module math contient d’autres fonctions utiles. En voici une liste non exhaustive.
		from math import*
		sqrt(4)
		sin(pi/4)
		cos(pi/3)
		floor(pi)
		exp(0),exp(1)
		log(1,e),log(e,e)
		log2(2**5)

# renvoie la racine carrée de 4
# renvoie le sinus de \(\frac{\pi}{4}\)
# renvoie le cosinus de \(\frac{\pi}{3}\)
# renvoie la partie entière du nombre \(\pi\)
# renvoie l'exponentielle de 0 et l'exponentielle de 1
# renvoie le logarithme népérien de 1 et de e
# renvoie le logarithme en base 2 de 32

La boucle non bornée Tant Que (While)

Dans tous les dessins précédents, le nombre de carrés ou de triangles (ou maisons) à dessiner était dénombrable. C'est pour cela que nous avons utilisé des boucles bornées Pour (for). C'est encore le cas dans l'exemple suivant.

from turtle import *        # permet d'importer le module turtle

up()
color('blue')
shape('blank')
width(2)
speed(5)
goto(0,100)
down()

a=5

for i in range(10):
    forward(a)
    left(90)
    a=a+5

exitonclick()
Dans ce qui suit, on ne sait pas combien de fois, nous allons devoir répéter les instructions. C'est pour cela que nous allons utiliser la boucle non bornée Tant Que (while).

Rappel :Tant que la condition est vraie, les instructions qui suivent et qui sont indentées vont être exécutées. Lorsque la condition devient fausse, la première instruction (non indentée) qui suit sera effectuée.
Pour éviter de "tomber dans une boucle infinie", il faut bien s'assurer que la condition peut devenir fausse.

while condition:  
    Instruction1
    Instruction2
   ...

Vous trouverez ci-dessous, les opérateurs de comparaison et les opérateurs logiques qui vous permettrons de rédiger vos conditions.

Opérateurs de comparaisons Opérateurs logiques
<  #Strictement inférieur à
>  #Strictement supérieur à
<= #Inférieur ou égal à
>= #Supérieur ou égal à
== #Égal à
!= #Différent de
not #non 
and #et
or  #ou	  

A faire :Créer le code qui permet de dessiner la spirale du Dessin 9 ci-dessous.

Indications :Avant toutes choses, on commencera par déterminer l'angle qui permet de construire la spirale.
Le centre de la spirale qui est aussi le point de départ aura pour coordonnées (0 ;0).
La distance entre la tortue et le centre de la spirale ne devra pas dépasser 100px.

On aura besoin des fonctions suivantes qui font partie du module turtle.

x=xcor()           # on affecte à la variable x l’abscisse de la tortue
y=ycor()           # on affecte à la variable y l’ordonnée de la tortue

Dessin 9

A retenir :

La structure conditionnelle Si ... alors ... sinon

Rappel : Voici comment elle se code en langage Python.

if condition:
    Instruction1
    ...
else:
    Instruction1bis
    ...

Exemple :

from turtle import *        # permet d'importer le module turtle

speed(10)
width(2)
goto(-100,0)
down()

for a in range(10):
    if a%2==0:         #reste de la division euclidienne de a par 2 (résultat de type entier)
        color('blue')
    else:
        color('red')
    forward(30)

exitonclick()

A faire : Modifiez le code que vous avez développé pour obtenir le dessin 9 de manière à obtenir le dessin suivant.

Dessin 10

Opérations de base

a+b 	#a plus b
a-b 	#a moins b
a*b 	#a multiplié  par b
a**3    # a puissance 3
a/b 	#a divisé par b (résultat de type float)
a//b 	#quotient de la division de a par b (résultat de type entier)
a%b 	#modulo ou reste de la division de a par b (résultat de type entier)

Question ouverte

Pour ceux qui ont terminé, voici une question dans laquelle vous allez pouvoir réinvestir tout ce que vous avez compris.

Voir