python - 标准库中 python 中的“loop_while”谓词函数
问题描述
我的项目有一定的限制,我不能使用类似的语句/关键字while
,所以我想知道在标准库中是否存在类似于以下代码示例的函数,例如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
或者另一种解决方案是允许您在一行中执行谓词循环,例如[<expr> while <pred>]
但使用任何可能的技巧。
解决方案
该itertools
模块(令人惊讶的是)没有为以下函数提供配方,它提供了一个由x
、g(x)
、g(g(x))
等组成的迭代:
def iterate(g, x):
yield x
for y in iterate(g(x), g):
yield y
(以上由 3rd-party 模块提供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)))
推荐阅读
- .net - iText - 获取符号组合的位置
- node.js - pm2 重新加载生态系统.config.js 导致应用程序多次重启
- c++ - 更新了 Visual Studio,现在 wxWidgets 抱怨未解析的符号
- pandas - pandas reindex 填补缺失的日期
- java - 如何使用 java 1.6 按创建日期对文件进行排序
- typescript - 为什么打字稿中允许这样做?
- oracle - 我如何解决外键中的 ORACLE 问题
- openshift - 为什么某些 OpenShift 命令会特殊处理 PersistentVolumeClaims
- drupal-8 - Drupal 8 - hook_mail 没有被调用
- java - Java加速进程/线程