Dix minutes pour apprendre comment fonctionnel Python?

Programmation fonctionnelle à la fin est quoi? Cet article explique le concept, tout partage comment utiliser la programmation fonctionnelle en Python. Le contenu principal comprennent une liste de formule analytique et d'autres formes de formule d'analyse.

Modèle fonctionnel

Dans un modèle impératif, le mode d'exécution du programme est une série d'instructions à l'ordinateur pour faire exécuter. processus de mise en uvre va changer l'état de l'ordinateur. Par exemple, une telle valeur initiale de A est 5, la valeur de A est modifiée. A est une variable, la valeur variable changera, ce qui signifie qu'il contient.

Dans un mode de fonctionnement, vous ne avez pas besoin de dire à l'ordinateur ce qu'il faut faire, mais de dire quel ordinateur Oui. Quel est le plus grand nombre de diviseur commun tels que le produit de 1 à n, etc. Qu'est-ce que

Par conséquent, la variable ne peut être modifiée. Une fois que les variables sont définies, ils gardent toujours la même valeur (notez que pures langages fonctionnels, ils ne sont pas appelés variables). Ainsi, dans le modèle fonctionnel, la fonction n'a pas d'effets secondaires. Effet secondaire est une fonction du monde en dehors de la fonction d'apporter des modifications. Jetez un oeil à la pièce suivante d'exemples de code Python:

a = 3 def some_func (): une approche globale a = 5 some_func () print (a)

5 est le code de sortie. Dans le modèle fonctionnel, la variation de la valeur de la variable n'est pas autorisé du tout, de sorte que la fonction affecte le monde en dehors de la fonction n'est pas autorisée. Les fonctions peuvent faire est de faire des calculs et retourne une valeur.

Vous pourriez penser: « il n'y a pas de variables et pas d'effets secondaires il bon ?? » Bonne question.

Si la fonction est appelée deux fois en utilisant les mêmes paramètres, nous pouvons garantir qu'il sera de retour les mêmes résultats. Si vous avez étudié les fonctions mathématiques, vous savez certainement qu'il est bon. On appelle cela la transparence référentielle (transparence référentiel). Étant donné que la fonction n'a pas d'effets secondaires, nous pouvons accélérer le programme à quelque chose calculate. Par exemple, si le programme connaît func (2) renvoie 3, vous pouvez enregistrer cette valeur dans la table, de sorte que vous n'avez pas besoin de répéter la course que nous connaissons déjà le résultat de la fonction.

En règle générale, le cycle de programmation fonctionnelle n'est pas utilisé, mais l'utilisation de la récursivité. Récursion est un concept mathématique, signifie généralement « à la suite de leur entrée. » fonction récursive, la fonction peut appeler à plusieurs reprises leur propre. Ce qui suit est un exemple d'utilisation des définitions de fonction récursive python:

def factorial_recursive (n): # Cas de base :! 1 = 1 si n == 1: return 1 # Récursive cas: n = n * (n-1) !! autre: retourner n * factorial_recursive (n-1)

langage de programmation fonctionnelle est paresseux. Lazy moyenne, à moins que la dernière minute, sinon ils ne seront pas effectuer des calculs ou quoi que ce soit. Si le code nécessaire pour calculer 2 + 2, le programme fonctionnel ne sera utilisé pour calculer en temps réel les résultats de calcul. Nous allons introduire cela dans la paresse Python.

cartographie

Pour comprendre les cartes (carte), vous devez d'abord comprendre ce qui est itérable. Iterables (itérables) fait référence à tout ce qui peut être itérative. Habituellement, une liste ou un tableau, mais il y a beaucoup d'autres itérations objets Python. Même les objets sur mesure, en mettant en uvre des méthodes magiques spécifiques afin qu'il devienne iterables. Comme API méthode magique, faire l'objet de plus de style Python. Laissez l'objet devient iterables, besoin magique pour mettre en uvre les deux méthodes suivantes:

classe Counter: def __init __ (self, basse, haute): # Définir attributs de classe dans la méthode magique __init__ # Pour "inistalise" self.current = Bas self.high = Haut def __iter __ (self): # Première méthode magique pour faire ce itérables objet retour auto def __next __ (self): # Deuxième méthode magique si self.current >  self.high: augmentation StopIteration autre: self.current + = 1 retour self.current - 1

