Utilisez-vous Python principalement pour ses fonctionnelles ou des fonctionnalités orientées objet?
Je vois ce qui ressemble à une majorité de développeurs Python sur StackOverflow approuvant l'utilisation de concise des outils fonctionnels comme des lambdas, des cartes, des filtres, etc., tandis que d'autres affirment que leur code est plus clair et plus facile à gérer par ne pas les utiliser. Quelle est votre préférence?
Aussi, si vous êtes un die-hard programmeur fonctionnel ou hardcore dans OO, ce que d'autres pratiques de programmation spécifiques utilisez-vous que vous pensez sont les mieux à votre style?
Merci d'avance pour vos avis!
- Je l'utilise pour rapide et sale de script. Alors... impératif/questions de procédure.
Vous devez vous connecter pour publier un commentaire.
J'utilise principalement Python à l'aide procédurale et orientée objet les styles. Python est en fait pas particulièrement bien adapté à la programmation fonctionnelle.
Beaucoup de gens pensent qu'ils sont l'écriture fonctionnelle code Python en utilisant beaucoup de
lambda
,map
,filter
, etreduce
, mais c'est un peu simplifié. La fonction caractéristique de la programmation fonctionnelle est un manque de l'etat ou des effets secondaires. Les éléments importants d'un style fonctionnel sont les fonctions pures, d'algorithmes récursifs, et la première classe de fonctions.Voici mes réflexions sur la programmation fonctionnelle et Python:
Fonctions pures sont grands. Je fais de mon mieux pour faire mon module-fonctions de niveau pur.
De la classe de base de la programmation pure. Si vous souhaitez un équivalent de pures fonctions à l'aide de classes Python (qui est parfois, mais pas toujours ce que vous voulez),
N'essayez pas d'éviter l'état de tous ensemble. Ce n'est pas une stratégie raisonnable en Python. Par exemple, l'utilisation
some_list.append(foo)
plutôt quenew_list = some_list + [foo]
, l'ancien qui est plus idiomatique et efficace. (En effet, une tonne de "fonctionnelle" des solutions, je vois des gens utiliser en Python sont algorithmiquement sous-optimale par rapport à la juste-comme-simple ou le plus simple des solutions qui ne fonctionnent pas ou sont tout aussi fonctionnelles, mais ne pas utiliser de la fonctionnelle-outils de recherche.)Apprendre les meilleures leçons de la programmation fonctionnelle, par exemple mutable état est dangereux. Demandez-vous, Dois-je vraiment envie de changer ce X ou dois-je veux une nouvelle X?
Vraiment un lieu commun c'est lors du traitement d'une liste. Je voudrais utiliser
plutôt que
et des trucs comme ça. Cela évite la confusion des bugs où le même objet de la liste est stockée ailleurs et ne devrait pas être modifié. (Si il devrait être changé, alors il ya une bonne chance que vous avez une erreur de conception. La mutation de certains de la liste que vous avez fait référence à de multiples endroits, n'est-ce pas un excellent moyen de partager l'état.)
Ne pas utiliser
map
et amis gratuitement. Rien n'est plus fonctionnel à ce sujet.map
/filter
sont pas plus fonctionnelle que les interprétations de la liste. Interprétations de la liste ont été empruntés à Haskell, un langage purement fonctionnel.map
et surtoutfilter
peut être plus difficile à comprendre qu'une compréhension de liste. Je n'aurais jamais utilisermap
oufilter
avec un lambda, mais si j'avais une fonction qui existait déjà; je l'utilisemap
un peu décent.itertools.imap
/ifilter
par rapport à générateur d'expressions. (Ces choses sont un peu paresseux, qui est quelque chose de grand, nous pouvons emprunter à partir de la fonctionnelle de monde.)map
etfilter
les effets secondaires. Je vois cela avecmap
beaucoup de choses, qui à la fois rend difficiles à comprendre le code, inutile de listes, et est décidément pas fonctionnel (malgré que les gens en pensant qu'il doit être à cause demap
.) Il suffit d'utiliser une boucle for.reduce
est source de confusion, sauf pour des cas très simples. Python a pour les boucles et il n'y a pas de mal à les utiliser.De ne pas utiliser des algorithmes récursifs. C'est une partie de la programmation fonctionnelle, Python juste ne supporte pas bien. Disponible (et je pense que tous les autres Pythons) ne prennent pas en charge la queue d'appel d'optimisation. Utilisation de l'itération de la place.
Utiliser uniquement
lambda
lors de la définition des fonctions à la volée. Les fonctions anonymes ne sont pas mieux que les fonctions nommées, ces dernières sont souvent plus robuste, facile à entretenir, et documentés.Je utiliser les fonctions de la langue que le travail soit fait avec la plus courte, la plus propre de code possible. Si cela signifie que je dois mélanger les deux, ce que je fais assez souvent, alors que c'est ce qui est fait.
Je suis un die-hard de la programmation orientée objet et programmeur fonctionnel et ces styles fonctionnent très bien ensemble, principalement parce qu'ils sont complètement orthogonaux. Il y a beaucoup d'orienté objet, les langages fonctionnels et Python est l'un d'entre eux.
Donc, fondamentalement, la décomposition d'une application en classes est très utile lors de la conception d'un système. Quand vous faites la mise en œuvre effective, FP permet d'écrire du code correct.
Aussi je trouve très choquant que vous le laissez entendre que la programmation fonctionnelle signifie simplement "utiliser des plis partout". C'est probablement le plus grand et le pire malentendu à propos de FP. Beaucoup a été écrit au sujet, donc je vais juste dire que la grande chose au sujet de FP est l'idée de combiner simple (,de rectification et réutilisable) de fonctions de nouveau, de plus en plus complexe de la fonction. De cette façon, il est assez difficile d'écrire "presque correct" code - soit toute la chose est exactement ce que vous voulez, ou elle rompt totalement.
FP en Python pour la plupart tourne autour de l'écriture de générateurs et de leurs proches (interprétations de la liste) et les choses dans le
itertools
module. Explicite map/filter/réduire le nombre d'appels sont juste inutiles.Python a que peu de programmation fonctionnelle dispose donc je serais surpris si beaucoup de gens l'utilisent surtout pour qui. Par exemple, il n'existe pas de méthode standard pour faire fonction de la composition et de la bibliothèque standard du
reduce()
a été dépréciée en faveur de l'explicite boucles.Aussi, je ne pense pas que
map()
oufilter()
sont généralement approuvé. En face, généralement interprétations de la liste semblent être privilégiées.map
etfilter
.namedtuple
vous obtient assez proche pour être capable d'écrire pur-fonctionnelle des trucs facilement.La plupart des réponses sur StackOverflow sont courts, concis des réponses, et les aspects fonctionnels de python écrire ce genre de réponses faciles.
Python OO-caractéristiques ne sont tout simplement pas nécessaires dans 10-20 ligne de réponses, de sorte que vous ne les voyez pas ici autant.
Je sélectionne Python quand je suis sur un problème que les cartes à un OO solution. Python ne fournit qu'une capacité limitée de programme de manière fonctionnelle par rapport à la pleine soufflé langages fonctionnels.
Si je veux vraiment de la programmation fonctionnelle, j'utilise le langage Lisp.