在Python中等效Haskell“until”

时间:2014-02-16 20:41:02

标签: python haskell functional-programming

Python中是否存在与Haskell's until函数相同的内置函数?

基本上,until将函数f应用于提供的起始值v,然后将f应用于f(v),直到满足条件。换句话说,until会返回重复应用f直到条件成立的结果。

我可以在Python中实现这一点:

def until(cond, func, starting):
    val = starting
    while not cond(val):
        val = func(val)
    return val

我应该使用这个实现,还是应该使用一些库函数?

1 个答案:

答案 0 :(得分:5)

不,没有与until等效的内置函数。 Python的内置和itertools模块从Haskell中获取了很多东西,但不是until函数。 你的也可能是实现它的最简单,最有效的方法。

实际上真正的问题是没有函数返回应用函数f迭代的结果,所以你不知何故来编写iter_apply函数那样做。

实施iter_apply时,可以很容易地编写一些内置函数来获取until

#from itertools import ifilter as filter  # in python2

def iter_apply(func, value):
    while True:
        yield value
        value = func(value)

def until2(cond, func, starting):
    return next(filter(cond, iter_apply(func, starting)))

# or:

from itertools import dropwhile
def until3(cond, func, starting):
    iterated_values = iter_apply(func, starting)
    return next(dropwhile(lambda x: not cond(x), iterated_values))

时差:

In [12]: %timeit until(lambda x: x > 10000, lambda x: x+1, 0)
100 loops, best of 3: 2.33 ms per loop

In [13]: %timeit until2(lambda x: x > 10000, lambda x: x+1, 0)
100 loops, best of 3: 2.45 ms per loop

In [14]: %timeit until3(lambda x: x > 10000, lambda x: x+1, 0)
100 loops, best of 3: 3.81 ms per loop