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)
在下面的代码片段中,我尝试 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)