Math et Python : histoire d’un bug – épisode 1

J’ai développé en Python, il y a un moment déjà un petit utilitaire qui produit des exercices de trigonométrie (https://site2wouf.fr/exercices_trigonometrie.php) qui les corrige et qui fabrique par la même occasion un pdf avec exercices et corrections.

Oui mais voilà, en récoltant les fruits de mon travail en classe aujourd’hui je tombe sur cet exercice et sa correction et remarque une erreur :

Exercice 1

Dans le triangle RBN rectangle en R, on sait que :

  • BN = 3,7 cm
  • BNR = 30°

Après avoir fait un schéma, calcule la longueur du segment [RB]. (Arrondir au dixième)

Correction

Exercice 1

image/svg+xml R B N ? 3,7 cm 30°

Dans le triangle RBN rectangle en R, on cherche une relation entre l’angle aigu RNB son coté opposé et l’hypoténuse du triangle.

RB / BN

= sin(RNB)

d’où

RB / 3,7

= sin(30°)

On a donc RB = 3,7 × sin(30°) ≈ 1.8 cm

Voyez-vous l’erreur ?

sin(30°)=0.5

3.7sin(30°)=1.85

Python aurait du arrondir à 1,9cm

Lu sur la doc Python :

https://docs.python.org/fr/3.7/library/functions.html?highlight=round#round

Le comportement de round() avec les nombres à virgule flottante peut être surprenant : par exemple round(2.675, 2) donne 2.67 au lieu de 2.68. Ce n’est pas un bug, mais dû au fait que la plupart des fractions de décimaux ne peuvent pas être représentés exactement en nombre a virgule flottante. Voir Arithmétique en nombres à virgule flottante : problèmes et limites pour plus d’information.

Pour Python, avec le module math importé :

>>> sin((radians(30)))
0.49999999999999994

donc en multipliant par 3.7, Python trouvera un résultat très proche de 1,85 mais strictement inférieur donc dont le développement décimal commencera par 1,84… et il arrondira effectivement à 1,8.

En arrondissant (round(sin((radians(30)),5) j’évite le souci mais ne vais-je pas tombé parfois sur le comportement évoqué de round() ?

Qu’en pensez-vous ?

Logigramme.py en version 3.0.0

Présentation de l’application logigramme.py

logigramme.py est une application Python3, open source et gratuite qui permet, à partir d’un fichier prog.txt contenant du pseudo-code de fabriquer, en SVG un logigramme comme celui ci-dessus.

Pratique et léger il peut faire gagner du temps aux enseignants de Mathématiques, d’informatique et de technologie.

Mode d’emploi

Pré-requis

L’utilisateur final doit avoir Python3 installé sur sa station de travail.

Téléchargement

L’application logigramme.py est disponible en téléchargement

Il suffit de décompresser cette archive à l’emplacement de votre choix, d’éditer le fichier prog.txt (qui contient un pseudo-code exemple) de le modifier et de le sauvegarder.

Un double clic sur logigramme_f.py (ou en le lançant via l’IDLE de Python) va générer (si le pseudo_code ne contient pas d’erreur) prog.svg. (Il est possible de voir le résultat dans un navigateur en lançant test.html.

Syntaxe du pseudo-code

Le pseudo-code qui correspond au logigramme précédent est simple:

Début Faire un logigramme
Si vous connaissez cette application
le faire en quelques secondes en SVG !
sinon
le faire à la main; et c'est long !
fin_si
Fin

Les seuls impératifs concernant la structure sont logiques : un tq ou un si doit être ouvert avant d’être fermé (fin_tq, fin_si) :

  • tq avant fin_tq
  • si avant fin_si (avec éventuellement un “sinon” intercalé)

Nouveautés de la version 3.0.0

La version 3.0.0 est plus qu’une mise à jour : La logique a été repensé pour privilégier un affichage clair des textes. C’est maintenant la taille des cadres qui s’adapte aux contenus.

Pour les développeurs, un mode de déboguage est activable en passant le booléen debug à 1 dans les codes Python .

Cette version (beta) est en ligne depuis le 29 octobre 2020, n’hésitez pas à intervenir pour en améliorer les performances !

Mathématiques, semaine du 25 mai

Cycle 3

Correction en vidéo de l’activité :

Les travaux de la semaine :

Dans le même style sur Geogebra :

  1. https://www.geogebra.org/classic/spsRadCD
  2. https://www.geogebra.org/classic/sSB4ScND

Dernière minute

Je viens de recevoir le travail suivant (PDF) , c’est ce que j’attends de vous !

L’espace sur Mathenpoche :

Cycle 4

Sur Mathenpoche, vous avez toute la semaine pour (re)lire le chapitre Algorithmique et programmation et faire tous les exercices du type “Entraine-toi”

Le lien s’ouvre dans une nouvelle fenêtre, ce qui vous permet de poser vos questions ici si besoin !

Cette icône vous permet d’interagir avec moi en direct. Ne vous en privez pas !

We are here ! Page d’aide

ODS8 en fichier texte. Script Python

Cet article vient en complément de l’archive Un lexique genre ODS7 en txt… , en effet un utilisateur m’a fait part de sa recherche sur l’ODS 8 et ce “vieux billet” est un peu obsolète.

Voilà, mais pour des besoins pédagogiques (formation algorithme au cycle 4) j’avais besoin d’une liste de mots en .txt

Remarque : Je dis bien liste de mots (et non dictionnaire). Et les mots sont à tout le monde…

En effet j’envisage de faire travailler des élèves de 4ème, 3ème sur le développement d’algorithmes divers ayant pour base des jeux de lettres :

  • Boggle
  • Scabble
  • Pendu
  • etc…

Après quelques recherches sur la toile, je me suis aperçu que le fichier txt que je cherchais n’existait pas. Mais que quelques sites proposaient des listes (en html multi-pages. )

Ainsi le très bon listesdemots.net vous propose de nombreuses liste de mots. (898 pages)

Il était donc possible mais fastidieux de créer un fichier txt en copiant collant toutes ces listes !

Pas si fastidieux si on a Python sous le coude !

Code Python traduit en HTML:
#wouf 2020 (py3.6.4)
#http://site2wouf.fr
#Pour créer dico.txt
#Qui contient un lexique basé sur
#ODS8
#En scollant le site : listesdemots.net
#requis :l beautifulsoup4
#(cmd : pip install beautifulsoup4)
#requis :2 requests
#(cmd : pip install requests)
import requests
from bs4 import BeautifulSoup
fichier = open("dico.txt" , "w" )
 
#   Initialisation:
url="https://www.listesdemots.net/touslesmots" 
requete = requests.get(str(url+".htm" )) #page1
print(requete.url)
page = requete.content
 
soup = BeautifulSoup(page,features="html5lib" )
span = soup.find("span" , {"class" : "mot" })
mots=span.string.strip()
lesmots=mots.split(" " )
for l in lesmots:
    fichier.write(l+"\n" )
    print("|" ,end="" )
print()
print("page 1 : OK (" +str(len(lesmots))+")" )
totalmot=len(lesmots)
fichier.close()
#page 2 à 918:
for i in range(2,919):
    fichier = open("dico.txt" , "a" )
    lurl=url+"page" +str(i)+".htm" 
    ok=False
    while not ok:
        try:
            requete = requests.get(lurl,timeout=1)
            ok=True
        except:
            print("Problème de connexion. Je recommence !" )
    print(requete.url)
    page = requete.content
    soup = BeautifulSoup(page,features="html5lib" )
    span = soup.find("span" , {"class" : "mot" })
    mots=span.string.strip()
    lesmots=mots.split(" " )
    for l in lesmots:
        fichier.write(l+"\n" )
        print("|" ,end="" )
    totalmot+=len(lesmots)
    print()
    print("page " +str(i)+" : OK (" +str(len(lesmots))+"/" +str(totalmot)+")" )
    fichier.close()
#fin du script:
  
 
print("mots :" ,totalmot)

Ce script produit en quelques minutes un fichier txt (avec un mot par ligne) contenant tous les mots du site !

Sur le site de la fédération on peut lire :

Qui contacter pour distribuer/vendre un ouvrage ou autre produit utilisant la base de mots de l’Officiel du Scrabble® ?

Tout auteur souhaitant distribuer/vendre un ouvrage ou autre produit (hors application pour Smartphone), utilisant une base de mots conforme à l’Officiel du Scrabble®, doit remplir un contrat de partenariat qui lui sera envoyé sur demande faite auprès de la FISF, à l’adresse suivante : contact@fisf.net

Toute société souhaitant distribuer/vendre un produit numérique privé/grand public sécurisé du type application pour Smartphone, utilisant une base de mots conforme à l’ODS, doit contacter Jean-François Richez, responsable des licences numériques chez Larousse, à l’adresse suivante : JFRICHEZ@larousse.fr

Mon projet Python par Martin

Martin’s Logo

Ce projet réalisé par Martin D, élève de 3ème au collège C Peguy d’Arras a été réalisé dans le cadre d’une formation en programmation (algorithme)

Au cycle 4, les élèves s’initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d’un langage ou d’un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s’entraînent au raisonnement

Code Python traduit en HTML:
#Martin 3e
from turtle import *
color("red" )#couleur de la figure

speed("fastest" )#vitesse trés rapide
bgcolor("black" )#couleur de fond
for i in range(75):#je répete le programme 75 fois 

    
    
    forward(200-i)
  
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    left(90)

goto(30,30)#je fais cette comande pour mettre le cercle au centre de ma figure
begin_fill()
color("black" )#couleur du cercle
circle(20)#cercle
end_fill()#cercle plein
ht()

Mes commentaires

Ce premier visuel 2019-2020 me plaît vraiment beaucoup ! Attention quand tu évoques dans un commentaire, la couleur du cercle… Il s’agit en fait de la couleur … du disque!

Astuce : l’objet Fraction de Python

l’objet Fraction

J’ai déjà évoqué ici l’utilisation de Python en mode “calculatrice”, c’est à dire dans l’IDLE. Pratique, rapide, imprimable les avantages à préférer l’IDLE à une calculatrice classiques sont nombreux et évidents.

Même les calculs avec les fractions sont faisables en utilisant l’objet Fraction du module fractions (from fractions import Fraction…). Et en choisissant un alias court (…as f) on évite d’écrire Fraction() un certain nombre de fois !

Tous les calculs classiques sont possibles (dans l’exemple ci-dessus **2 sert à mettre au carré) et le résultat est donné sous forme d’une fraction irréductible.

Mon projet Python par Evan

La coquille saint-Evan

Ce projet réalisé par Evan, élève de 3ème au collège C Peguy d’Arras a été réalisé dans le cadre d’une formation en programmation (algorithme)

Au cycle 4, les élèves s’initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d’un langage ou d’un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s’entraînent au raisonnement

Code Python traduit en HTML:
#Evan - 3D - 2018
#Programme qui trace deux cercles contenant des couleurs aléatoires

from turtle import *
from random import choice

#reglages turtle
speed('fastest')
bgcolor('black')
couleurs = ['blue','red','green','yellow','brown','black','white','pink',
            'orange','purple','grey'] #Couleurs disponibles aléatoirement

#corps du programme
for i in range(400) :
    color(choice(couleurs)) #choix d'une couleur 
    circle(200-i) #On trace le cercle de rayon qui se décrémente à chaque tour

input() #pour éviter la fermeture du programme (Windows en mode console)

Mes commentaires

Le visuel me plaît beaucoup. La pertinence des commentaires est agréable. Mon seul bémol concerne le rapport entre la taille de la fenêtre et la taille effective du rendu. Une recherche t’aurait permis de paramétrer une fenêtre plus grande… (Ou éventuellement de diminuer les rayons des cercles).

Une remarque pour terminer : Dans ta boucle, quand i est supérieur à 200, les cercles ont un rayon négatif… Cela n’existe pas, pourtant pour Turtle si ! C’est curieux, non ?

Mon projet Python, par Malo


Deux tortues et beaucoup de hasard par Malo

Ce projet réalisé par Malo, élève de 3ème au collège C Peguy d’Arras a été réalisé dans le cadre d’une formation en programmation (algorithme)

Au cycle 4, les élèves s’initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d’un langage ou d’un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s’entraînent au raisonnement

Code Python traduit en HTML:
#Malo Fournier 15/11/18
from turtle import *
from random import*


fred = Turtle()#nouvelle tortue

#l'épaisseur du trait
width(3)
fred.width(3)

#on change "l'apparence"  du personnage
shape("blank" )
fred.shape("blank" )

#on choisit des couleurs aléatoires
couleur=['snow', 'ghost white', 'white smoke', 'gainsboro', 'floral white', 'old lace',
    'linen', 'antique white', 'papaya whip', 'blanched almond', 'bisque', 'peach puff',
    'navajo white', 'lemon chiffon', 'mint cream', 'azure', 'alice blue', 'lavender',
    'lavender blush', 'misty rose', 'dark slate gray', 'dim gray', 'slate gray',
    'light slate gray', 'gray', 'light grey', 'midnight blue', 'navy', 'cornflower blue', 'dark slate blue',
    'slate blue', 'medium slate blue', 'light slate blue', 'medium blue', 'royal blue',  'blue',
    'dodger blue', 'deep sky blue', 'sky blue', 'light sky blue', 'steel blue', 'light steel blue',
    'light blue', 'powder blue', 'pale turquoise', 'dark turquoise', 'medium turquoise', 'turquoise',
    'cyan', 'light cyan', 'cadet blue', 'medium aquamarine', 'aquamarine', 'dark green', 'dark olive green',
    'dark sea green', 'sea green', 'medium sea green', 'light sea green', 'pale green', 'spring green',
    'lawn green', 'medium spring green', 'green yellow', 'lime green', 'yellow green',
    'forest green', 'olive drab', 'dark khaki', 'khaki', 'pale goldenrod', 'light goldenrod yellow',
    'light yellow', 'yellow', 'gold', 'light goldenrod', 'goldenrod', 'dark goldenrod', 'rosy brown',
    'indian red', 'saddle brown', 'sandy brown',
    'dark salmon', 'salmon', 'light salmon', 'orange', 'dark orange',
    'coral', 'light coral', 'tomato', 'orange red', 'red', 'hot pink', 'deep pink', 'pink', 'light pink',
    'pale violet red', 'maroon', 'medium violet red', 'violet red',
    'medium orchid', 'dark orchid', 'dark violet', 'blue violet', 'purple', 'medium purple',
    'thistle', 'snow2', 'snow3',
    'snow4', 'seashell2', 'seashell3', 'seashell4', 'AntiqueWhite1', 'AntiqueWhite2',
    'AntiqueWhite3', 'AntiqueWhite4', 'bisque2', 'bisque3', 'bisque4', 'PeachPuff2',
    'PeachPuff3', 'PeachPuff4', 'NavajoWhite2', 'NavajoWhite3', 'NavajoWhite4',
    'LemonChiffon2', 'LemonChiffon3', 'LemonChiffon4', 'cornsilk2', 'cornsilk3',
    'cornsilk4', 'ivory2', 'ivory3', 'ivory4', 'honeydew2', 'honeydew3', 'honeydew4',
    'LavenderBlush2', 'LavenderBlush3', 'LavenderBlush4', 'MistyRose2', 'MistyRose3',
    'MistyRose4', 'azure2', 'azure3', 'azure4', 'SlateBlue1', 'SlateBlue2', 'SlateBlue3',
    'SlateBlue4', 'RoyalBlue1', 'RoyalBlue2', 'RoyalBlue3', 'RoyalBlue4', 'blue2', 'blue4',
    'DodgerBlue2', 'DodgerBlue3', 'DodgerBlue4', 'SteelBlue1', 'SteelBlue2',
    'SteelBlue3', 'SteelBlue4', 'DeepSkyBlue2', 'DeepSkyBlue3', 'DeepSkyBlue4',
    'SkyBlue1', 'SkyBlue2', 'SkyBlue3', 'SkyBlue4', 'LightSkyBlue1', 'LightSkyBlue2',
    'LightSkyBlue3', 'LightSkyBlue4', 'SlateGray1', 'SlateGray2', 'SlateGray3',
    'SlateGray4', 'LightSteelBlue1', 'LightSteelBlue2', 'LightSteelBlue3',
    'LightSteelBlue4', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4',
    'LightCyan2', 'LightCyan3', 'LightCyan4', 'PaleTurquoise1', 'PaleTurquoise2',
    'PaleTurquoise3', 'PaleTurquoise4', 'CadetBlue1', 'CadetBlue2', 'CadetBlue3',
    'CadetBlue4', 'turquoise1', 'turquoise2', 'turquoise3', 'turquoise4', 'cyan2', 'cyan3',
    'cyan4', 'DarkSlateGray1', 'DarkSlateGray2', 'DarkSlateGray3', 'DarkSlateGray4',
    'aquamarine2', 'aquamarine4', 'DarkSeaGreen1', 'DarkSeaGreen2', 'DarkSeaGreen3',
    'DarkSeaGreen4', 'SeaGreen1', 'SeaGreen2', 'SeaGreen3', 'PaleGreen1', 'PaleGreen2',
    'PaleGreen3', 'PaleGreen4', 'SpringGreen2', 'SpringGreen3', 'SpringGreen4',
    'green2', 'green3', 'green4', 'chartreuse2', 'chartreuse3', 'chartreuse4',
    'OliveDrab1', 'OliveDrab2', 'OliveDrab4', 'DarkOliveGreen1', 'DarkOliveGreen2',
    'DarkOliveGreen3', 'DarkOliveGreen4', 'khaki1', 'khaki2', 'khaki3', 'khaki4',
    'LightGoldenrod1', 'LightGoldenrod2', 'LightGoldenrod3', 'LightGoldenrod4',
    'LightYellow2', 'LightYellow3', 'LightYellow4', 'yellow2', 'yellow3', 'yellow4',
    'gold2', 'gold3', 'gold4', 'goldenrod1', 'goldenrod2', 'goldenrod3', 'goldenrod4',
    'DarkGoldenrod1', 'DarkGoldenrod2', 'DarkGoldenrod3', 'DarkGoldenrod4',
    'RosyBrown1', 'RosyBrown2', 'RosyBrown3', 'RosyBrown4', 'IndianRed1', 'IndianRed2',
    'IndianRed3', 'IndianRed4', 'sienna1', 'sienna2', 'sienna3', 'sienna4', 'burlywood1',
    'burlywood2', 'burlywood3', 'burlywood4', 'wheat1', 'wheat2', 'wheat3', 'wheat4', 'tan1',
    'tan2', 'tan4', 'chocolate1', 'chocolate2', 'chocolate3', 'firebrick1', 'firebrick2',
    'firebrick3', 'firebrick4', 'brown1', 'brown2', 'brown3', 'brown4', 'salmon1', 'salmon2',
    'salmon3', 'salmon4', 'LightSalmon2', 'LightSalmon3', 'LightSalmon4', 'orange2',
    'orange3', 'orange4', 'DarkOrange1', 'DarkOrange2', 'DarkOrange3', 'DarkOrange4',
    'coral1', 'coral2', 'coral3', 'coral4', 'tomato2', 'tomato3', 'tomato4', 'OrangeRed2',
    'OrangeRed3', 'OrangeRed4', 'red2', 'red3', 'red4', 'DeepPink2', 'DeepPink3', 'DeepPink4',
    'HotPink1', 'HotPink2', 'HotPink3', 'HotPink4', 'pink1', 'pink2', 'pink3', 'pink4',
    'LightPink1', 'LightPink2', 'LightPink3', 'LightPink4', 'PaleVioletRed1',
    'PaleVioletRed2', 'PaleVioletRed3', 'PaleVioletRed4', 'maroon1', 'maroon2',
    'maroon3', 'maroon4', 'VioletRed1', 'VioletRed2', 'VioletRed3', 'VioletRed4',
    'magenta2', 'magenta3', 'magenta4', 'orchid1', 'orchid2', 'orchid3', 'orchid4', 'plum1',
    'plum2', 'plum3', 'plum4', 'MediumOrchid1', 'MediumOrchid2', 'MediumOrchid3',
    'MediumOrchid4', 'DarkOrchid1', 'DarkOrchid2', 'DarkOrchid3', 'DarkOrchid4',
    'purple1', 'purple2', 'purple3', 'purple4', 'MediumPurple1', 'MediumPurple2',
    'MediumPurple3', 'MediumPurple4', 'thistle1', 'thistle2', 'thistle3', 'thistle4',
    'gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10',
    'gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19',
    'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28',
    'gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37',
    'gray38', 'gray39', 'gray40', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47',
    'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56',
    'gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65',
    'gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74',
    'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83',
    'gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92',
    'gray93', 'gray94', 'gray95', 'gray97', 'gray98', 'gray99']








speed("fastest" )#vitesse

fred.forward(50)#on place fred
left(180)





#programme en lui même
for i in range(1000):

    bgcolor(choice(couleur))#choix du fond
    fred.forward(45+i)
    fred.color(choice(couleur))#on "invoque"  les couleurs aléatoire
    color(choice(couleur))#on "invoque"  les couleurs aléatoire
    fred.left(170-i)
    forward(45+i)
    left(170-i)

Mes commentaires

Trois choses sont particulièrement intéressantes dans ce code:

  • La liste des couleurs utilisables en Python avec Turtle
  • Le choix aléatoire de la couleur
  • La possibilité de piloter deux tortues

Je suis un peu plus réservé quant au résultat visuel… Même si le travail de recherche personnel (module random, deux turtles…) est excellent !

Mon projet Python par Nathan

Travail de Nathan

Ce projet réalisé par Nathan, élève de 3ème au collège C Peguy d’Arras a été réalisé dans le cadre d’une formation en programmation (algorithme)

Au cycle 4, les élèves s’initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d’un langage ou d’un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s’entraînent au raisonnement

Code Python traduit en HTML:
# nathan m. 3B octogone
from turtle import *
speed("fastest" )
shape("blank" )#cela enlève le curseur
title("mon projet Nathan 3B" )
# une boucle de 500 itérations
for i in range(500):
    bgcolor("black" )
    color("pink" )# je change de couleur a chaque fois
    forward(500-i)
    right(190)
    color("blue" )
    forward(500-i)#on avance
    right(190)#on tourne a droite
    color("green" )
    forward(500-i)
    right(190)
    color("purple" )
    forward(500-i)
    right(190)
    color("red" )
    forward(500-i)
    right(190)
    color("yellow" )
    forward(500-i)
    right(190)
    color("white" )
    forward(500-i)
    right(190)
    color("orange" )
    forward(500-i)
    right(190)
    width(5) #on épaisie le trait 

Mes commentaires

Quand on débute dans un langage de programmation, commenter ses sources a une importance particulière : aider à mémoriser les instructions simples. Mais Python est tellement “lisible” que la plupart des commentaires sont ici inutiles. 

Le résultat est simple et joli, et je ne me suis posé qu’une question à la lecture du code : Pourquoi 500 itérations ?

Quand tu écris right(190) tu tournes à droite ???

Un lexique genre ODS7 en txt…

Cet article est obsolète, vous pouvez lire l’ Article mis à jour pour l’ODS8

L’Officiel du Scrabble® est le dictionnaire officiel du jeu de Scrabble® francophone depuis le 1er janvier 1990. Il est édité par Larousse et est couramment appelé « ODS » par les scrabbleurs.

2016 voit l’entrée en vigueur de l’ODS7…

Sur le site de la fédération on peut lire :

Qui contacter pour distribuer/vendre un ouvrage ou autre produit utilisant la base de mots de l’Officiel du Scrabble® ?

Tout auteur souhaitant distribuer/vendre un ouvrage ou autre produit (hors application pour Smartphone), utilisant une base de mots conforme à l’Officiel du Scrabble®, doit remplir un contrat de partenariat qui lui sera envoyé sur demande faite auprès de la FISF, à l’adresse suivante : contact@fisf.net

Toute société souhaitant distribuer/vendre un produit numérique privé/grand public sécurisé du type application pour Smartphone, utilisant une base de mots conforme à l’ODS, doit contacter Jean-François Richez, responsable des licences numériques chez Larousse, à l’adresse suivante : JFRICHEZ@larousse.fr

Voilà, mais pour des besoins pédagogiques (formation algorithme au cycle 4) j’avais besoin d’une liste de mots en .txt

Remarque : Je dis bien liste de mots (et non dictionnaire). Et les mots sont à tout le monde…

En effet j’envisage de faire travailler des élèves de 4ème, 3ème sur le développement d’algorithmes divers ayant pour base des jeux de lettres :

  • Boggle
  • Scabble
  • Pendu
  • etc…

Après quelques recherches sur la toile, je me suis aperçu que le fichier txt que je cherchais n’existait pas. Mais que quelques sites proposaient des listes (en html multi-pages. )

Ainsi le très bon listesdemots.net vous propose de nombreuses liste de mots. (898 pages)

Il était donc possible mais fastidieux de créer un fichier txt en copiant collant toutes ces listes !

Pas si fastidieux si on a Python sous le coude !

#wouf 2018 (py3.6.4)
#http://site2wouf.fr
#Pour créer dico.txt
#Qui contient un lexique basé sur
#ODS7
#En scollant le site : listesdemots.net
#requis :l beautifulsoup4
#(cmd : pip install beautifulsoup4)

import requests
from bs4 import BeautifulSoup
fichier = open("dico.txt", "w")

#	Initialisation:
url="https://www.listesdemots.net/touslesmots"
requete = requests.get(str(url+".htm")) #page1
print(requete.url)
page = requete.content

soup = BeautifulSoup(page,features="html5lib")
span = soup.find("span", {"class": "mot"})
mots=span.string.strip()
lesmots=mots.split(" ")
for l in lesmots:
    fichier.write(l+"\n")
    print("|",end="")
print()
print("page 1 : OK ("+str(len(lesmots))+")")
totalmot=len(lesmots)
fichier.close()
#page 2 à 8998:
for i in range(2,899):
    fichier = open("dico.txt", "a")
    lurl=url+"page"+str(i)+".htm"
    ok=False
    while not ok:
        try:
            requete = requests.get(lurl,timeout=1)
            ok=True
        except:
            print("Problème de connexion. Je recommence !")
    print(requete.url)
    page = requete.content
    soup = BeautifulSoup(page,features="html5lib")
    span = soup.find("span", {"class": "mot"})
    mots=span.string.strip()
    lesmots=mots.split(" ")
    for l in lesmots:
        fichier.write(l+"\n")
        print("|",end="")
    totalmot+=len(lesmots)
    print()
    print("page "+str(i)+" : OK ("+str(len(lesmots))+"/"+str(totalmot)+")")
    fichier.close()
#fin du scipt:
 

print("mots :",totalmot)
    


Ce script produit en quelques minutes un fichier txt (avec un mot par ligne) contenant les 402 503 mots du site !

En cas de mauvaise connexion, pas de souci, le script gère ! Le temps de génération du fichier txt sera sensiblement plus long !

Enjoy !