J'ai essayé la synthèse de fonctions et le curry avec python

python a partiel

Cependant, il n'y a pas de curry. Je suis triste. J'ai donc écrit une fonction curry qui compte les arguments positionnels par moi-même.

Synthèse fonctionnelle

J'ai d'abord écrit une composition de fonction. C'est simple et minable.

def compose(*funcs: Callable) -> Callable:
    '''
    >>> compose(multest, multest)(4)
    16
    '''
    def composed(*args: Any) -> Any:
        return reduce(lambda x, y: y(x), (funcs[0](*args),)+funcs[1:])
    return composed

Fonctions de curry

Le mécanisme est aussi simple que de vérifier le nombre d'arguments positionnels et de partiellement le partialiser. Alors parfois ça ne marche pas.

def _curry_one(func: Callable) -> Callable:
    def wrap(*args: Any, **kwargs: Any) -> Any:
        return partial(func, *args, **kwargs)
    return wrap


def curry(num_of_args: Optional[int] = None) -> Callable:
    '''
    >>> fnc = curry(2)(multest2)
    >>> fnc(2)(3)
    6
    >>> fnc = curry()(multest3)
    >>> fnc(2)(3)(4)
    24
    '''
    def curry_wrap(func: Callable) -> Callable:
        length_of = compose(filter, list, len)
        if num_of_args:
            num = num_of_args
        else:
            def is_empty(x): return x.default is inspect._empty
            num = length_of(is_empty,
                            inspect.signature(func).parameters.values())
        for n in range(num - 1):
            func = _curry_one(func)
        return func
    return curry_wrap

Lors du curry, comptez le nombre d'arguments et curry autant que le nombre d'arguments de position. Vous pouvez également spécifier le nombre de currys. Cependant, en pratique, il est fixé à 2 et ça fait du bien.

Pourquoi est-ce du curry? Est-ce inutile en partie?

Cela peut être partiel, mais ce curry peut être utilisé comme décorateur.

@curry()
def test(x, y, z):
    return x * y + z

En outre, il est parfois pratique de l'utiliser comme fonction d'ordre supérieur. Surtout lorsqu'il est nécessaire de séparer les cas Quand je dois sortir une starmap. Par exemple, je ne peux pas lire la dernière partie ci-dessous. (Écrire)

def plus(x, y):
    return x * y

result = list(map(partial(plus, 3), range(4)))

Même si ce type est partiellement séparé.

def plus(x, y):
    return x * y

plus3 = partial(plus)
result = list(map(plus3, range(4)))

L'espace de nom est un peu ... Je me sens mal à l'aise avec plus de hoge. Je peux écrire à ce mec comme ça

@curry()
def plus(x, y):
    return x * y

result = compose(map, list)(plus(3), range(4))

Est-ce que ça va?

C'est décidé que c'est inutile, c'est bien que python soit le même, peu importe qui l'écrit. Par conséquent, ce qui précède ne doit pas être utilisé.

Dissolution

Si cela ne fonctionne pas, pourquoi avez-vous fait cela?

Utilisez numpy dans votre projet personnel. Je suis indépendant, mais j'ai été déçu car je ne pouvais pas lire le code parce que j'ai écrit un code comme celui-ci.

np.save(fname, baseline(np.square(fft(data.mean(axis=1)))))

Il s'agit d'un package de calcul scientifique, donc si vous mentionnez la marge de manœuvre dans la situation (existe-t-il?) Il y avait tellement de variables mathématiques que l'espace de noms était fou ... S'il y avait du curry et de la composition de fonction ici, ce serait le cas, non?

mean = curry(np.mean)
save = curry(np.save)
compose(mean(axis=1), fft, np.square, np.std, save(fname))(data)

... n'est-ce pas? Théorie de l'innocence du projet personnel.

Recommended Posts

J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé webScraping avec python.
J'ai joué avec PyQt5 et Python3
Synthèse de fonctions et application en Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
J'ai installé et utilisé Numba avec Python3.5
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
J'ai essayé le web scraping en utilisant python et sélénium
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé Python> autopep8
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé de jouer en connectant PartiQL et MongoDB
J'ai comparé "type de dictionnaire python" et "fonction excel"
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
J'ai essayé Python> décorateur
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé d'accélérer le code Python, y compris l'instruction if avec Numba et Cython
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé pipenv et asdf pour le contrôle de version Python
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
Introduire l'opérateur pipe et la composition de fonction à Python (provisoire)
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
2017-04-11 Python> J'ai essayé le générateur> On m'a appris l'expression du générateur / la fonction du générateur / suivant ()
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
Exploration avec Python et Twitter API 1 - Fonction de recherche simple