函数式编程

2020 年 06 月 04 日 • 阅读数: 151

函数式编程

函数

  • 在python中函数也是一个对象
  • 可以将一个函数赋值给一个变量
  • 可以将一个函数作为参数传递到另一个函数里面
  • 可以将一个函数作为另一个函数的返回值

闭包

  • 在一个函数的内部定义的函数,其作用域只在函数的内部,不能在外部直接调用,但可以通过return返回一个函数
  • python中闭包的定义是指一个函数以及它在定义时候的外部环境变量所构成的一个整体
  • 一旦一个函数形成了闭包以后,在任何地方调用它,都不会受到其他环境变量的影响
def curve_pre():
    a = 25
    def curve(x):
        return a*x*x
    return curve
  • 返回闭包的时候,不仅返回了闭包的函数,还包含了函数运行时的外部环境
  • 外部环境变量不能在内部定义(这会被认为是一个局部变量),也不能是全局变量
  • 通过__closure__可以查看闭包的环境变量
f = curve_pre()
print(f(2))
print(type(f))
print(f.__closure__)
print(f.__closure__[0].cell_contents)
100
<class 'function'>
(<cell at 0x7faff4cbbb58: int object at 0x55b9fcbe5d00>,)
25
  • 闭包可以避免使用全局变量,而是使用闭包所包含的外部环境变量
origin = 0
def go(step):
    global origin
    new_pos = origin + step
    origin = new_pos
    return origin
def factory(pos):
    def go(step):
        nonlocal pos
        new_pos = pos + step
        pos = new_pos
        return pos
    return go
f = factory(0)
print(f(2))
print(f(5))
print(f(6))
2
7
13

lambda表达式

  • 语法:lambda 参数列表: 表达式

  • 调用方式:赋值给一个变量

f = lambda x,y: x+y
f(1,2)
3

三元表达式

  • 语法:条件为真时返回的结果 if 条件判断 else 条件为假时的返回
x = 10
y = 20
x if x > y else y
20

map函数

  • 语法:map(被调用的函数, 迭代器)
  • map中第二个参数可以接受多个迭代器
list_x = [1,2,3,4,5,6,7,8]
[i for i in map(lambda x: x*x, list_x)]
[1, 4, 9, 16, 25, 36, 49, 64]

reduce函数

  • 语法:reduce(被调用的函数, 序列)
  • reduce是一个连续计算的函数
from functools import reduce

list_x = [1,2,3,4,5,6,7,8]
reduce(lambda x, y: x+y, list_x)
36

filter函数

  • 语法:filter(被调用的函数, 迭代器)
list_x = [1,2,3,4,5,6,7,8]
[i for i in filter(lambda x: True if x > 4 else False, list_x)]
[5, 6, 7, 8]
标签: Python函数式编程
添加评论
评论列表
没有更多内容