跳至主要內容

函数式编程核心

刘春龙原创...大约 2 分钟Python教程文档

函数式编程(functional programming)其实是个很古老的概念,诞生距今快 60 年啦!

最古老的函数式编程语言 Lisp

新出现的函数式编程语言:比如 Erlang、Scala、clojure 等

热门语言:Python、java、JavaScript、C++等都增加了函数式编程的一些特性。

高阶函数

函数式编程最鲜明的特点就是:函数是一等公民(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回

一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

Python 内建的高阶函数有mapreducefiltersorted

# coding=utf-8
def test1():
    print("I'm test!")


def test2(func):  # test2就是一个高阶函数
    func()
    print("test2 running...")


if __name__ == "__main__":
    print(test1)  #
    print(type(test1))  #
    a = test1  # a和test1都指向了同一个函数对象
    a()  # I'm test!
    test2(a)  # a作为参数传递给test2()

lambda 表达式和匿名函数

lambda 表达式可以用来声明匿名函数。lambda 函数是一种简单的、在同一行中定义函数的方法。lambda 函数实际生成了一个函数对象。

lambda 表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。

lambda 表达式的基本语法如下:lambda arg1,arg2,arg3... : <表达式>

f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))
​
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))

闭包 closure

根据字面意思,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数。当然,还有函数内部对应的逻辑,包裹里面的东西就是自由变量(外部函数的局部变量),自由变量可以随着包裹到处游荡。

我们知道,函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限。

闭包是一个函数,只不过这个函数有[超能力],可以访问到另一个函数的作用域。

第一个闭包程序
def outer():
    a = 1

    def inner():
        nonlocal a
        # 闭包是由于函数内部使用了函数外部的变量。这个函数对象不销毁,则外部函数的局部变量也不会被销毁!
        print("a:", a)
        a += 1

    return inner


inn = outer()
inn()
inn()
上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7