python函数式编程-高阶函数与偏函数

高阶函数

python 的函数不仅能接收普通的参数,还可以接收一个函数本身作为参数,这样的函数称为高阶函数

filter() 函数


filter() ,顾名思义,这个函数是一个过滤器。它接收一个函数 f 和一个 list,f 是一个判断函数,对参数进行判断之后依据条件返回 TureFalsefilter() 就是用 f 对 list 中的每个元素进行判断,自动过滤掉结果为 False
的元素,将符合条件的元素组成的新 list 并返回.

s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')

sorted()函数 内置函数,默认按增序排序


sorted()也是一个高阶函数,它可以接受一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素x, y,如果x应该排在y前面则返回-1,如果x应该排在y后面则返回1,其他返回0

sorted()函数返回一个新的lis

闭包


内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,成为闭包(Closure).

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

列表的赋值


对一个列表 ,例如l = ['1', '2', '3']

  • 如果将它直接赋值给一个变量:a = l,则a是指向这个列表对象的变量,如果修改a,则直接修改了列表本身。如下:
>>> a = l
>>> a
['1', '2', '3']
>>> a[0] = '5'
>>> a
['5', '2', '3']
>>> l
['5', '2', '3']
  • 假设列表中一共有n个元素,若将列表l[]赋值给n个变量:a1, a2, a3 = l,其意义是将列表中的元素赋值给这些变量,此时a1, a2, a3分别等于'1', '2', '3'.
  • 如果将列表赋值给多个变量,但是变量数目不够n个,则会报错。

函数装饰器

在函数调用时想动态地给函数增加一些新的功能,但是又不改变原函数的定义,使用函数装饰器即可实现。
函数装饰器的本质是一个高阶函数
这样做可以极大地简化代码,避免每个函数编写重复代码

格式:
函数装饰器一般是这样的:

@new_fn
def f1(args):
    pass

这就相当于:

def f1(args):
    pass
f1 = new_fn(f1)

#其中new_fn是一个接收函数的高阶函数

*此时,原有的f1()就被彻底地隐藏了起来,调用f1()时只能调用经过装饰的函数

偏函数

有的函数需要多个参数,偏函数就是将个别参数固定了的新函数。例如:

def int2(x, base=2):
    return int(x, base)

functools.partial是一个创建一个偏函数的工具,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

>>> import functools
>>> int2 = functools.partial(int2, base=2)
>>> int2('1000000')
64

版权声明 自由转载 - 保持署名 - 不可商用 - 不可演绎 (CC3.0 创意共享3.0许可证

推荐阅读更多精彩内容

  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 1,278评论 0 2
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 912评论 0 6
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 4,252评论 1 15
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 4,892评论 6 53
  • 无意中买了这本书,一开始读到书名觉得一定索然无味,朝圣,什么是朝圣。在没读之前我觉得朝圣和弥撒没有什么区别,都是按...
    林小圆May阅读 141评论 0 0