我的项目中有一些限制,我不能使用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
,但使用任何可能的技巧。
答案 0 :(得分:3)
itertools
模块(令人惊讶地)并未提供以下函数的配方,该函数提供由x
,g(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)
)
然后,您的功能只是iterate
和itertools.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)))