Write Better Python Functions bitcoin price quote

J’ai vu des mauvais noms littéralement partout, mais cet exemple vient de Data Science (en réalité, Machine Learning), où ses praticiens écrivent généralement du code dans des cahiers Jupyter et essaient ensuite de transformer ces différentes cellules en un programme compréhensible.

Le premier problème avec le nom de cette fonction est son utilisation d’acronymes / abréviations. Préférez les mots anglais complets aux abréviations et aux acronymes non universellement connus. La seule raison pour laquelle on pourrait abréger des mots est de sauvegarder la frappe, mais chaque éditeur moderne a une saisie semi-automatique. Vous ne saisissez donc ce nom complet qu’une seule fois. Les abréviations sont un problème car elles sont souvent spécifiques à un domaine. Dans le code ci-dessus, knn fait référence à K-Nearest Neighbours et df à DataFrame, la structure de données omniprésente des pandas.


Si un autre programmeur ne connaissant pas ces acronymes lit le code, rien dans le nom ne lui sera compréhensible.

Il y a deux autres problèmes mineurs concernant le nom de cette fonction: le mot get est étranger. Pour la plupart des fonctions bien nommées, il sera clair que quelque chose est renvoyée par la fonction, et son nom le reflétera. Le bit from_df est également inutile. La docstring de la fonction ou l’annotation de type (si elle est située sur le bord) décrira le type du paramètre s’il n’est pas déjà précisé par le nom du paramètre.

