函数式编程 之

高阶函数

  • 把函数作为参数使用的函数,叫高阶函数

1. 引子

  • 函数名可以类似变量那样使用
>>> a = 10
>>> b = a
>>> b
10
>>>
>>> def func():
... print("abc")
...
>>> func()
abc
>>> new_func = func
>>> new_func()
abc
>>> type(new_func)
<class 'function'>
>>>
  • 下方这个例子

    • 说白了,就是在一个函数里调用另一个函数
    • 对理解后面的“装饰器”也有帮助
>>> def funcA(n):
... return n + 1
...
>>> def funcB(n):
... return funcA(n) * 2
...
>>> def funcC(n, f):
... return f(n) % 5
...
>>> funcC(5, funcB)
2
>>>

2. 系统提供的高阶函数

2.1 map

  • 原意就是映射,即把集合或者列表的每一个元素都按照一定规则进行操作,生成一个新的集合集合或者列表

  • map 函数返回一个迭代对象

  • 举例

# 不用 map
>>> lst1 = [i for i in range(10)]
>>> lst2 = []
>>> for i in lst1:
... lst2.append(i * 10)
...
>>> lst1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst2
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>>
# 使用 map
>>> mul_ten = lambda x: 10 * x
>>> lst3 = map(mul_ten, [1, 2, 3])
>>> lst3
<map object at 0x000002AD0F8C00B8>
>>> for i in lst3:
... print(i)
...
10
20
30
>>>
# 使用 map,配合 list,map 会舍去多余项
>>> lst4 = [1, 2, 3]
>>> lst5 = [4, 5, 6, 7]
>>> list(map(lambda x,y: x+y, lst4, lst5))
[5, 7, 9]
>>>
  • 注意,map 生成的 iterator 只能迭代一次
>>> lst6 = map(lambda x: x*x, [1, 2, 3])
>>> for i in lst6:
... print(i)
...
1
4
9
>>> for i in lst6:
... print(i)
...
>>>
>>> lst7 = map(lambda x: x*x, [1, 2, 3])
>>> [i for i in lst7]
[1, 4, 9]
>>> [i for i in lst7]
[]
>>>

2.2 filter

  • 过滤函数: 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
  • map 相比
    • 相同

      • 都对列表的每一个元素逐一进行操作
    • 不同
      • map 会生成一个跟原来数据相对应的新队列
      • filter 不一定,只有符合条件的才会进入新的数据集合
  • filter 函数的写法
    • 利用给定函数进行判断
    • 返回值一定是个布尔值
    • 调用格式 filter(f, data)f 是过滤函数,data 是数据
>>> list(filter(lambda x: x%2==0, [1, 2, 3, 4, 5]))
[2, 4]
>>>

3. functools 包提供的 reduce

  • 原意为“归并”,“缩减”
  • 把一个可迭代对象最后归并成一个结果
  • 对于作为参数的函数要求
    • 必须有两个参数
    • 必须要返回结果
  • reduce([1, 2, 3]) 可以理解成 f(f(1, 2), 3)
>>> from functools import reduce
>>> reduce(lambda x,y: x+y, [1, 2, 3, 4, 5])
15
>>>

4. 排序

  • 把一个序列按照给定算法进行排序

  • Python2Python3 相差巨大

  • 格式:sorted(iterable, /, *, key=None, reverse=False)

  • key:在排序前,对每一个元素进行 key 函数运算,可以理解成按照 key 函数定义的逻辑进行排序

>>> sorted([1, 3, 5, 7, 9], reverse=True)
[9, 7, 5, 3, 1]
>>>
>>> sorted([9, -3, 0, 4, 8], key=abs)
[0, -3, 4, 8, 9]
>>>
>>> names = ["Tony black", "Amy Green", "Johnny Lee"]
>>> sorted(names)
['Amy Green', 'Johnny Lee', 'Tony black']
>>> sorted(names, key=str.lower)
['Amy Green', 'Johnny Lee', 'Tony black']
>>>

[Python3] 035 函数式编程 高阶函数的更多相关文章

  1. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  2. C#函数式编程-高阶函数

    随笔分类 -函数式编程 C#函数式编程之标准高阶函数 2015-01-27 09:20 by y-z-f, 344 阅读, 收藏, 编辑 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的 ...

  3. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  4. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  5. Python实用笔记 (12)函数式编程——高阶函数

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

  6. 函数式编程 高阶函数 map&reduce filter sorted

    函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...

  7. python 函数式编程 高阶函数 装饰器

    # -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...

  8. Python函数式编程-高阶函数、匿名函数、装饰器、偏函数

  9. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

随机推荐

  1. TensorFlow2.0提示Cannot find reference 'keras' in __init__.py

    使用TensorFlow2.0导入from tensorflow.keras import layers会出现Cannot find reference 'keras' in __init__.py提 ...

  2. MySQL的btree索引和hash索引区别

     在使用MySQL索引的时候, 选择b-tree还是hash hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范 ...

  3. java怎样实现重载一个方法

    重载(重新载选方法): java允许在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多 ...

  4. golang配置oci8所遇到问题解决

    新建文件夹 mingw 将 MinGW.zip 解压到mingw目录下,进入mingw\lib目录下 新建文件夹pkg-config 执行命令 go get github.com/wendal/go- ...

  5. 使用kombu的producer pool 向rabbitmq瞬间发送大量消息

    kombu比pika感觉考虑得全面多了,不知道为什么用的人好像少? 生产端是 python-socket.io 的client   接受socketio 消息后, 发到rabbitmq 按时序进行处理 ...

  6. JavaWeb-SpringSecurity自定义登陆页面

    系列博文 项目已上传至guthub 传送门 JavaWeb-SpringSecurity初认识 传送门 JavaWeb-SpringSecurity在数据库中查询登陆用户 传送门 JavaWeb-Sp ...

  7. Centos7下设置MySql自动启动

    原文链接:http://www.cnblogs.com/Sungeek/p/9687565.html 1.将服务文件拷贝到init.d下,并重命名为mysql cp /usr/local/mysql/ ...

  8. PHP依赖管理工具Composer入门

    作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://weizhifeng.net/manage-php-dependency-wi ...

  9. zookeeper系列(八)zookeeper客户端的底层详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步:  一.前言 ...

  10. koa 基础(四)get 传值 以及获取 get 传值

    1.get 传值 以及获取 get 传值 app.js /** * get 传值 以及获取 get 传值 */ // 引入模块 const Koa = require('koa'); const ro ...