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
我应该使用这个实现,还是应该使用一些库函数?
答案 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