La première méthode magique « de __iter __ » (double de iter underscore) retourne l'itérateur, généralement appelé lorsque le cycle commence. __next__ prochaine itération de l'objet est retourné.

Ouvrez une ligne de commande peut essayer le code suivant:

pour c dans Counter (3, 8): print (c)

Cette sortie volonté de code:

34 56 78

En Python, l'itérateur est seul objet qui implémente la méthode de __iter__ magique. Autrement dit, vous pouvez accéder à l'emplacement de l'objet sont inclus, mais ne peut pas traverser tout l'objet. Certains objets magiques outils __next__ méthodes, mais ne sont pas rendus compte __iter__ méthodes magiques, telles que la collecte (voir plus loin dans cet article). Dans cet article, nous supposons que l'objet de tous les objets impliqués sont itérables.

Maintenant que nous savons ce que l'objet est itératif, revenez à la prochaine fonction de mappage. La cartographie peut être réalisée sur la fonction spécifiée iterables chaque élément. En règle générale, nous effectuons la fonction de chaque élément dans la liste, mais vous savez que vous pouvez réellement utiliser le mappage pour la grande majorité des objets itératives.

Carte (fonction, iterable)

Supposons que vous ayez une liste des numéros suivants:

Nous espérons obtenir la place de chaque numéro, le code peut être écrit comme ceci:

x = def carré (num): retour num num * imprimer (liste (carte (carré, x)))

Python est une fonction de la fonctionnelle paresseuse. Si nous n'ajoutons pas « la liste () », la fonction ne sauvegarde iterables vers le bas, et ne sauvera pas la liste des résultats. Nous devons dire explicitement Python « pour le convertir en une liste » pour obtenir des résultats.

Une fois que jamais la fonction d'évaluation paresseux pour convertir en fonction Python semble peu adapté paresseux. Mais si vous utilisez la pensée fonctionnelle plutôt que de manière procédurale de la pensée, elle finira par s'adapter.

Le « carré (num) » vraiment bon, mais toujours senti un mal de peu. Est-ce qu'une seule fois pour pouvoir utiliser la carte, vous devez définir l'ensemble de la fonction? En fait, nous pouvons utiliser une fonction lambda (fonction anonyme).

Les expressions lambda

Les expressions lambda est seulement une fonction de la ligne. Par exemple, l'expression lambda suivant peut être obtenu au carré du nombre donné:

carré = lambda x: x * x

Exécutez le code suivant:

> > >  carré (3) 9

Vous devez demander: « Où est exactement ce paramètre au sens de ce que la fonction ne ressemble pas ah ??? »

Ah, il est en effet pas facile à comprendre ...... mais devrait encore être en mesure de comprendre. Nous mettons quelque chose au-dessus de code attribué à la variable « carré ». Il est cette chose:

lambda x:

Il dit Python Ceci est une fonction lambda, le nom est entré pour x. Tout après les deux points est l'entrée de l'opération, il retourne automatiquement le résultat de l'opération.

Nous le code peut être simplifiée mise au carré en une seule ligne:

x = impression (liste (carte (lambda num: num num *, x)))

Avec l'expression lambda, tous les paramètres sont à gauche, les opérations sont à droite. Bien qu'il semble un peu désordonné, mais vous ne pouvez pas nier son rôle. Peut effectivement écrire du code seulement connaître les gens de programmation fonctionnelle peut le lire ou un peu d'excitation. Et la fonction devient une ligne est très cool.

induction

Induction (réduction) est une fonction, il a mis un objet d'itération devient une chose. En règle générale, on calcule sur la liste, la liste seront regroupées en un certain nombre. code de longueur inductive ressemble à ceci:

réduire (fonction, liste)

Les fonctions ci-dessus peuvent utiliser des expressions lambda.

La liste des produits est de mettre tous les chiffres multipliés ensemble. Vous pouvez écrire du code comme ceci:

product = 1 x = pour num en x: product = produit * num

Cependant, l'utilisation de l'induction, peut être écrit comme ceci:

de réduire functools importer product = réduire ((lambda x, y: x * y), )

Cela obtenir le même résultat. Ce code est plus court, mais aussi au moyen de la programmation fonctionnelle, code plus concis.

filtration

