Bonjour !
J'ai arrêté la programmation depuis un bon moment (2-3 ans)et je m'y remet puisque je fais des études en informatique.
J'avais à l'époque touché pas mal à Python et je l'appréciais bien, mais maintenant que j'y retouche il y a quelque chose qui me titille avec le fait que les méthodes de la classe list
modifient directement l'objet et retourne None
.
Prenons un exemple :
Je veux mettre les mots d'une phrase dans une liste et ensuite les inverser (bon, exemple bidon me direz-vous puisqu'on peut faire ça directement avec le string, mais ce n'est qu'un exemple).
En Python, impossible d'y aller simplement avec une simple ligne, obligé d'y aller en plusieurs étapes :
1 2 3 4 | def foo(): r = "Euston saw I was not Sue".split() r.reverse() return r |
Ou alors, si on ne veut pas utiliser reverse, il faut sortir des méthodes de la classe list et y aller avec le slicing ([::-1]
), là où en Ruby par exemple (pour comparer des pommes avec des pommes) on peut facilement faire tenir le tout sur une ligne :
1 2 3 | def foo() return "Euston saw I was not Sue".split().reverse() end |
Même chose si on prend un autre exemple : on a une liste d'éléments (par exemple [1,3,2,5,4]
) et on veut trier cette liste et assigner cette liste triée à b
sans modifier la liste d'origine. Avec ruby, rien de bien compliquer :
1 2 | a = [1,3,2,5,4] b = a.sort() |
Par contre, encore une fois avec Python impossible d'y aller avec les méthodes de la classe list, on doit sortir de la classe et utiliser la fonction builtin sorted
1 2 | a = [1,3,2,5,4] b = sorted(a) |
J'avoue que j'ai bien du mal à comprendre le pourquoi de cette conception. Qu'en pensez-vous ? Des choses sous-jacentes que je ne comprends pas ? Un choix comme un autre ? Je mets le doigt sur quelque chose qui revient souvent ? Je suis stupide et tout le monde est à l'aise avec cette façon de faire ?
PS: je ne fais pas de Ruby et je n'aime pas particulièrement ce langage, j'ai seulement pris le premier langage comparable qui m'est passé sous la main.