stdlib

时间:2018-05-24 17:37:51

标签: python functional-programming

我的项目中有一些限制,我不能使用while之类的语句/关键字,所以我想知道是否存在一个与标准库中的下面的代码示例类似的函数,即{ {1}},functools等?

itertools

>>> # signature: loop_while(pred, g, f, *args, **kwargs) >>> loop_while(lambda r: r != 0, # predicate ... lambda v: v - 1, # modifier function ... lambda: 5 # initial function ... ) 可以定义为与

大致相似的内容
loop_while

在功能上等同于:

def loop_while(pred, g, f, *args, **kwargs):
   res = f(*args, **kwargs)
   while pred(res):
       res = g(res)

或者另一种解决方案是允许您在一行中执行谓词循环的解决方案,例如n = 5 while n != 0: n -= 1 ,但使用任何可能的技巧。

1 个答案:

答案 0 :(得分:3)

itertools模块(令人惊讶地)并未提供以下函数的配方,该函数提供由xg(x)g(g(x))组成的可迭代,等:

def iterate(g, x):
    yield x
    for y in iterate(g(x), g):
        yield y

(以上内容由第三方模块toolz.itertoolz提供。其定义比我的更清晰:

def iterate(g, x):
    while True:
        yield x
        x = g(x)

然后,您的功能只是iterateitertools.takewhile的组合:

def loopwhile(pred, g, f, *args, **kwargs):
    for x in itertools.takewhile(pred, iterate(g, f(*args, **kwargs))):
        yield x

举个例子,

>>> list(loopwhile(lambda x: x < 1024, lambda x: x * 2, lambda: 1))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

以上的Python 3版本更简单:

def iterate(g, x):
    yield x
    yield from iterate(g, g(x))

def loopwhile(pred, g, f, *args, **kwargs):
    yield from takewhile(pred, iterate(g, f(*args, **kwargs)))