fonction filtré (filtre) reçoit un objet d'itération est ensuite filtré tout objet de choses inutiles.

Typiquement, une fonction de filtrage et une liste de réception. Il remplit la fonction de chaque élément dans la liste, si la fonction retourne True, ne rien faire. Si la fonction retourne Faux, pour supprimer cet élément de la liste.

La syntaxe est la suivante:

filtre (fonction, liste)

Le regard Let un exemple simple. Aucun filtre, le code doit être écrit comme ceci:

x = distance (-5, 5) new_list = pour num en x: si num <  0: new_list.append (num)

L'utilisation de ces filtres peut être écrit:

x = distance (-5, 5) all_less_than_zero = liste (filtre (lambda num: num <  0, x))

Fonctions d'ordre supérieur

Supérieur fonction de commande reçoit en fonction de l'argument, un autre fonction retourne. Un exemple très simple est illustré ci-dessous:

sommation def (nums): somme de retour (nums) l'action def (func, numéros): func de retour (nombre) imprimer (Action (sommation, )) # 6 est sortie

Ou plus simplement des exemples de la fonction « de retour »:

def rtnBrandon (): retour « brandon » def rtnJohn (): retour « john » def rtnPerson (): age = int (entrée ( "Quel est votre âge?")) si l'âge == 21: retour rtnBrandon () autre: retour rtnJohn ()

Se souvenir je l'ai dit les variables de langage de programmation fonctionnelle ne le font pas? En fait, les fonctions d'ordre supérieur peuvent facilement le faire. Si vous avez seulement besoin de transférer des données dans une série de fonctions, alors vous n'avez pas besoin d'enregistrer les données à une variable.

Toutes les fonctions en Python sont des objets de niveau supérieur. objet de niveau supérieur est d'avoir un ou plusieurs des objets suivants:

  • Généré lors de l'exécution
  • Affecté aux variables en une structure de données ou d'éléments
  • Transmis à la fonction d'argument
  • En raison de la fonction retourne

Ainsi, toutes les fonctions sont des objets en Python, il peut être utilisé comme fonctions d'ordre supérieur.

fonction partielle

Une partie de la fonction un peu difficile à comprendre, mais très cool. Grâce à elle, vous n'avez pas besoin de fournir un argument complet peut appeler la fonction. Nous regardons un exemple. Nous voulons créer une fonction qui accepte deux paramètres, on est la fin, l'autre est l'indice, puis revenir au bas de l'indice de puissance, comme suit:

puissance def (base, exposant): retour exposant ** de base

Maintenant, nous avons besoin d'une fonction au carré, vous pouvez écrire:

def carré (base): puissance de retour (base 2)

Ce code est pas de problème, mais si vous avez besoin d'une fonction cubique comment faire? Ou quatrième fonction de la puissance? Il ne dois avoir défini une nouvelle fonction? Pour cela aussi, mais toujours les programmeurs paresseux. Si vous répétez souvent une chose, cela signifie qu'il doit y avoir un moyen d'augmenter la duplication de vitesse et éviter. Nous pouvons utiliser certaines fonctions pour y parvenir. Voici un exemple en utilisant la fonction d'élévation au carré partiel:

à partir functools importation partielle carré = partielle (puissance, exposant = 2) impression (carré (2)) # 4 est sortie

Ce n'est pas amer? Nous avons dû dire Python le second argument, il devrait fournir un argument peut appeler nécessite deux paramètres de la fonction.

Vous pouvez également être utilisé pour générer une boucle jusqu'à ce que toutes les fonctions 1000 peuvent calculer la puissance.

à partir functools importation partielle puissances = pour x dans la plage (2, 1001): powers.append (partiel (puissance, exposant = x)) impression (pouvoirs (3)) # 9 est sortie

La programmation fonctionnelle ne suffit pas Python

Vous avez peut-être remarqué, nous ici beaucoup de programmation fonctionnelle ont utilisé la liste. En plus de l'induction et une partie de la fonction, toutes les autres fonctions pour générer une liste. Guido (inventeur Python) ne aime pas utiliser les choses fonctionnelles en Python, parce que Python a ses propres méthodes pour générer la liste.

Frappez « importer ce » en Python IDLE, vous pouvez voir les éléments suivants:

