moyen
Éléments d'une expression arithmétique
Dans un terminal Python il est possible de saisir des expressions arithmétiques, des « calculs », afin de les exécuter.
🐍 Console Python >>> 2 + 3 * 4.5
15.5
Cette opération a l'air anodine, mais elle n'est pas si immédiate à effectuer pour Python.
L'une des étapes indispensables est d'analyser l'expression 2 + 3 * 4.5 afin d'en extraire les différents jetons (les anglo-saxons parlent de tokens comme dans cette page ) : 2 , +, 3 , * et 4.5 . Le but de cet exercice est d'effectuer cette analyse.
Remarque
On ne va pas procéder exactement comme Python mais l'idée générale reste la même.
On se donne donc des expressions arithmétiques, chaines de caractères Python, composées de :
nombres entiers ou décimaux (le séparateur décimal est le point '.' ) ;
de symboles d'opérations : '+' , '-' , '*' et '/' ;
de parenthèses '(' et ')' ;
d'espaces ' ' placées entre les jetons, mais pas toujours (voir remarque ci-dessous).
Remarque
On considère que les expressions arithmétiques proposées sont bien formées et correspondent donc à des calculs valides.
Par contre, les différents jetons (nombres et symboles) peuvent être séparés par zéro, un ou plusieurs espaces .
On demande d'écrire la fonction analyse qui prend en argument une telle expression et renvoie la liste des jetons, chacun étant une chaine de caractères. Les espaces seront ignorées.
Exemples
>>> analyse ( "35.896 " )
["35.896"]
>>> analyse ( "3* 5+8" )
["3", "*", "5", "+", "8"]
>>> analyse ( "3.9 * (5+8.6)" )
["3.9", "*", "(", "5", "+", "8.6", ")"]
Version vide Version à trous
.128013sHY3_8èufvIy |7naS1me(P4C2:jtwi]ç[hE*)6Oo;bcdUgM?/0lqABp!.rLF-,=+k%95Rxé050T0v0D0r0F0!0b0n0S0!0r0b0b0:010D0F0(010406050b0i0u0u0r0+0m040s0P0!0i1c0P0q0n020r0u0(0Q0n0_0v1m0+0#0i0v0b050Y1j1l1n1p1h0(041N1U051X0Y1X1Z1U1h0T0F0k1416181a0J0F0V0J0!1;0J0D1f050 0R0!0v1,1719011:1=1@1=0D1}1 1{0D0R0P0T1p1|0+1V0D0J141s0b0(0r0q1a0A01211.010j110v0q1A0v1{2p2r2w232z1 2C0u2E040a0n0x0+0P0(0P0b0F1v1x0}2n0+0+0v0S2Z1N2G0q1V0Y2l2/0D2j2i2k0T2I1a1@0q2B2W1{1)1+15222|0F2~0q2f1*1{0(2(1V2-2/3g1i2q1x342x390+1m0!1f0n0t2,3k1g3j2H3m233o3q3s0A3v2r3x2-2{013C0r3r040n0e3G2.1h3J3A1a3M3O0n0y3S3I3k3K3Y3s0^3$3U3(3W3L0P3p3N3s0N3-3y3l1-3B3=3D3P0p3`3V3}3X3 3@3P0g433/453;3?3Z0@4b3z4d3*040t0Z4i3|354e400t3u1O3w3.4j4r4l0t3F4w3H4y4q3n473O0t3R4E3T3{3)4J1f0t3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424V1W3e1N322=0T2_3K0S2f2O0|1*1V3d0v3f3w3$054}0}554X3B1f0s0d0W0%0O0,0K0s3$0n4-4d0P1f0:5n5p4r0b2u04010;0.0L0Y0w0M013-064%3:0=1f0}0j57444r0E3s5Q4c4A0j1f2r3N0m0b0v5V5c1a1e040w5)4H5d040v0`53180F1w5/3K5,0M0B3-0n625o5R3n1f0v1 2N0q0D1M4V645W2x5r045t6e5v2x5,0I0G61636m5;0D1G0(5u65236i6k3g6f5*015x1f015H4$636E5:1a5M040j3=6y6g5;0S1n0r2*0v2(6U6F0P5T04376%6O3L675@2(5_5{4;6z5+1f606L6M6s6_016Q0F5P6l700q1f6X0+6Z6v6$756V1a6)1f6,7e6F771q5g5i5k5m6^7f015,6|3g066~7z6N3K72746D6t3X0R1f2L5|3:5,5.7s7l1f6v1B7L4d5~6-3K6i020V0D0Q7X3:0u0F1f4o7P6.7v6r7A7A7G6/5=692B6c7U4r6i0*7}66040r0(0(2B0T81237N893X7R6w8c7u1f0M7;7=6~7@7m7S6x7k6.6B7(4d6H5z6K7x8l6 7t7m681G7{6d3i707 8g7m84860q887.5}1f7O8I8C786Y6!7d8V6F7W6}7z7@6Q68738u4A8X7a8Z5(8r7Y1f0)6C3w7B3:8w2v8y56707:8(8l8n8e7T8@3:6i0;8{3H8}4k8:7b6#8?8z8B6F7D8.3n7I047K8R7M8T8L988q8#7/8i9q6A1f7!7$9E1a7*7,8g949m8)76677`6b8H927t8K9v9h8385879N9x9Z8/048p9(048j958*1f2(0D0i0+0q9J7^8E6a7|4,0Y59544=a40Y4^1N0D4`a92@2:2e2g2=0r1~a64^1T5b6.2(0u0f0j0r0=0v0f0J0e1f1F1H1J1L0n7w561!3x1U0,003N0V3=2Y0J2N0n1L0D2I0FaCaSaU2~0n3d0{5%6b202q132#1)0j2z0S0i0!0Da%0n1m0C0v9_1L0*0n0O1x1 0n9@2T0i0k202#as0H1w0n2?0h133d0P0S0Jb92r13b36X0!a;0!0n0}137c2Na,20160n1j2Y200r0i1)0P0.7b1*b9200z1w0E0r0maYbubn0nbB4}1B6=2Xbd051G040_0i0q0.0,2B7#2m0K0q59370V1Nb)80aHamb?2z0q0/bXaD050r0n0J2(0j1/290(0b0B0Y0Y0j0+0*0E0F0=1d0v1)0r0*3=0V0Ycmco0Y0K6;1Lb$0q0f0+0?0z0e0?0$0@0Va=0FcHcJ0$0g2(6:5^cD130+0{cN1@0h6=1N0r3P863p0~6v6bbu20cZ0b0PbH2(b4840F0}9 14a*2T1~0h2Na 0Ua!5?cW5`1xcZc#0Fc%20aT0nb,20bk10a!2#797bdga,0{0S0+1*2raU0TaL1u6=140JdnaDdp8Y0Ddsa 0x1naS0`6wb3584~04dm0D0w1w0M0X0b0X1Na33P0Ta%1;a!1 130u0P6c5od)dWd(dUc3dT5adW6@d)d|d^dFa0d)bUd}54d 0q6dd)b}1%1Y04b1dj1c1@5%0n3N3=bo00d9b#dbb4c!cOdgd@dU090T0;0w0X0B090*eB0;d!0o0I0;095C095E0M6qa2dUa 0lbtdi2V5_ajc;beaT6#d029dhcB6?dcewc$c`1j0+c4bCbEe(c6c8cacc0Dcecg0Y2(0V5?4n0t0*bZf50Y0@0m0c0-0e0k0Y0t9?0vf70`f9c)04eeaI04b/2n2#0x0m2lbd0}0k0F7{en0!epaE1W3x323K251?1^1`an3K2K2B2D1f2Q0sdv1daUfAfC9{4;53an3h56d)8*7m0F1B3=0D8g6*5o9*3n7m8!4x9=045Of{5Uf~3B5Y832C0!5$9l9W8$9)9B3)cVet6@gj9w9/aF4F6Mg39@9_f+7F9R04g13H7@9Ygo9!c10T3N0!9.8Ugg6.8 eJeEeGeIeCeLeNeP0LeR5F0G91gC931f0/9|8De/cD9.9:7xd`5aa52/al4@0~101204.
.128013sHY3_8èufvIy |7naS1me(P4C2:jtwi]ç[hE*)6Oo;bcdUgM?/0lqABp!.rLF-,=+k%95Rxé050T0v0D0r0F0!0b0n0S0!0r0b0b0:010D0F0(010406050b0i0u0u0r0+0m040s0P0!0i1c0P0q0n020r0u0(0Q0n0_0v1m0+0#0i0v0b050Y1j1l1n1p1h0(041N1U051X0Y1X1Z1U1h0T0F0k1416181a0J0F0V0J0!1;0J0D1f050 0R0!0v1,1719011:1=1@1=0D1}1 1{0D0R0P0T1p1|0+1V0D0J141s0b0(0r0q1a0A01211.010j110v0q1A0v1{2p2r2w232z1 2C0u2E040a0n0x0+0P0(0P0b0F1v1x0}2n0+0+0v0S2Z1N2G0q1V0Y2l2/0D2j2i2k0T2I1a1@0q2B2W1{1)1+15222|0F2~0q2f1*1{0(2(1V2-2/3g1i2q1x342x390+1m0!1f0n0t2,3k1g3j2H3m233o3q3s0A3v2r3x2-2{013C0r3r040n0e3G2.1h3J3A1a3M3O0n0y3S3I3k3K3Y3s0^3$3U3(3W3L0P3p3N3s0N3-3y3l1-3B3=3D3P0p3`3V3}3X3 3@3P0g433/453;3?3Z0@4b3z4d3*040t0Z4i3|354e400t3u1O3w3.4j4r4l0t3F4w3H4y4q3n473O0t3R4E3T3{3)4J1f0t3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424V1W3e1N322=0T2_3K0S2f2O0|1*1V3d0v3f3w3$054}0}554X3B1f0s0d0W0%0O0,0K0s3$0n4-4d0P1f0:5n5p4r0b2u04010;0.0L0Y0w0M013-064%3:0=1f0}0j57444r0E3s5Q4c4A0j1f2r3N0m0b0v5V5c1a1e040w5)4H5d040v0`53180F1w5/3K5,0M0B3-0n625o5R3n1f0v1 2N0q0D1M4V645W2x5r045t6e5v2x5,0I0G61636m5;0D1G0(5u65236i6k3g6f5*015x1f015H4$636E5:1a5M040j3=6y6g5;0S1n0r2*0v2(6U6F0P5T04376%6O3L675@2(5_5{4;6z5+1f606L6M6s6_016Q0F5P6l700q1f6X0+6Z6v6$756V1a6)1f6,7e6F771q5g5i5k5m6^7f015,6|3g066~7z6N3K72746D6t3X0R1f2L5|3:5,5.7s7l1f6v1B7L4d5~6-3K6i020V0D0Q7X3:0u0F1f4o7P6.7v6r7A7A7G6/5=692B6c7U4r6i0*7}66040r0(0(2B0T81237N893X7R6w8c7u1f0M7;7=6~7@7m7S6x7k6.6B7(4d6H5z6K7x8l6 7t7m681G7{6d3i707 8g7m84860q887.5}1f7O8I8C786Y6!7d8V6F7W6}7z7@6Q68738u4A8X7a8Z5(8r7Y1f0)6C3w7B3:8w2v8y56707:8(8l8n8e7T8@3:6i0;8{3H8}4k8:7b6#8?8z8B6F7D8.3n7I047K8R7M8T8L988q8#7/8i9q6A1f7!7$9E1a7*7,8g949m8)76677`6b8H927t8K9v9h8385879N9x9Z8/048p9(048j958*1f2(0D0i0+0q9J7^8E6a7|4,0Y59544=a40Y4^1N0D4`a92@2:2e2g2=0r1~a64^1T5b6.2(0u0f0j0r0=0v0f0J0e1f1F1H1J1L0n7w561!3x1U0,003N0V3=2Y0J2N0n1L0D2I0FaCaSaU2~0n3d0{5%6b202q132#1)0j2z0S0i0!0Da%0n1m0C0v9_1L0*0n0O1x1 0n9@2T0i0k202#as0H1w0n2?0h133d0P0S0Jb92r13b36X0!a;0!0n0}137c2Na,20160n1j2Y200r0i1)0P0.7b1*b9200z1w0E0r0maYbubn0nbB4}1B6=2Xbd051G040_0i0q0.0,2B7#2m0K0q59370V1Nb)80aHamb?2z0q0/bXaD050r0n0J2(0j1/290(0b0B0Y0Y0j0+0*0E0F0=1d0v1)0r0*3=0V0Ycmco0Y0K6;1Lb$0q0f0+0?0z0e0?0$0@0Va=0FcHcJ0$0g2(6:5^cD130+0{cN1@0h6=1N0r3P863p0~6v6bbu20cZ0b0PbH2(b4840F0}9 14a*2T1~0h2Na 0Ua!5?cW5`1xcZc#0Fc%20aT0nb,20bk10a!2#797bdga,0{0S0+1*2raU0TaL1u6=140JdnaDdp8Y0Ddsa 0x1naS0`6wb3584~04dm0D0w1w0M0X0b0X1Na33P0Ta%1;a!1 130u0P6c5od)dWd(dUc3dT5adW6@d)d|d^dFa0d)bUd}54d 0q6dd)b}1%1Y04b1dj1c1@5%0n3N3=bo00d9b#dbb4c!cOdgd@dU090T0;0w0X0B090*eB0;d!0o0I0;095C095E0M6qa2dUa 0lbtdi2V5_ajc;beaT6#d029dhcB6?dcewc$c`1j0+c4bCbEe(c6c8cacc0Dcecg0Y2(0V5?4n0t0*bZf50Y0@0m0c0-0e0k0Y0t9?0vf70`f9c)04eeaI04b/2n2#0x0m2lbd0}0k0F7{en0!epaE1W3x323K251?1^1`an3K2K2B2D1f2Q0sdv1daUfAfC9{4;53an3h56d)8*7m0F1B3=0D8g6*5o9*3n7m8!4x9=045Of{5Uf~3B5Y832C0!5$9l9W8$9)9B3)cVet6@gj9w9/aF4F6Mg39@9_f+7F9R04g13H7@9Ygo9!c10T3N0!9.8Ugg6.8 eJeEeGeIeCeLeNeP0LeR5F0G91gC931f0/9|8De/cD9.9:7xd`5aa52/al4@0~101204.
Conseil (1)
On pourra utiliser une variable temporaire afin de stocker les différents caractères composant un nombre.
Conseil (2)
Avant d'ajouter un symbole (opérateur ou parenthèse), on vérifiera que la variable temporaire est non vide. Si c'est le cas, on pourra ajouter un nombre et le symbole à la liste des jetons.
Conseil (3)
Un nombre n'est ni un symbole (opérateur ou parenthèse), ni une espace.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)