filter
,, map
et reduce
fonctionne parfaitement en Python 2. Voici un exemple:
>>> def f(x):
return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x):
return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x,y):
return x+y
>>> reduce(add, range(1, 11))
55
Mais en Python 3, je reçois les sorties suivantes:
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>
>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>
>>> reduce(add, range(1, 11))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
reduce(add, range(1, 11))
NameError: name 'reduce' is not defined
J'apprécierais que quelqu'un m'explique pourquoi.
Capture d'écran du code pour plus de clarté:
python
python-3.x
filter
functional-programming
reduce
Dick Lucas
la source
la source
Réponses:
Vous pouvez en savoir plus sur les modifications dans Quoi de neuf dans Python 3.0 . Vous devriez le lire attentivement lorsque vous passez de 2.x à 3.x car beaucoup de choses ont été modifiées.
La réponse entière ici sont des citations de la documentation.
Vues et itérateurs au lieu de listes
Builtins
la source
list(map(...)
partout .. comment dans le monde est que la lisibilité aider ..python
ne semble pas gérer l'application progressive / streaming de combinateurs fonctionnels. Autres langues Je peux enchaîner une douzaine d'opérations contre une collection de suite et c'est lisible. Ici? que voulez-vous - une douzaine de voies imbriquéesin
??list
appel du tout? Je pensais que la signification de "streaming" est "aucune liste n'est créée du tout; traitez chaque élément de l'entrée complètement avant de passer au suivant".map
.La fonctionnalité de
map
et afilter
été intentionnellement modifiée pour renvoyer les itérateurs, et la réduction a été supprimée d'être intégrée et placéefunctools.reduce
.Donc, pour
filter
etmap
, vous pouvez les envelopperlist()
pour voir les résultats comme vous l'avez fait auparavant.La recommandation est maintenant de remplacer votre utilisation de la carte et du filtre par des expressions de générateurs ou des compréhensions de liste. Exemple:
Ils disent que pour les boucles, il est 99% plus facile à lire qu'à réduire, mais je resterais avec
functools.reduce
.Edit : le chiffre de 99% est tiré directement de la page Quoi de neuf en Python 3.0 rédigée par Guido van Rossum.
la source
[i*i*i for i in range(1,11)]
i**3
va en fait appeleri.__pow__(3)
eti*i*i
i.__mul__(i).__mul__(i)
(ou quelque chose comme ça). Avec ints, cela n'a pas d'importance, mais avec des nombres numpy / des classes personnalisées, cela peut même produire des résultats différents.list(list(list(.. )))
faire ce qui était déjà verbeux en python.En complément des autres réponses, cela ressemble à un bon cas d'utilisation pour un gestionnaire de contexte qui remappera les noms de ces fonctions à celles qui renvoient une liste et introduisent
reduce
dans l'espace de noms global.Une implémentation rapide pourrait ressembler à ceci:
Avec une utilisation qui ressemble à ceci:
Qui imprime:
Juste mes 2 cents :-)
la source
python
comme langue est un gâchis - mais il a v bon d'excellentes bibliothèques:numpy
,pandas
,statsmodels
et les amis .. J'avais Buliding bibliothèques de proximité comme vous montrer ici pour réduire la douleur de la langue maternelle - mais ont perdu l'énergie et essayer de ne pas s'éloigner loin d'undata.frame
/datatable
, ouxarray
. Mais bravo pour avoir essayé ..Puisque la
reduce
méthode a été supprimée de la fonction intégrée de Python3, n'oubliez pas d'importer lefunctools
dans votre code. Veuillez consulter l'extrait de code ci-dessous.la source
Voici les exemples de fonctions Filtrer, mapper et réduire.
//Filtre
//Carte
//Réduire
La fonction de réduction, car elle n'est pas couramment utilisée, a été supprimée des fonctions intégrées de Python 3. Elle est toujours disponible dans le module functools, vous pouvez donc faire:
la source
L'un des avantages de la cartographie, du filtrage et de la réduction est leur lisibilité lorsque vous les "enchaînez" ensemble pour faire quelque chose de complexe. Cependant, la syntaxe intégrée n'est pas lisible et est tout "en arrière". Je suggère donc d'utiliser le
PyFunctional
package ( https://pypi.org/project/PyFunctional/ ). Voici une comparaison des deux:Version PyFunctional
Syntaxe très lisible. Tu peux dire:
Version Python par défaut
Tout est en arrière. Vous devez dire:
la source