cent20 wrote:critor wrote:Il faut réduire le nombre de lignes, utiliser des noms de fonctions/variables courts, éviter les commentaires, factoriser le code... et encore ça ne suffit pas toujours.
On a déjà épuisé le stock de possibilité ... Raccourcir tous les noms fut la première chose qu'on a fait, c'était tellement trivial que je ne l'ai pas précisé.
Il y a d'autres possibilités que le renommage pour raccourcir du code Python, notamment concernant la belle collection d'instructions conditionnelles ou de chaînes qui diffèrent à de petits détails près. Par contre elles nuisent plus ou moins à la lisibilité du code et donc à sa compréhension et maintenance.
Voici une version du même code très sauvagement compressée (toutes mes excuses) à seulement 2,5Kio :
- Code: Select all
from math import sqrt
a,b,c=0,0,0
def dct():
global a,b,c,d,e,nb,x,y,x1,x2
while a==0:a=o(float(input('a=')))
b,c=o(float(input('b='))),o(float(input('c='))),
d,e,x,y=o(float(b**2-4*a*c)),o(float(a*(-b/2/a)**2-b*b/2/a+c)),o(-b/2/a),o((sqrt(abs(b**2-4*a*c)))/2/a)
nb,x1,x2=2-(d==0),o(min(x+y,x-y)),o(max(x-y,x+y))
def h():
o(9,br=1)
print("Polynome (equation) de degre 2",a==0 and "\nP(x)=ax^2+bx+c(=0)" or "\nP(x)={}{}{}(=0)".format(o(a,ap="x^2",r=4),o(b,p=1,ap="x",r=4,naf=1),o(c,p=1,r=4,naf=1)))
def p():
s=d<0 and "<0" or d>0 and ">0" or ""
print("1)Changer les valeurs a,b,c","\n2)Discriminant={}{}".format(d,s))
if d<0:print("3)Racines complexes conjuguees:2","\nz1={}+{}i".format(x, y),"\nz2={}-{}i".format(x, y))
elif d>0:print("3)Racines reelles distinctes:2","\nx1={}".format(x1),"\nx2={}".format(x2))
elif d==0:print("3)Racine reelle double:1","\nx1=x2={}".format(x))
s=a<0 and "-" or "+"
print("4)Signe:"+(d<0 and s or d>0 and s+"-+"[a<0]+s or s+"0"+s),"\n, extremum:"+"mM"[a<0],"\n5)Factorisation dans les "+(d<0 and "complexes" or "reels"),"\n6)Quitter")
def r(i):
global a,b,c,d,x,y
if i==1:
a,b,c=0,0,0
h()
dct()
elif i==2 or i==3 or i==6:pass
elif i==4:
h()
s=a<0 and "-" or "+"
print(d>0 and " x | x1 -b/(2a) x2",a>0 and "\nP(x)| "+s+" 0 - m - 0 "+s or "\nP(x)| "+s+" 0 "+"+-"[a<0]+" M "+"+-"[a<0]+" 0 "+s or " x | -b/(2a)\nP(x)| "+s+" m "+s,"\nExtremum:","\n(",o(-b/2/a,r=4),";",o(e,r=4),")")
elif i==5:
if d==0:print("P(x)=a(x-(-b/2a))^2",x1 and o(-x1,"\nP(x)={}(x".format(a),")^2",p=1) or "\nP(x)={}x^2".format(a))
elif d>0:print("P(x)=a(x-x1)(x-x2)",o(-x2,o(-x1,"\nP(x)={}(x".format(a),")(x",p=1,naf=2,r=4),")",p=1,naf=2,r=4))
else:print("P(z)=a(z-z1)(z-z2)\nAvec:",o(-x,"\n(z-z1) = (z",o(y,ap="i",r=4,naf=1)+")",r=4,naf=2),o(-x,"\n(z-z2) = (z",o(-y,ap="i",r=4,naf=1)+")",r=4,naf=2))
if (i-6)*(i-1):input()
def o(v,av="",ap="",p=0,r=8,naf=0,br=0):
if br==0:
if v==0:return naf==1 and "" or naf==2 and str(av)+str(ap) or str(av)
v=v==int(v) and int(v) or round(v,r)
if av=="" and ap=="" and p==0:return v
if p==1 and v>0:v="+"+str(v)
return str(av)+str(v)+str(ap)
def m(w=""):
h()
p()
if w!="":print(w)
s=0
while s==0:
try:s=int(input())
except:
s=0
m(">>saisir un entier entre 1 et 6!")
r(s)
if s!=6:m()
o(9,br=1)
r(1)
m()
Et elle marche :
Je dirais à la louche qu'il reste en prime un bon 1Kio de marge sur NumWorks pour compléter/embellir ce code sans erreur de mémoire à l'exécution, donc une belle marge pour obtenir un code fonctionnel qui fasse moins peur aux élèves.