> > >  importer cette Le Zen de Python, par Tim Peters Belle est mieux que laid. Explicite est mieux que implicite. Simple est mieux que complexe. Complexe est mieux que compliqué. Flat est mieux que imbriquée. Sparse est mieux que dense. compte. Lisibilité Cas particuliers ne sont pas assez spéciale pour briser les règles. Bien que la pureté des battements de pratique. Les erreurs ne doivent jamais passer sous silence. À moins explicitement réduits au silence. Face à l'ambiguïté, refuser la tentation de deviner. Il devrait y avoir un - et de préférence une seule - façon évidente de le faire. Bien que cette façon peut-être pas évident au premier sauf si vous êtes néerlandais. Il est maintenant mieux que jamais. Bien que jamais est souvent mieux que * * droit maintenant. Si la mise en uvre est difficile à expliquer, il est une mauvaise idée. Si la mise en uvre est facile à expliquer, il peut être une bonne idée. Espaces de noms sont une excellente idée klaxonnent - nous allons faire plus de ceux-là!

C'est le Zen de Python. Ce poème montre que ce qu'on appelle le style Python. Il faut souligner que cette phrase:

Il devrait y avoir un - et de préférence une seule - façon évidente de le faire.

(Tout doit avoir un et un seul moyen de résoudre.)

En Python, la cartographie et le filtrage peuvent faire des choses, peut-on faire une liste de formule analytique (décrite plus loin). Ce rompit le Zen de Python, donc nous disons que la programmation fonctionnelle ne fait pas partie du « Python ».

Une autre chose est souvent mentionné lambda. En Python, lambda fonction est une fonction normale. syntaxe lambda est simplement le sucre. Les deux sont équivalentes:

foo = lambda a: 2 def foo (a): retour 2

La fonction normale peut tout faire lambda peut faire des choses, mais l'inverse est pas vrai. lambda ne peut pas tout faire une fonction normale peut être accompli.

A propos de pourquoi la programmation fonctionnelle ne convient pas à l'écosystème Python il y avait eu une discussion. Vous avez peut-être remarqué que je l'ai mentionné auparavant, une liste de formule analytique, nous avons une liste de ce qui est d'introduire la formule analytique.

Liste formule analytique

Je l'ai dit, tout peut compléter la cartographie ou de filtrage peut être fait avec une liste de formule analytique. Voilà ce que nous voulons apprendre.

Liste Python style de compréhension est de générer une liste de façons. La syntaxe est la suivante:

Pour trouver la place de chaque numéro dans la liste, vous pouvez écrire:

imprimer ( )

Vous pouvez le voir, nous avons à la liste chaque élément de l'application d'une fonction. Alors, comment pouvons-nous y parvenir filtré? look Let le code avant:

x = distance (-5, 5) all_less_than_zero = liste (filtre (lambda num: num <  0, x)) imprimer (all_less_than_zero)

Il peut être converti en la manière suivante en utilisant ce type de liste analysable:

x = distance (-5, 5) all_less_than_zero =

À ce titre, la liste de soutien d'expression analytique instruction if. Ceci élimine le besoin d'écrire un tas de fonctions pour atteindre. En fait, si vous avez besoin de générer une sorte de liste, la liste est susceptible d'utiliser la formule analytique plus pratique et simple.

Si vous voulez trouver tous les numéros carrés inférieur à zéro, il? Utilisez Lambda, la cartographie et le filtrage peut être écrit:

x = distance (-5, 5) all_less_than_zero = liste (carte (lambda num: num num *, liste (filtre (lambda num: num <  0, x))))

Il semble très long et un peu compliqué. Tout simplement écrit dans la liste de formule analytique:

x = distance (-5, 5) all_less_than_zero =

Mais la liste de formule d'analyse ne fonctionne que sur les listes. La cartographie et le filtrage peuvent être utilisés pour tous iterables. Alors, pourquoi utiliser un type de compréhension de la liste il? En fait, la formule analytique peut être utilisé sur tout objet peut être itérative.

Autre expression analytique

formule analytique peut être utilisé sur un objet d'itération.

Tout objet peut être généré à l'aide d'une formule analytique itérative. A partir de Python 2.7, vous pouvez même générer un dictionnaire (table de hachage) avec la formule analytique.

