Python 中的柯里化迭代器

Currying iterators in Python

在下面的代码片段中,我尝试 return 一个函数,该函数是 returning 一个生成器(顺便说一句,它们不是曾经被称为迭代器吗?),步骤参数已柯里化。

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)

这件事有效,但当我 return 从长期禁欲回到 Python 时,我的问题是这是否是一种在 Python 中咖喱迭代器的好方法和 pythonic 方式。

这不是我在这里处理问题的确切方式。特别是,不鼓励 returning a 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

现在您 return 是一个包含 step 定义的闭包。

我认为一般来说更像 pythonic 的柯里化方法是 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)