Каррирующие итераторы в Python - PullRequest
0 голосов
/ 09 июля 2019

В следующем фрагменте я пытаюсь вернуть функцию, которая возвращает генератор (разве они когда-то назывались итераторами?) С аргументом step карри.

import math
import numpy

def aequi_ang_step(step):
    def local_it(start, d_alpha, step):
        for alpha in numpy.arange(start, start+d_alpha,(d_alpha < 0) and -step or step):
            if (alpha < 2*math.pi): yield alpha
            else: yield alpha-2*math.pi
    return lambda start, d_alpha: local_it(start, d_alpha, step)

Эта штука работает, но когда я возвращаюсь после долгого воздержания обратно в Python, мой вопрос в том, является ли это правильным и питонским способом каррирования итераторов в Python.

1 Ответ

2 голосов
/ 09 июля 2019

Это не совсем то, как я бы подошел к проблеме здесь. В частности, возврат lambda не рекомендуется. Рассмотрим вместо этого

import math
import numpy

def aequi_ang_step(step):
    def local_it(start, d_alpha):
        for alpha in numpy.arange(start, start+d_alpha,(d_alpha < 0) and -step or step):
            if (alpha < 2*math.pi): yield alpha
            else: yield alpha-2*math.pi
    return local_it

Теперь вы возвращаете закрытие, которое включает определение для step.

Я думаю, что более питонический подход для карри - это functools.partial

from functools import partial
import math
import numpy

step = 0.1

def aequi_ang(start, d_alpha, step):
    for alpha in numpy.arange(start, start+d_alpha,(d_alpha < 0) and -step or step):
        if (alpha < 2*math.pi): yield alpha
        else: yield alpha-2*math.pi

aequi_ang_step = partial(aequi_ang, step=step)
...