defcalcul_et print_stats (list_of_numbers): sum = sum (list_of_numbers) mean = statistics. moyenne (liste_de_numéros) médiane = statistique. médiane (list_of_numbers) mode = statistiques. mode (list_of_numbers) print (‘—————– Stats —————–‘) print (‘SUM: { } ‘. format (somme) impression (‘ MOYEN: {} ‘. format (moyenne) impression (‘ MEDIAN: {} ‘. format (médiane) impression (‘ MODE: {} ‘. format (mode)

Cette fonction fait deux choses: elle calcule un ensemble de statistiques sur une liste de nombres et les imprime dans STDOUT. La fonction enfreint la règle selon laquelle il ne devrait y avoir qu’une seule raison pour changer de fonction. Il y a deux raisons évidentes pour lesquelles cette fonction devrait changer: des statistiques nouvelles ou différentes pourraient devoir être calculées ou le format de la sortie pourrait devoir être modifié. Cette fonction est meilleur écrit comme deux fonctions distinctes: une qui effectue et retourne les résultats des calculs et une autre qui prend ces résultats et les imprime. Un cadeau mort qu’une fonction a de multiples responsabilités est le mot et dans le les fonctions prénom.

Cette séparation permet également de tester beaucoup plus facilement le comportement de la fonction et permet également de séparer les deux parties non seulement en deux fonctions dans le même module, mais éventuellement de les héberger dans des modules différents, le cas échéant. Cela aussi conduit à des tests plus propres et à un entretien plus facile.

Trouver une fonction qui ne fait que deux choses est en fait rare. Beaucoup plus souvent, vous trouverez des fonctions qui font beaucoup, beaucoup plus de choses. mining bitcoin 2016 Encore une fois, pour des raisons de lisibilité et de testabilité, ces fonctions de touche-à-tout doivent être scindées en fonctions plus petites qui encapsulent chacune une seule unité de travail. Docstrings

Bien que tout le monde semble être au courant de PEP-8, définissant le guide de style de Python, beaucoup moins de personnes semblent être au courant de PEP-257, qui fait de même pour les docstrings. Plutôt que de simplement ressasser le contenu du PEP-257, n’hésitez pas à le lire à loisir. Les principaux plats à emporter sont toutefois:

C’est facile à cocher lors de l’écriture des fonctions. Prenez l’habitude de toujours écrire des docstrings et essayez de les écrire avant d’écrire le code de la fonction. Si vous ne pouvez pas écrire une docstring claire décrivant ce que la fonction va faire, c’est une bonne indication que vous devez réfléchir davantage à la raison pour laquelle vous écrivez la fonction. Valeurs de retour

Les fonctions peuvent (et devraient) être considérées comme de petits programmes autonomes. Ils prennent des entrées sous forme de paramètres et retournent des résultats. Les paramètres sont bien sûr optionnels. Les valeurs renvoyées ne sont toutefois pas facultatives, du point de vue des composants internes à Python. Même si vous essayez de créer une fonction qui ne renvoie pas de valeur, vous ne pouvez pas. Si une fonction ne renvoie pas par ailleurs une valeur, le Python l’interprète l’oblige à renvoyer Aucun. Ne me crois pas? Testez vous-même les éléments suivants:

Deux points, ici. Tout d’abord, faites de votre mieux pour éviter cette pratique. Pour d’autres, fournir quelque chose comme argument à votre fonction uniquement pour constater qu’elle a été modifiée peut être surprenant dans le meilleur des cas et carrément dangereux dans le pire des cas. Tout comme les méthodes de chaîne, préférez renvoyer une nouvelle instance du paramètre avec les modifications qui lui sont appliquées. Même lorsque cela n’est pas réalisable, car la copie d’un paramètre est extrêmement coûteuse, vous pouvez toujours revenir à l’ancien retour True si l’opération suggérée a abouti. Acceptez Bitcoin paiements dont j’ai besoin pour renvoyer plusieurs valeurs. Je ne pourrais pas renvoyer une valeur unique qui aurait du sens.

Et l’argument le plus convaincant pour toujours renvoyer une valeur utile est peut-être que les appelants sont toujours libres de les ignorer. En bref, renvoyer un valeur d’une fonction est presque certainement une bonne idée et très peu susceptible de casser quoi que ce soit, même dans les bases de code existantes. Longueur de la fonction

J’ai dit à plusieurs reprises que je suis assez stupide. Je ne peux garder que 3 choses dans la tête à la fois. Si vous me faites lire une fonction à 200 lignes et demandez ce qu’elle fait, mes yeux risquent de s’émousser au bout de 10 secondes environ. La longueur d’une fonction affecte directement la lisibilité et donc la maintenabilité. Alors gardez vos fonctions courtes. 50 lignes est un nombre totalement arbitraire qui me paraissait raisonnable. La plupart des fonctions que vous écrivez seront (espérons-le) plus courtes.

Si une fonction suit le principe de responsabilité unique, elle sera probablement assez courte. Si c’est pur ou idempotent (discuté ci-dessous), il est également probable qu’il soit court. Ces idées fonctionnent toutes ensemble pour produire un code propre et de qualité.

Alors, que faites-vous si une fonction est trop longue? RÉFACTEUR! Le refactoring est quelque chose que vous faites probablement tout le temps, même si le terme ne vous est pas familier. Cela signifie simplement changer la structure d’un programme sans changer son comportement. Donc extraire quelques lignes de code d’une longue fonction et les transformer en une fonction à part entière est un type de refactoring. C’est aussi le moyen le plus rapide et le plus courant de raccourcir une longue fonction de manière productive. Et puisque vous donnez à toutes ces nouvelles fonctions des noms appropriés, le code résultant se lit beaucoup plus facilement. Je pourrais écrire un livre entier sur la refactorisation (en fait, cela a été fait de nombreuses fois) et je n’entrerai pas dans les détails ici. Sachez simplement que si vous avez une fonction trop longue, la solution consiste à la refactoriser. Idempotence et pureté fonctionnelle

Le titre de cette sous-section peut paraître un peu intimidant, mais les concepts sont simples. Une fonction idempotent renvoie toujours la même valeur avec le même jeu d’arguments, quel que soit le nombre d’appels. bitcoin actuel blockchain size Le résultat ne dépend pas des variables non locales, de la mutabilité des arguments ou des données provenant des flux d’E / S. La fonction add_three (number) suivante est idempotent:

Cet exemple, certes artificiel, n’est pas idempotent car la valeur de retour de la fonction dépend de l’entrée / sortie, à savoir du nombre saisi par l’utilisateur. Ce n’est évidemment pas vrai que chaque appel à add_three () retournera la même valeur. S’il est appelé deux fois, l’utilisateur peut entrer 3 la première fois et 7 la seconde, en appelant add_three () retourne 6 et 10, respectivement.

Un exemple concret d’idempotency consiste à appuyer sur le bouton haut situé devant un ascenseur. La première fois que vous appuyez, l’ascenseur est averti que vous souhaitez monter. Puisque le fait d’appuyer sur le bouton est idempotent, il est inoffensif d’appuyer dessus à plusieurs reprises. Le résultat est toujours le même. Pourquoi l’idempotency est-il important?

Testabilité et maintenabilité. Les fonctions idempotentes sont faciles à tester car elles ont la garantie de toujours renvoyer le même résultat lorsqu’elles sont appelées avec les mêmes arguments. Le test consiste simplement à vérifier que la valeur renvoyée par différents appels à la une fonction renvoie la valeur attendue. De plus, ces tests seront rapides, un problème important et souvent négligé dans les tests unitaires. Et la refactorisation lors de l’utilisation de fonctions idempotentes est un jeu d’enfant. Quelle que soit la façon dont vous modifiez votre code en dehors de la fonction, le résultat de l’appel avec les mêmes arguments sera toujours le même. application Bitcoin en Inde Qu’est-ce qu’une fonction pure?

En programmation fonctionnelle, une fonction est considérée comme pure si elle est idempotente et n’a aucun effet secondaire observable. N’oubliez pas qu’une fonction est idempotent si elle retourne toujours la même valeur pour un ensemble d’arguments donné. Aucun élément externe à la fonction ne peut être utilisé pour calculer cette valeur. Cependant, cela ne signifie pas que la fonction ne peut pas affecter des choses telles que les variables non locales ou les flux d’E / S. Par exemple, si la version idempotente de add_three (nombre) ci-dessus imprimait le résultat avant de le renvoyer, elle est toujours considérée comme idempotente car l’accès à un flux d’E / S n’avait aucun impact sur la valeur renvoyée par la fonction. L’appel à print () est simplement un effet secondaire: une interaction avec le reste du programme ou le système lui-même, à part le retour d’une valeur.

add_three_calls = 0 def add_three (number): Retourne * numéro * + 3. global add_three_calls print (f ‘Renvoie {number + 3}’) add_three_calls + = 1 retourne le numéro + 3 def num_calls (): renvoie le nombre de fois * add_three * a été appelé. retourne add_three_calls

Une fonction pure n’a pas d’effets secondaires. Non seulement il n’utilise aucune donnée extérieure pour calculer sa valeur, mais il n’a pas d’interaction avec le reste du système / programme autre que le calcul et la restitution de cette valeur. Ainsi, bien que notre nouvelle définition add_three (number) soit toujours idempotente, elle n’est plus pure.

En bref, ils sont incapables de ce que Einstein a appelé une action fantasmagorique à distance (dans un contexte informatique). Ils ne modifient en aucune manière le reste du programme ou du système. En programmation impérative (comme vous le faites lorsque vous écrivez du code Python), ce sont les fonctions les plus sûres. Ils sont éminemment testables et maintenables et, plus encore que de simples fonctions idempotentes, il est garanti que leur test sera aussi rapide que leur exécution. Et le (s) test (s) lui-même est simple: il n’existe aucune connexion à une base de données ou autre ressource externe à simuler, pas de configuration. code requis, et rien à nettoyer après.

Pour être clair, idempotency et la pureté sont aspirational, pas requis. Autrement dit, nous aimerions écrire uniquement des fonctions pures ou idempotentes à cause des avantages mentionnés, mais ce n’est pas toujours possible. La clé, cependant, est que nous commençons naturellement à organiser notre code pour isoler les effets secondaires et les dépendances externes. Cela a pour effet de rendre chaque ligne de code que nous écrivons plus facile à tester, même si nous n’écrivons pas toujours des fonctions pures ou idempotentes. Résumer

Alors c’est tout. Le secret pour écrire de bonnes fonctions n’est pas un secret du tout. Cela implique simplement de suivre un certain nombre de meilleures pratiques et règles empiriques établies. J’espère que vous avez trouvé cet article utile. Allez maintenant et parlez-en à vos amis! Nous sommes tous d’accord pour juste toujours écrire excellent code dans tous les cas :). Ou du moins, faisons de notre mieux pour ne pas mettre plus de mauvais code au monde. compte à rebours à la fourche bitcoin, je serais capable de vivre avec ça … Posté le 11 octobre 2018 par Jeff Knupp