Python学习—函数式编程

函数式编程

  • 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数
  • Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言

高阶函数

map函数

  • 将可迭代对象作用到函数中,返回一个map对象
  • map()作为高阶函数,它把运算规则抽象化了
map(func, *iterables) ---> map object

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce函数

  • reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数
  • reduce把结果继续和序列的下一个元素做累积计算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
# 把序列[1, 3, 5, 7, 9]变换成整数13579
>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

filter函数

  • filter()函数用于过滤序列
  • filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
# 删掉list中的偶数
def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
  • filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list

sorted函数

  • sorted()函数就可以对list进行排序
  • sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
  • 默认情况下,对字符串排序,是按照ASCII的大小比较的
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

返回函数

  • 一个函数可以返回一个计算结果,也可以返回一个函数。
  • 返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量

匿名函数-lambda

  • 直接使用匿名函数比定义函数简单时使用
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 关键字lambda表示匿名函数,冒号前面的x表示函数参数
  • 匿名函数只能有一个表达式,不用写return;返回值就是该表达式的结果

装饰器

  • 在代码运行期间动态增加函数功能的方式,称之为“装饰器”

  • 实现原理:基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数

  • 实现效果:可以在不改变原函数内部代码和调用方式的前提下,实现函数在执行时扩展功能

  • 适用场景:多个函数系统统一在执行前后自定义一些功能

"""
python语法层面支持装饰器:

@函数名
def xxx():
    pass

Python内部会自动执行 函数名()  
并且将xxx()函数作为参数传入 函数名()
再将结果赋值给xxx()函数
等价于 xxx = 函数名(xxx)
"""

def outer(origin):
    def inner(*args,**kwargs):
        # 执行前
        res = origin()  # 调用原来的func函数
        # 执行后
        return res
    return inner

@outer
def func():
    pass

func()

偏函数

  • Python的functools模块提供了很多有用的功能,其中一个就是偏函数
  • functools.partial的作用就是把一个函数的某些参数固定住(设置为默认值),返回一个新函数,供我们调用
  • 偏函数可以简化参数操作,当函数的某个参数可以提前获知,我们可以使用偏函数将其固定住
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值