OVH Cloud OVH Cloud

Assignement de droite a gauche ?

4 réponses
Avatar
Vent d'Est - East Wind
je viens de débuter en python , en utilisant le tutoriel libre de gerard
swinnen , que j 'apprecie beaucoup .
Mais j ai un petit problem de compréhension sur un script
ce script affiche les 10 premiers termes de la suite de fibonacci
il marche très bien , mais voila je ne comprend pas totalement pourquoi
et comment

>>> a , b, c = 1 ,1,1
>>> while c < 11:
... print b,
... a , b , c = b , b + a , c + 1
...
1 2 3 5 8 13 21 34 55 89

après avoir assigné les valeurs aux variables
la boucle while va commence
... et affiche la premiere valeur de b trouvé (1)
... a assigné la valeur de b (1) , b assigné la valeur de lui meme plus
celle de a (= 2) , c incrémente de un (1+1)

passe la main a while qui compare c avec 11
ok il affiche b (2)

a assigne la valeurs de b (2), b assigne la valeur de a (2) + sa valeur
2 , c incrémente (3)

boucle while ok

print b (3) ?? 2 + 2 = 4 non ?


ou bien quand b assigne la valeur de a il lui mis la valeur (1) qu'il a
chercher ou ?? (dans la premiere ligne ?? bizarre )
ou bien il a chercher ca dans l'assignement antérieur de a (1) dans ce
cas la il lis de droite a gauche ?

quelqu'un peut m'eclairer sur ces points ?
merci d'avance

Vent d'Est

4 réponses

Avatar
Roger That
Le Sun, 05 Sep 2004 15:20:25 +0000, Vent d'Est - East Wind s'est écrié:

a , b, c = 1 ,1,1
while c < 11:
... print b,



... a , b , c = b , b + a , c + 1 ...
1 2 3 5 8 13 21 34 55 89


Je ne saurais le garantir, mais je crois que ça se passe de la manière
suivante:
- l'interpréteur évalue les expresions "b", "b+a" et "c+1" et en créé
un object tuple. Par exemple, si tu fais "a=1,2,3" puis "print a", ça
t'affiche "(1,2,3)".
- seulement ensuite, l'interpréteur va effectuer une affectation en
tupple. Bien sûr, il faut que le tuple de gauche est la même dimension
que celui de droite (sinon tu as le droit à "ValueError: unpack tuple of
wrong size").

Si tu cherches dans google groupes les mots suivant, tu vas tomber sur ta
question:
python tuple affectation




Avatar
Frédéric Momméja
Vent d'Est - East Wind wrote:

Mais j ai un petit problem de compréhension sur un script
ce script affiche les 10 premiers termes de la suite de fibonacci
il marche très bien , mais voila je ne comprend pas totalement pourqu oi
et comment

a , b, c = 1 ,1,1
while c < 11:
... print b,



... a , b , c = b , b + a , c + 1
...
1 2 3 5 8 13 21 34 55 89


J'ai l'impression que tu penses que les affectations de la ligne suivante :

... a , b , c = b , b + a , c + 1


s'effectuent dans l'ordre : d'abord a, puis b et enfin c...

Ce n'est pas le cas. Ces affectations s'effectuent _simultanément_.
Ainsi, si a=1, b=2 et c=1 (cas après une itération), l'affectat ion se
décompose comme suit :

a = 2 (valeur de b)
b = 2 + 1 (valeur de b + a)
c = 1 + 1 (valeur de c + 1)


C'est comme si, avant d'effectuer les calculs on copiait les valeurs de
a, b et c dans a', b' et c'.
Ensuite on calcule a = b', b = b' + a' et c = c' + 1... ;)

HTH
--
Frédéric Momméja




Avatar
Xavier Combelle
Frédéric Momméja wrote:
Vent d'Est - East Wind wrote:

Mais j ai un petit problem de compréhension sur un script
ce script affiche les 10 premiers termes de la suite de fibonacci
il marche très bien , mais voila je ne comprend pas totalement pourquoi
et comment

a , b, c = 1 ,1,1
while c < 11:
... print b,



... a , b , c = b , b + a , c + 1
...
1 2 3 5 8 13 21 34 55 89



J'ai l'impression que tu penses que les affectations de la ligne suivante :

... a , b , c = b , b + a , c + 1


s'effectuent dans l'ordre : d'abord a, puis b et enfin c...

Ce n'est pas le cas. Ces affectations s'effectuent _simultanément_.
Ainsi, si a=1, b=2 et c=1 (cas après une itération), l'affectation se
décompose comme suit :


De façon surprenante, en python, il n'y a qu'une manière de faire chaque
chose. La méthode pythonique pour écrire des choses successives,
c'est de les mettre les une en dessous des autres.
Je pense que la bonne présentation pour écrire ce qui précède est:
a, b, c = b, (b + a), (c + 1)
Un triplet est la limite ou j'hésite avec la présentation suivante:
(a, b, c) = (b, b + a, c + 1)
à partir de 4 élément, la seconde écriture est clairement meilleure.
le fait est que c'est le tuplet qui est affecté et comme les effets de
bords sont toujours limités, c'est ce à quoi on doit s'attendre.
Il y a bien l'ordre de l'évaluation des arguments qui n'a pas l'air
d'être défini. Cepedant, on peut considérer tout code se basant sur
celui-ci comme étant potentiellemet buggé.

Amicalement,
Xavier





Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour !


Tout en étant d'accord avec vous, je le présenterais d'une manière très
légèrement différente.

Dans le cas d'une ligne
a , b , c = b , b + a , c + 1

Python effectue, dans l'ordre, les choses suivantes :
- traitement de la partie droite du signe égal : b, b+a, c+1 :
- création d'un objet, dans lequel on met le contenu de b, cet
objet est le 1er d'un tuple
- création d'un objet, dans lequel on met b+a (2e du tuple)
- création d'un objet, dans lequel on met c+1 (3e du tuple)
- traitement du signe égal :
- affectation de a sur le 1er objet du tuple (affectation "à la
Python", c'est à dire que a va pointer sur l'objet)
- affectation de b sur le 2e objet
- affectation de c sur le 3e objet

Pour faciliter la compréhension, ne pas oublier qu'en Python, on peut très
bien avoir des objets non pointés. Par exemple,
2,3,4
(2,3,4)




On voit bien, alors, la création d'un tuple de 3 objets


Et aussi, les 2 lignes suivantes sont équivalentes :
a,b,c = (1,2,3)
a,b,c = 1,2,3



@-salutations
--
Michel Claveau