Pourquoi n'y a-t-il pas d'opérateurs ++
et --
en Python ?
Il est souvent utile d'utiliser quelque chose comme tableau[i++], ce qui n'est pas bien fait avec += ou -=.
Pourquoi n'y a-t-il pas d'opérateurs ++
et --
en Python ?
Ce n'est pas parce que cela n'a pas de sens; il est tout à fait logique de définir "x++" comme "x += 1, évaluant à la liaison précédente de x".
Si vous voulez connaître la raison originale, vous devrez soit parcourir d'anciennes listes de diffusion Python, soit demander à quelqu'un qui était présent (par exemple Guido), mais il est assez facile de justifier après coup:
L'incrémentation et la décrémentation simples ne sont pas aussi nécessaires que dans d'autres langages. Vous n'écrivez pas des choses comme for(int i = 0; i < 10; ++i)
en Python très souvent; au lieu de cela, vous faites des choses comme for i in range(0, 10)
.
Comme ce n'est pas nécessaire aussi souvent, il y a beaucoup moins de raisons de lui donner sa propre syntaxe spéciale; quand vous avez besoin d'incrémenter, +=
est généralement tout à fait suffisant.
Ce n'est pas une question de savoir si cela a du sens, ou si cela peut être fait - cela a du sens, et cela peut être fait. C'est une question de savoir si le bénéfice vaut la peine d'être ajouté à la syntaxe de base du langage. Rappelez-vous, il s'agit de quatre opérateurs - postinc, postdec, preinc, predec, et chacun d'eux aurait besoin de ses propres surcharges de classe; ils doivent tous être spécifiés et testés; cela ajouterait des opcodes au langage (impliquant un moteur VM plus grand, et donc plus lent); chaque classe qui prend en charge un incrément logique devrait les implémenter (en plus de +=
et -=
).
Tout cela est redondant avec +=
et -=
, cela deviendrait donc une perte nette.
Il est souvent utile d'utiliser quelque chose comme tableau[i++], ce qui n'est pas bien fait avec += ou -=.
@thayes Étant donné que cela se situera à l'intérieur d'une boucle, vous pourriez aussi boucler directement sur i
- si vous en avez vraiment besoin et que vous ne pouvez pas simplement utiliser par exemple array.append()
Cette réponse originale que j'ai écrite est un mythe du folklore de l'informatique : réfuté par Dennis Ritchie comme "historiquement impossible" comme noté dans les lettres aux éditeurs de Communications of the ACM de juillet 2012 doi:10.1145/2209249.2209251
Les opérateurs d'incrémentation/décrémentation en C ont été inventés à une époque où le compilateur C n'était pas très intelligent et les auteurs voulaient pouvoir spécifier directement l'intention qu'un opérateur de langage machine devrait être utilisé, ce qui permettait de gagner quelques cycles pour un compilateur qui pourrait effectuer un
charger la mémoire
charger 1
ajouter
stocker la mémoire
au lieu de
inc mémoire
et le PDP-11 supportait même des instructions "auto-incrément" et "auto-incrément différé" correspondant respectivement à *++p
et *p++
. Consultez la section 5.3 du manuel si vous êtes terriblement curieux.
Comme les compilateurs sont suffisamment intelligents pour gérer les astuces d'optimisation de haut niveau intégrées dans la syntaxe du C, elles ne sont maintenant qu'une commodité syntaxique.
Python n'a pas de trucs pour transmettre les intentions à l'assembleur car il n'en utilise pas.
Javascript a ++. Je ne pense pas que cela soit un "truc pour transmettre les intentions à l'assembleur." De plus, Python possède un bytecode. Donc je pense que la raison est autre.
Ce "donner des conseils au compilateur" business est en effet un mythe. Franchement, c'est une stupide addition à n'importe quel langage et cela viole les deux préceptes suivants : 1. Vous ne codez pas pour que l'ordinateur lise, vous codez pour qu'un autre ingénieur lise. Et 2. Vous ne codez pas pour qu'un ingénieur compétent lise, vous codez pour qu'un ingénieur compétent lise alors qu'il est épuisé à 3 heures du matin et bourré de caféine.
@tgm1024 Pour être juste, lorsque vous codez sur un télétype en demi-duplex de 10 à 30 caractères par seconde, vous codez de manière à pouvoir le saisir avant la semaine prochaine.
one--
est un dans la phrase, mais zéro immédiatement après. Ainsi ce 'koan' suggère également que les opérateurs d'incrémentation/décrémentation ne sont pas évidents.
Un tiret cadratin est généralement écrit en ascii comme deux tirets, mais l'explication de @VictorK est plus amusante.
@GSto: Si x++ et x+=1 font la même chose, pouvez-vous me dire les valeurs de (x++) et (x+=1) ? Je pense que le dernier n'a pas de valeur en python - plutôt, demander une valeur donnerait une erreur de syntaxe. Je voudrais suivre le compte d'un sous-ensemble de types dans une boucle for en ligne. x++ ferait parfaitement l'affaire.
Bien sûr, on pourrait dire "Guido a simplement décidé ainsi", mais je pense que la question porte vraiment sur les raisons de cette décision. Je pense qu'il y a plusieurs raisons :
Je suis content que quelqu'un ait enfin mentionné l'aspect déclaration vs expression. En C, une affectation est une expression et donc l'opérateur ++ l'est également. En Python, une affectation est une déclaration, donc si il y avait un ++, il aurait probablement besoin d'être une déclaration d'affectation aussi (et encore moins utile ou nécessaire).
Cela a été simplement conçu de cette façon. Les opérateurs d'incrémentation et de décrémentation ne sont que des raccourcis pour x = x + 1
. Python a généralement adopté une stratégie de conception qui réduit le nombre de moyens alternatifs pour effectuer une opération. Affectation augmentée est la chose la plus proche des opérateurs d'incrémentation/décrémentation en Python, et ils n'ont même été ajoutés qu'à partir de Python 2.0.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Article connexe - Comportement des opérateurs d'incrémentation et de décrémentation en Python
0 votes
Car ils sont redondants
0 votes
Il existe comme 4 opérateurs différents ++ qui font tous la même chose. Oh et ils retirent maintenant le "++" de "C++", cela semble être une dégénérescence