函数式编程 之

高阶函数

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

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. 数据类型之字符串类型与Number类型

    ㈠字符串类型 ⑴在JS中字符串需要使用引号引起来 ⑵使用双引号或单引号都可以,但是不要混着用 ⑶引号不能嵌套,双引号不能放双引号,单引号不能放单引号 ⑷在字符串中,可以使用“\”作为转义字符,当表示一 ...

  2. tar:文件打包归档

    造冰箱的大熊猫@cnblogs 2018/12/24 1.什么是tar 1.1.tar tar命令将指定的文件.文件夹打包(存储)为一个文件(归档文件,archive file).tar将被归档文件以 ...

  3. jmeter下载安装

    jmeter运行依靠java环境 一.根据jmeter版本不同要求java环境则不同 jmeter官网下载地址:http://jmeter.apache.org/download_jmeter.cgi ...

  4. 有趣但是没有用的linux命令

    1,小火车 #yum install sl 2,黑客帝国,代码雨 # wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2 ...

  5. How to Fix Grub error: no such partition Grub Rescue

    错误信息: error: no such partition Entering rescue mode... grub rescue> _ 错误原因: grub找不到文件normal.mod 解 ...

  6. 设置Chart.js默认显示Point点的值不用鼠标经过才显示

    Chart.js默认的显示方式是鼠标经过Point点的时候才会显示这个点的值,代码如下: var testdata: { periodNum: ["2018121","2 ...

  7. yarn application命令介绍

    yarn application 1.-list     列出所有 application 信息    示例:yarn  application -list 2.-appStates <Stat ...

  8. 在Excel中,已知身份证号码,如何批量计算其实际年龄?

    昨天,上司问我:..,你会在Excel中计算年龄吗?当时,一下促住了.说真的,还真不会.今天研究了一下,写下来,方便日后查看. 首先,得有一张已知姓名和相应身份证号的原表吧. 在这张表上再加上三列:出 ...

  9. Cortex-M3 SVC与PendSV

    [SVC] SVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用在上了操作系统的软件开发中.SVC用于产生系统函数的调用请求.例如,操作系统通常不允许用户程序直接访问硬件, ...

  10. UI的流畅度优化

    Android中所有的界面绘制工作都是在UI线程中进行的,提高UI流畅度的最核心根本在于释放UI线程.即:不在主线程中做耗时的操作. 很多人都知道,耗时的操作要放到子线程中去做,比如访问网络,比如读写 ...