返回顶部

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

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

  近来,越来越多人使用函数式编程。因此,很多传统的命令式语言(如 Java 和 Python)开始支持函数式编程技术。本文对 Python 中的函数式编程技术进行了简单的入门介绍。

  头等函数

  在 Python 中,函数是【头等公民】。也就是说,函数与其他数据类型(如 int)处于平等地位。

  因而,我们可以将函数赋值给变量,也可以将其作为参数传入其他函数,将它们存储在其他数据结构(如 dicts)中,并将它们作为其他函数的返回值。

  把函数作为对象

  由于其他数据类型(如 string、list 和 int)都是对象,那么函数也是 Python 中的对象。我们来看示例函数 foo,它将自己的名称打印出来:

[Python] 纯文本查看 复制代码
def foo():
   print("foo")


  由于函数是对象,因此我们可以将函数 foo 赋值给任意变量,然后调用该变量。例如,我们可以将函数赋值给变量 bar:

[Python] 纯文本查看 复制代码
bar = foo
bar()
#will print "foo" to the console


  语句 bar = foo 将函数 foo 引用的对象赋值给变量 bar。

  把对象作为函数

  当对象可调用时(callable),它们与函数一样,如 object()。这是通过 __call__ 方法实现的。

  示例如下:

[Python] 纯文本查看 复制代码
class Greeter:
   def __init__(self, greeting):
      self.greeting = greeting
   def __call__(self, name):
      return self.greeting + " " + name



  每一次配置 Greeter 类的对象时,我们都会创建一个新的对象,即打招呼时可以喊的新名字。如下所示:

[Python] 纯文本查看 复制代码
morning = Greeter("good morning") #creates the callable object
morning("john") # calling the object
#prints "good morning john" to the console


  我们可以调用 morning 对象的原因在于,我们已经在类定义中使用了 __call__ 方法。为了检查对象是否可调用,我们使用内置函数 callable:

[Python] 纯文本查看 复制代码
callable(morning) #true
callable(145) #false. int is not callable. 


  数据结构内的函数

  函数和其他对象一样,可以存储在数据结构内部。例如,我们可以创建 int to func 的字典。当 int 是待执行步骤的简写时,这就会派上用场。

[Python] 纯文本查看 复制代码
# store in dictionary
mapping = {
   0 : foo,
   1 : bar
}
x = input() #get integer value from user
mapping[x]() #call the func returned by dictionary access


  类似地,函数也可以存储在多种其他数据结构中。

  把函数作为参数和返回值

  函数还可以作为其他函数的参数和返回值。接受函数作为输入或返回函数的函数叫做高阶函数,它是函数式编程的重要组成部分。

  高阶函数具备强大的能力。就像《Eloquent JavaScript》中解释的那样:

  【高阶函数允许我们对动作执行抽象,而不只是抽象数值。】

  我们来看一个例子。假设我们想对一个项目列表(list of items)执行迭代,并将其顺序打印出来。我们可以轻松构建一个 iterate 函数:

[Python] 纯文本查看 复制代码
def iterate(list_of_items):
    for item in list_of_items:
        print(item)


  看起来很酷吧,但这只不过是一级抽象而已。如果我们想在对列表执行迭代时进行打印以外的其他操作要怎么做呢?

  这就是高阶函数存在的意义。我们可以创建函数 iterate_custom,待执行迭代的列表和要对每个项应用的函数都是 iterate_custom 函数的输入:

[Python] 纯文本查看 复制代码
def iterate_custom(list_of_items, custom_func):
   for item in list_of_items:
        custom_func(item)


  这看起来微不足道,但其实非常强大。

  我们已经把抽象的级别提高了一层,使代码具备更强的可重用性。现在,我们不仅可以在打印列表时调用该函数,还可以对涉及序列迭代的列表执行任意操作。

  函数还能被返回,从而使事情变得更加简单。就像我们在 dict 中存储函数一样,我们还可以将函数作为控制语句,来决定适合的函数。例如:

[Python] 纯文本查看 复制代码
def add(x, y):
    return x + y
def sub(x, y):
    return x - y
def mult(x, y):
    return x * y
def calculator(opcode):
    if opcode == 1:
       return add
    elif opcode == 2:
       return sub
    else:
       return mult 
my_calc = calculator(2) #my calc is a subtractor
my_calc(5, 4) #returns 5 - 4 = 1 
my_calc = calculator(9) #my calc is now a multiplier
my_calc(5, 4) #returns 5 x 4 = 20. 



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


回复

使用道具 举报

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

本版积分规则

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

  • 微信公众号

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