Python 过滤True条件表达式,确定哪个表达式的结果为True有多种方法。前面的示例将键加载到了字典中。这种字典加载方法只会保留一个键为True的值。
针对这个模型,使用filter()函数编写的另一种变体如下所示:
from operator import itemgetter def semifact(n: int) -> int: alternatives = [ (n == 0, lambda n: 1), (n == 1, lambda n: 1), (n == 2, lambda n: 2), (n > 2, lambda n: semifact(n-2)*n) ] _, f = next(filter(itemgetter(0), alternatives)) return f(n)
这样就将所有备选方案定义为条件和函数对的一组序列,其中每一项都作为一个条件,且其基于输入和能生成输出结果的匿名函数。变量赋值语句中还可以包含一个类型提示,如下所示:
alternatives: List[Tuple[bool, Callable[[int], int]]] = [ etc, ]
这个列表实际上代表的是4个二元组的同一集合。该定义阐明了其中的元组列表包含一个布尔值和一个可调用函数。
当使用itemgetter(0)参数来应用filter()函数时,我们会选取元组第0项值为True的对。对于这些值为True的对,使用next()方法从filter()函数创建的可迭代对象中提取第一项。选取的条件值赋给_变量,选取的函数则赋给f变量。可以忽略条件值(它为True),而只对返回的f()函数进行求值。
前面的示例,使用匿名函数将函数的求值延迟到了条件求值之后。
其中的semifact()函数也称双阶乘。半阶乘的定义和阶乘类似,主要的区别在于半阶乘不是所有数字的乘积,而是交替数字的乘积。例如下面两个公式:
- 5!!=5×3×1
- 7!!=7×5×3×1
版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com