gpt4 book ai didi

functional-programming - 是否有 Python 惯用语用于评估具有短路的函数/表达式列表?

转载 作者:太空狗 更新时间:2023-10-29 20:48:29 25 4
gpt4 key购买 nike

我写了一个简单的脚本来解决“逻辑谜题”,这是学校里的谜题类型,给你一些规则,然后你必须能够找到解决问题的方法,比如“有五个名叫 A 的音乐家, B、C、D 和 E 在一场音乐会上演奏,一个接一个演奏……如果 A 在 B 之前,而 D 不是最后一个……谁演奏的顺序是什么时候?”等等

为了评估可能的解决方案,我将每个“规则”编写为一个单独的函数,用于评估可能的解决方案(简单地表示为字符串列表)是否有效,例如

#Fifth slot must be B or D
def rule1(solution):
return solution[4] == 'B' or solution[4] == 'D'

#There must be at least two spots between A and B
def rule2(solution):
returns abs(solution.index('A') - solution.index('B')) >= 2

#etc...

我有兴趣找到 Pythonic 方法来测试一个可能的解决方案是否通过所有这些规则,并能够在第一个规则失败后停止评估规则。

起初我写了最简单的东西:

def is_valid(solution):
return rule1(solution) and rule2(solution) and rule3(solution) and ...

但这看起来很丑陋。我想也许我可以通过列表理解之类的东西让这篇文章读起来更优雅......

def is_valid(solution)
rules = [rule1, rule2, rule3, rule4, ... ]
return all([r(solution) for f in rules])

...但后来我意识到,由于列表理解是在评估 all() 函数之前生成的,因此这具有根本不会短路的副作用 - 每个规则即使第一个返回 False 也会被评估。

所以我的问题是:是否有更 Pythonic/函数式的方法来评估 True/False 表达式的列表,有短路,没有需要写出一长串 return f1(s) and f2(s) and f3(s) ... 吗?

最佳答案

使用 generator expression :

rules = [ rule1, rule2, rule3, rule4, ... ]
rules_generator = ( r( solution ) for r in rules )
return all( rules_generator )

语法糖:你可以省略多余的括号:

rules = [ rule1, rule2, rule3, rule4, ... ]
return all( r( solution ) for r in rules )

生成器(基本上)是一个带有 .next() 方法的对象,它返回某个可迭代对象中的下一个项目。这意味着它们可以做一些有用的事情,比如分 block 读取文件而不将其全部加载到内存中,或者迭代到巨大的整数。您可以透明地使用 for 循环遍历它们; Python 在幕后处理它。例如,range 是 Py3k 中的生成器。

您可以通过在函数定义中使用 yield 语句而不是 return 来滚动您自己的自定义生成器表达式:

def integers():
i = 0
while True:
yield i

Python 将处理保存函数的状态等。他们太棒了!

关于functional-programming - 是否有 Python 惯用语用于评估具有短路的函数/表达式列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3405794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com