# Extrait de la page 70 chapitre 3 du Courant Python par Luciano Ramalho DIAL_CODES = > > >  country_code = {pays: code code, pays DIAL_CODES} > > >  country_code { 'Brésil': 55, 'Indonésie': 62, 'Pakistan': 92, 'Russie': 7, 'Chine': 86, 'États-Unis': 1, Japon ': 81, 'Inde': 91, 'Nigeria': 234, Bangladesh ': 880} > > >  {Code: country.upper () pour le pays, le code dans country_code.items () si le code <  66} {1: 'ÉTATS-UNIS', 7: 'Russie', 62: 'Indonésie', 55: Brésil '}

Tant que l'objet est itérative, en utilisant l'expression analytique peut être générée. look Let un exemple d'une collection. Si vous ne savez pas ce que l'ensemble est, vous pouvez lire cet article (https://medium.com/brandons-computer-science-notes/a-primer-on-set-theory-746cd0b13d13). Il est tout simplement:

  • Est une collection d'éléments de la liste, mais la liste ne reprend pas les éléments
  • Ordre des éléments n'a pas d'importance
# Extrait de la page 87, chapitre 3 du Courant Python par Luciano Ramalho > > >  du nom d'importation unicodedata > > >  {Chr (i) pour i dans la plage (32, 256) si 'signe' dans le nom (chr (i), '')} { '×', '¥', '°', '£', '©', '#', '¬', '%', '', ' > '' ¤ '' ± '' ¶ '' § '' < '' = '' ® '' $ '' ÷ '' ¢ '' + « }

Vous pouvez le voir, le même ensemble d'accolades utiliser un dictionnaire. Python est très intelligent. Il vérifie si vous fournissez une valeur ajoutée accolades, pour déterminer le type ou le dictionnaire est une collection de formule d'analyse analytique. Si vous voulez en savoir plus sur la formule d'analyse, vous pouvez consulter ce guide visuel ( Si vous voulez en savoir plus sur la formule d'analyse et de générateurs, vous pouvez lire cet article (https://medium.freecodecamp.org/python-list-comprehensions-vs-generator-expressions-cef70ccb49db).

conclusion

La programmation fonctionnelle est très beau, très pur. Code fonctionnel peut être écrit dans un très propre, mais peut être écrit dans un désordre. Certains programmeurs Python ne aiment pas utiliser des modèles fonctionnels en Python, mais nous pouvons en fonction de leurs préférences, souvenez-vous d'utiliser le meilleur outil pour le travail.

Original: https: //hackernoon.com/learn-functional-python-in-10-minutes-to-2d1651dece6f

Auteur: Brandon Skerritt, étudiant en informatique à l'Université de Liverpool, et Hackernoon PoliticsMeansPolitics des journalistes.

Traducteur: ménisque, éditeur: Tu Min

Qingdao Construction « deux action » campagne de deux ans à un traitement spécial maux en trois étapes
Précédent
2019 table de bureau de recrutement de la fonction publique Qingdao cuit! Recruter 308 personnes! 22 Début de l'enregistrement!
Prochain
Le roi sera obligé de rester à la gloire de faire les choses! Vous ne l'avez pas fait?
programmeur diplômé avec cinq quarts du statu quo: il était un million par an, certaines personnes salaire mensuel de dix mille
Quel genre de chefs de projet programmeurs favori?
Nouvel An doit être belle à nouveau! Série 580 paysages de luxe CVT!
Analyse avec Python « ciel brisé » pour analyser si elle était un mauvais film, sans aucun doute, perle de la mer?
voiture Mention pour six mois, je parle simplement de cela à la puissance d'un petit partenaire, des paysages 580
Une ligne de code pour obtenir un nombre entier binaire 1 dans la détermination continue!
Wang après la société cotée aux États-Unis: toss les quatorze ans d'histoire de l'entreprise
Aidez-moi à combattre un autre jour! Ce furent des années merveilleuses retirées des cafés Internet
Maître de l'Université de Beijing des Postes et Télécommunications, avant ingénieur Baidu: les fabricants peuvent être loués, ne serait pas un diplômé!
voiture Inconsciemment sept mois, la part de la voiture verte Jeep Liberty sensation Man
BAT a dominé applet territoire, maintenant les gros titres du peuple aujourd'hui sauvé? | Chatteris