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