返回顶部

写 Python 代码不可不知的函数式编程技术(二)

[复制链接]
气泡水Lv.2 显示全部楼层 发表于 2021-12-3 14:32:56 |阅读模式 打印 上一主题 下一主题
  嵌套函数

  函数还可以在其他函数内部,这就是【内部函数】。内部函数在创建辅助函数时非常有用,辅助函数即作为子模块来支持主函数的小型可重用函数。

  在问题需要特定函数定义(参数类型或顺序)时,我们可以使用辅助函数。这种不遵循传统做法的操作使得解决问题变得更加简单。

  假设你想定义一个斐波那契函数 fib(n),该函数只有一个参数 n,我们必须返回第 n 个斐波那契数。

  定义此类函数的一种可行方式是:使用辅助函数来追踪斐波那契数列的前两个项(因为斐波那契数是前两个数之和)。

[Python] 纯文本查看 复制代码
def fib(n):
    def fib_helper(fk1, fk, k):
        if n == k:
           return fk
        else:
           return fib_helper(fk, fk1+fk, k+1)
    if n <= 1:
       return n
    else:
       return fib_helper(0, 1, 1)



  将该计算从函数主体移到函数参数,这具备非常强大的力量。因为它减少了递归方法中可能出现的冗余计算。

  单表达式函数(Lambda 表达式)

  如果我们想在未给函数命名之前写一个函数要怎么做?如果我们想写一个简短的单行函数(如上述示例中的函数 foo 或 mult)要怎么做?

  我们可以在 Python 中使用 lambda 关键字来定义此类函数。示例如下:

[Python] 纯文本查看 复制代码
mult = lambda x, y: x * y
mult(1, 2) #returns 2


  该 mult 函数的行为与使用传统 def 关键字定义函数的行为相同。

  注意:lambda 函数必须为单行,且不能包含程序员写的返回语句。

  事实上,它们通常具备隐式的返回语句(在上面的示例中,函数想表达 return x * y,不过我们省略了 lambda 函数中的显式返回语句)。

  lambda 函数更加强大和精准,因为我们还可以构建匿名函数(即没有名称的函数):

[Python] 纯文本查看 复制代码
(lambda x, y: x * y)(9, 10) #returns 90


  当我们只需要一次性使用某函数时,这种方法非常方便。例如,当我们想填充字典时:

[Python] 纯文本查看 复制代码
import collections
pre_fill = collections.defaultdict(lambda: (0, 0))
#all dictionary keys and values are set to 0


  接下来我们来看 Map、Filter 和 Reduce,以更多地了解 lambda。

  Map、Filter 和 Reduce

  Map

  map 函数基于指定过程(函数)将输入集转换为另一个集合。这类似于上文提到的 iterate_custom 函数。例如:

[Python] 纯文本查看 复制代码
def multiply_by_four(x):
    return x * 4
scores = [3, 6, 8, 3, 5, 7]
modified_scores = list(map(multiply_by_four, scores))
#modified scores is now [12, 24, 32, 12, 20, 28]


  在 Python 3 中,map 函数返回的 map 对象可被类型转换为 list,以方便使用。现在,我们无需显式地定义 multiply_by_four 函数,而是定义 lambda 表达式:

[Python] 纯文本查看 复制代码
modified_scores = list(map(lambda x: 4 * x, scores))


  当我们想对集合内的所有值执行某项操作时,map 函数很有用。

  Filter

  就像名称所显示的那样,filter 函数可以帮助筛除不想要的项。例如,我们想要去除 scores 中的奇数,那么我们可以使用 filter:

[Python] 纯文本查看 复制代码
even_scores = list(filter(lambda x: True if (x % 2 == 0) else False, scores))
#even_scores = [6, 8]


  由于提供给 filter 的函数是逐个决定是否接受每一个项的,因此该函数必须返回 bool 值,且该函数必须是一元函数(即只使用一个输入参数)。

  Reduce

  reduce 函数用于【总结】或【概述】数据集。例如,如果我们想要计算所有分数的总和,就可以使用 reduce:

[Python] 纯文本查看 复制代码
sum_scores = reduce((lambda x, y: x + y), scores)
#sum_scores = 32


      这要比写循环语句简单多了。注意:提供给 reduce 的函数需要两个参数:一个表示正在接受检查的项,另一个表示所用运算的累积结果。

  
【免责声明】本文系转载,文章来源于机器之心,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与联系我们,我们会予以更改或删除相关文章,以保证您的权益!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

达内教育:成立于2002年。致力于面向IT互联网行业,培养软件开发工程师、测试工程师、系统管理员、智能硬件工程师、UI设计师、网络营销、会计等职场人才 达内使命:缔造年轻人的中国梦、缔造达内员工的中国梦 达内愿景:做管理一流的教育公司
  • 商务合作

  • Powered by Discuz! X3.4 | Copyright © 2002-2024, 达内教育 Tedu.cn
  • 京ICP备08000853号-56 |网站地图