NumWorks v14: exploration turtle + tests compatibilité
Posted: 13 Jun 2020, 15:57
NumWorks vient de lancer le bêta-test public de sa prochaine version 14, avec un menu pantégruélique.
Nous nous attardons aujourd'hui plus en détail sur les ajouts apportés au module Python turtle.
Nous nous attardons aujourd'hui plus en détail sur les ajouts apportés au module Python turtle.
Lors d'un précédent test comparatif à l'occasion de la dernière mise à jour Casio, nous y avions en effet remarqué quelques faiblesses.
1) Exploration turtle
Go to topÀ l'aide de notre script explmod.py, commençons par fouiller le module turtle à la recherche de nouveautés.
Nous avions pour référence jusqu'à présent 38 à 60 éléments en comptant les sous-éléments.
Nous avons donc désormais de 40 à 62 éléments, avec les deux ajouts suivants :
Nous allons bien évidemment en expliciter l'intérêt, mais en attendant petit bilan au sujet de la richesse des différentes solutions Python sur calculatrices :
NumWorks conforte ainsi sa 2nde place niveau richesse de sa solution Python.
Mais la richesse ne fait pas tout, il faut également voir la compatibilité, et nous y venons de suite.
Nous avions pour référence jusqu'à présent 38 à 60 éléments en comptant les sous-éléments.
- Code: Select all
def getplatform():
id=-1
try:
import sys
try:
if sys.platform=='nspire':id=0
if sys.platform.startswith('TI-Python') or sys.platform=='Atmel SAMD21':id=4
except:id=3
except:
try:
import kandinsky
id=1
except:
try:
if chr(256)==chr(0):id=5+(not ("HP" in version()))
except:
id=2
return id
platform=getplatform()
#lines shown on screen
#plines=[29,12, 7, 9,11,0,0]
plines=[29,16, 7, 9,11,0,0]
#max chars per line
#(error or CR if exceeded)
pcols =[53,99,509,32,32,0,0]
unsafe = ((), (), (), ('sys.argv', 'sys.path'), (), (), ())
if platform>=0:
curline=0
_p = print
nlines=plines[platform]
ncols=pcols[platform]
def print(*ls):
global curline
st=""
for s in ls:
if not(isinstance(s,str)):
s=str(s)
st=st+s
stlines=1+int(len(st)/ncols)
if curline+stlines>=nlines:
input("Input to continue:")
curline=0
_p(st)
curline+=stlines
def sstr(obj):
try:
s=obj.__name__
except:
s=str(obj)
a=s.find("'")
b=s.rfind("'")
if a>=0 and b!=a:
s=s[a+1:b]
return s
def isExplorable(obj):
for k in done:
try:
if isinstance(obj, eval(k)):
t, done[k] = done[k], True
return not t
except: pass
if str(obj).startswith("<module"): return False
l = ()
try: l = dir(obj)
except: pass
return len(l)
done = {'str':False, 'list':False, 'tuple':False, 'dict':False, 'complex':False, 'set':False, 'frozenset': False}
def explmod(pitm, pitmsl=[], reset=True):
global curline
spitm=sstr(pitm)
if(reset):
curline=0
pitmsl=[spitm]
for k in done: done[k] = False
hd="."*(len(pitmsl)-1)
c,c2=0,0
l = sorted(dir(pitm))
for i in range(len(l)):
l[i] = (l[i], getattr(pitm, l[i]))
try:
if not isinstanceof(pitm, str):
for i in range(len(pitm)):
l.append((spitm+'['+str(i)+']',pitm[i]))
except: pass
for itm in l:
c,c2=c+1,c2+1
isUnsafe = platform >= 0 and '.'.join(pitmsl + [itm[0]]) in unsafe[platform]
try:
if isUnsafe: raise Exception
print(hd+itm[0]+"="+str(itm[1]))
except:
print(hd+itm[0])
if not isUnsafe and isExplorable(itm[1]) and itm[1] != pitm and itm[0] not in pitmsl:
pitmsl2=pitmsl.copy()
pitmsl2.append(itm[0])
c2=c2+explmod(itm[1], pitmsl2, False)[1]
if c>0 and reset:
print(hd+"Total: "+str(c)+" 1st level item(s)")
if c2>0 and c2!=c:
print(hd+" "+str(c2)+" item(s)")
return [c,c2]
Nous avons donc désormais de 40 à 62 éléments, avec les deux ajouts suivants :
- fonction colormode()
- fonction write()
Nous allons bien évidemment en expliciter l'intérêt, mais en attendant petit bilan au sujet de la richesse des différentes solutions Python sur calculatrices :
Casio Graph 35+E II 90+E | NumWorks | TI-83PCE Ed. Python | ||
builtins array collections cmath gc math matplotlib matplotlib.pyplot micropython os random sys time turtle uerrno | 84-197 . . . . 25-47 . . . . 8-30 . . . . | 97-1581 3-363 . 13-428 9-404 42-602 . . 10-410 . . 17-977 . . 25-1277 | 89-211 . . 12-34 . 41-63 3-25 11-33 6-28 . 9-31 . 3-25 40-62 . | 92-211 2-24 2-24 . 7-29 28-50 . . . . 8-30 15-93 4-26 . . |
spécifique | casioplot:6-28 | prime:3-368 | ion:48-162 kandinsky:8-30 | ti_graphics:30-75 ti_hub:? ti_plotlib:49-84 ti_system:12-34 ti_rover:66-92 |
Modules | 4 | 9 | 11 | 13 |
Eléments | 123-302 | 219-6042 | 269-703 | 315-772 |
- 315-772 éléments : TI-83 Premium CE Edition Python
- 269-703 éléments : NumWorks
- 219-6042 éléments : HP Prime (version alpha)
- 123-302 éléments : Casio Graph 90+E / 35+E II
Casio Graph 35+E II 90+E | CasioPython Casio Graph 35+E II 35+E/USB 75/85/95 | MicroPython TI-Nspire | TI-Python | TI-83PCE Ed. Python | ||
builtins array collections cmath gc math matplotlib matplotlib.pyplot micropython os random sys time turtle uerrno | 84-197 . . . . 25-47 . . . . 8-30 . . 69-126 . | 91-230 2-28 . 12-38 7-33 41-67 . . 6-32 . 8-34 12-38 . . 24-108 | 93-218 2-28 . 12-38 7-33 41-67 . . 3-29 . . 15-86 . . . | 92-212 2-24 2-24 . 7-29 28-50 . . . . 8-30 15-93 4-26 . . | 93-214 2-25 2-25 12-35 7-30 41-64 . . 6-29 15-38 8-31 15-99 8-33 . . | 92-211 2-24 2-24 . 7-29 28-50 . . . . 8-30 15-93 4-26 . . |
spécifique | casioplot:6-28 matplotl:25-68 | nsp:3-10 | board:22 storage:7-47 | ce_box:5-32 ce_chart:8-67 ce_quivr:5-41 ce_turtl:? ti_graphics:30-75 ti_hub:? ti_plotlib:49-84 ti_system:12-34 ti_rover:66-92 | ||
Modules | 6 | 9 | 8 | 9 | 13 | 17 |
Eléments | 217-496 | 203-608 | 176-509 | 158-488 | 238-692 | 333-912 |
- 322-912 éléments : TI-83 Premium CE Edition Python
- 269-703 éléments : NumWorks
- 238-692 éléments : TI-83 Premium CE + TI-Python (firmware tiers)
- 219-6042 éléments : HP Prime (version alpha)
- 217-496 éléments : Casio Graph 90+E / 35+E II / fx-CG50 / fx-9750/9860GIII
- 203-608 éléments : Casio Graph 75/85/95 / 35+E/USB / 35+E II / fx-9750GII/GIII / fx-9860G/GII/GIII (appli CasioPython)
- 176-509 éléments : TI-Nspire (appli MicroPython)
- 158-488 éléments : TI-83 Premium CE + TI-Python
NumWorks conforte ainsi sa 2nde place niveau richesse de sa solution Python.
Mais la richesse ne fait pas tout, il faut également voir la compatibilité, et nous y venons de suite.
2) compatibilité turtle
Go to topCommençons déjà par tester les déplacements relatifs de la tortue. Voici par exemple avec la construction d'une rosace par rotation d'un polygone régulier :
La tortue travaillant en pixels, le code aurait besoin d'être adapté pour l'écran Graph 35+E II à plus faible définition. Mais à part cela, le code passe ici sans problème sur Casio, NumWorks et ordinateur.
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
La tortue travaillant en pixels, le code aurait besoin d'être adapté pour l'écran Graph 35+E II à plus faible définition. Mais à part cela, le code passe ici sans problème sur Casio, NumWorks et ordinateur.
Complexifions un petit peu la chose avec la fractale de Koch. Rajoutons également un levé de crayon (penup), un déplacement absolu (goto), ainsi que l'utilisation d'une des couleurs prédéfinies :
Ici pareil, compatibilité totale !
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Ici pareil, compatibilité totale !
Allons bien plus loin niveau couleurs avec maintenant un soleil :
Problème ici sur NumWorks, qui a fait le choix de ne pas utiliser le même système de coordonnées que le standard pour les composantes de couleurs RVB :
Par contre, chez Casio cette fonction certes inutile ici n'est pas présente. Il nous faut donc sécuriser son appel en interceptant toute erreur éventuelle.
- Code: Select all
from math import exp
from turtle import *
for i in range(1,37):
red=(exp(-0.5 * ((i-6)/12)**2))
green=(exp(-0.5 * ((i-18)/12)**2))
blue=(exp(-0.5 * ((i-30)/12)**2))
pencolor([red, green, blue])
for i in range(1, 5):
forward(60)
right(90)
right(10)
Problème ici sur NumWorks, qui a fait le choix de ne pas utiliser le même système de coordonnées que le standard pour les composantes de couleurs RVB :
- nombres flottants de 0.0 à 1.0 sur Casio et ordinateur
- nombres entiers de 0 à 255 sur NumWorks et TI-83 Premium CE Edition Python
colormode(1.)
à tout script compatible Casio ou ordinateur pour le rendre également fonctionnel sur NumWorks ! Par contre, chez Casio cette fonction certes inutile ici n'est pas présente. Il nous faut donc sécuriser son appel en interceptant toute erreur éventuelle.
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Poursuivons avec une coquille d'escargot en appliquant la même astuce, et l'appel à la fonction de tracé de cercle circle() :
Sous réserve de cette toute petite astuce donc, compatibilité totale.
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Sous réserve de cette toute petite astuce donc, compatibilité totale.
Faisons maintenant neiger quelques flocons de Koch, en faisant variant l'épaisseur du crayon avec pensize() :
Les réglages d'épaisseur du crayon via pensize() semblent hélas totalement ignorés chez Casio.
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Les réglages d'épaisseur du crayon via pensize() semblent hélas totalement ignorés chez Casio.
Passons maintenant à une rosace construite par rotation d'un cercle, avec une écriture de texte via la fonction write().
Cette fonction standard n'était jusqu'à présent pas disponible dans le module turtle de NumWorks.
Mais maintenant c'est le cas alors voyons ce que ça donne :
Petit écart chez Casio, avec le texte qui est écrit en prenant la position de la tortue comme coin supérieur gauche, alors que le standard la prend comme coin inférieur gauche.
Cette fonction standard n'était jusqu'à présent pas disponible dans le module turtle de NumWorks.
Mais maintenant c'est le cas alors voyons ce que ça donne :
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Petit écart chez Casio, avec le texte qui est écrit en prenant la position de la tortue comme coin supérieur gauche, alors que le standard la prend comme coin inférieur gauche.
Passons maintenant au script de démo dédié à la Casio Graph 90+E, avec inversion du sens de tracé des cercles.
Il suffisait pour cela de passer un rayon négatif à la fonction circle(), ce qui n'était hélas pas géré chez NumWorks et ignoré.
Mais maintenant apparemment désormais c'est bon :
Il suffisait pour cela de passer un rayon négatif à la fonction circle(), ce qui n'était hélas pas géré chez NumWorks et ignoré.
Mais maintenant apparemment désormais c'est bon :
Graph 35+E II | Graph 90+E | NumWorks | ordi |
|
Juste pour le plaisir, un dernier exemple avec les triangles de Sierpiński :
Graph 35+E II | Graph 90+E | Num Works | ordi |
|
Conclusion
Go to topNous ne pouvons que saluer l'exceptionnelle réactivité de NumWorks, qui s'est empressé de colmater les quelques petites faiblesses que nous avions constatées dans son module turtle.
Nous obtenons ainsi sur la NumWorks version 14 un module turtle en excellente adéquation avec le standard et bénéficiant ainsi d'une non moins excellente compatibilité avec les scripts conçus pour le standard ou pour les plateformes visant à le respecter.
Une compatibilité peut-être un poil meilleure que celle de Casio.
Mais bref dans les deux cas, nous avons donc d'excellentes solutions qui permettront de concevoir et exécuter des scripts Python turtle dans une classe équipée de différents modèles avec un effort très minimal !
Nous obtenons ainsi sur la NumWorks version 14 un module turtle en excellente adéquation avec le standard et bénéficiant ainsi d'une non moins excellente compatibilité avec les scripts conçus pour le standard ou pour les plateformes visant à le respecter.
Une compatibilité peut-être un poil meilleure que celle de Casio.
Mais bref dans les deux cas, nous avons donc d'excellentes solutions qui permettront de concevoir et exécuter des scripts Python turtle dans une classe équipée de différents modèles avec un effort très minimal !
Liens :
- inscription bêta-test NumWorks
- mise à jour NumWorks (à accéder après inscription)