高级 Python 开发课程
第 章
>
第 级
高级列表
映射、过滤、归约
目标
通过使用 Maps、Filter 和 Reduce 完成冰淇淋的混合和制作。
部分冰淇淋口味的原料很少或已经耗尽,但我们有足够的材料来补充并制作更多的冰淇淋。为此,你必须使用 Map —— 这一强大的工具可以通过简化循环和分支代码来最小化你需要编写的代码量。Filter 和 Reduce 函数是对 Map 函数的有力补充,为你的编码提供了急需的多样性。
首先,你需要从 functools 库中导入 Reduce,以便在程序开头通过添加这段代码来使用该函数:from functools import reduce 。Map 和 Filter 函数是 Python 内置的,无需导入。
首先,你需要从步入式冰箱中拿取一些原料,走到金色的 X 标记处,面朝大门并使用 open() 函数将其打开。拿取冰箱中所有标记为 "cream" 的罐子,然后走到铺有绿色地毯的光标 X 标记处。
场地中有三个列表常量,分别命名为:vanilla、strawberry 和 chocolate。每个常量包含了构成冰淇淋口味的一组原料。在绿色 X 标记处,验证 strawberry 列表常量的内容。首先使用 place() 函数放置你之前拿取的 "cream",然后使用 speak() 函数验证 strawberry 列表常量的内容。
验证完毕后,是时候使用 Map 函数处理 strawberry 列表常量了,该列表中的所有内容都是小数。利用 map() 函数,你可以对列表中的所有元素进行取整,而无需通过循环逐个迭代进行取整。为此,创建一个名为 map1 的列表,并结合 strawberry 列表和 round() 函数使用 map() 函数,如下所示:map1 = list(map(round, strawberry)) 。完成后,使用 speak() 函数对 map1 进行验证。
完成此步骤后,我们继续使用 Filter。其工作方式与 Map 类似,但它需要配合一个函数使用。在编辑器顶部,你将看到一个预设函数 main_ingredients,该函数用于判断一个数字是否大于 25。
def main_ingredients(value):
return value > 25
不必通过循环,你可以将此函数与 filter() 函数结合使用,从而构成一个只包含大于 25 的项的新列表,这些项就是主要原料。创建一个名为 filter1 的新列表,并使用 filter() 函数,将 main_ingredients 和 map1 结合,以确定在你创建的 Map 列表中所有主要原料,如下所示:filter1 = list(filter(main_ingredients, value)) 。完成后,使用 speak() 函数验证 filter1 的结果。
接下来进入 Reduce 阶段,它的用法与 Filter 类似,不过你可以利用它来将一个列表压缩或归约为单一单位。与 Filter 相似,它也使用自定义函数,这次是命名为 custom_sum 的函数,用于动态地将两个数字相加。
def custom_sum(first, second):
return first + second
创建一个变量 reduce1,并结合 custom_sum 函数与 filter1 使用 reduce() 函数,将所有项合并为一个单一单位,如下所示:reduce1 = reduce(custom_sum, filter1) 。完成后,使用 speak() 函数验证 reduce1 的结果。
既然你已经完成了 Map、Filter、Reduce 的循环,现在在红色和蓝色地毯上的光标 X 标记处重复同样的循环。红色地毯上使用 vanilla 列表常量,创建 map2、filter2 和 reduce2;蓝色地毯上使用 chocolate 列表常量,创建 map3、filter3 和 reduce3。
走到铺有紫色地毯的最后一个光标 X 标记处,将 reduce1、reduce2 和 reduce3 相加,把香草、草莓和巧克力的主要原料组合在一起。创建一个名为 neapolitan 的变量,并将所有 Reduce 的结果相加,如下所示:neapolitan = reduce1+reduce2+reduce3 。使用 speak() 函数确认该组合,然后使用 place() 函数将其放置,以制作出拿破仑冰淇淋并完成关卡。