高阶函数

高阶函数:一个函数可以接收另一个函数作为参数 或 一个函数可以返回一个函数作为返回值,这种函数称之为高阶函数。

#函数 add 接收 f 函数作为参数
>>> def add(x,y,f):
... return f(x)+f(y)
...
>>> add(-5,6,abs)
11

可以把匿名函数作为返回值返回

#把匿名函数作为返回值返回
def build(x, y):
return lambda: x * x + y * y

匿名函数

关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数

>>> list(map(lambda x:x*x,list(range(1,10))))
[1, 4, 9, 16, 25, 36, 49, 64, 81] def f(x):
return x*x
>>> from hello import f
>>> list(map(lambda x:x*x,list(range(1,10))))
[1, 4, 9, 16, 25, 36, 49, 64, 81] #这两种方式等价,不过第一种代码量更少。
def f(x):
return x*x #等价于 lambda x:x*x

返回函数

比如我们实现一个求和函数:

def calc_sum(*args):
ans=0
for i in args:
ans+=i
return ans

但是如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?

可以不返回求和的结果,而是返回求和的函数:

def lazy_sum(*args):
def sum():
ans=0
for i in args:
ans+=i
return ans
return sum
#调用
>>> L=list(range(1,11))
>>> f=lazy_sum(*L) #返回的函数并没有立刻执行,而是直到调用了f
>>> f()
55

在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum ,并且,内部函数 sum可以引用外部函数 lazy_sum 的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

当我们调用 lazy_sum() 时,每次调用都会返回一个新的函数,即使传入相同的参数:

>>> f1=lazy_sum(*L)
>>> f2=lazy_sum(*L)
>>> f1==f2
False

一个关于“闭包”的示例:

def count():
fs=[]
for i in range(1,4): #每次循环都创建了一个新的函数,然后把创建的3个函数都返回了
def f():
return i*i
fs.append(f)
return fs
#调用
>>> f1,f2,f3=count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

怎么都是9 ?!

原因在于返回的函数引用了变量 i ,但它并非立刻执行。等到三个函数都返回时,它们所引用的变量 i 已经变成了 3,因此最终结果为9......

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

def count():
fs=[]
for i in range(1,4):
def f(i):
def g():
return i*i
return g
fs.append(f(i))
return fs
#调用
>>> from hello import count
>>> f1,f2,f3=count()
>>> f1()
1
>>> f2()
4
>>> f3()
9

利用 lambda 函数简化:

def count():
fs=[]
for i in range(1,4):
def f(i):
return lambda :i*i
fs.append(f(i))
return fs

练习:利用闭包返回一个计数器函数,每次调用它返回递增整数

def count_num():
f=[0]
def count():
f[0]=f[0]+1
return f[0]
return count
>>> from hello import count_num
>>> f=count_num()
>>> f()
1
>>> f()
2
>>> f()
3
>>>

高阶函数——map

map() 函数接收两个参数,一个是函数,一个是Iterable , map将闯入的函数一次作用到序列的每个元素,并把结果作为新的 Iterator 返回

用 map 实现把一个函数 f(x)=x*x ,作用在一个 list 上后的结果输出:

>>> L=range(1,11)
>>> L=list(range(1,11))
>>> r=map(lambda x:x*x,L)
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

高阶函数——reduce

reduce() 函数是接受两个参数,把一个函数最用在一个序列上,reduce 把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

用reduce 实现序列求和

>>> from functools import reduce #使用reduce函数需先import
>>> L=list(range(1,11))
>>> reduce(lambda x,y:x+y,L)
55

用reduce 实现把一个整数序列变成整数

>>> L=list(range(1,10))
>>> reduce(lambda x,y:x*10+y,L)
123456789

用reduce + map 实现str 转换为 int 的函数

>>> def char_num(c):
... digits={'':0,'':1,'':2,'':3,'':4,'':5,'':6,'':7,'':8,'':9}
... return digits[c]
...
>>> reduce(lambda x,y :x*10+y,list(map(char_num,'')))
13654

python 有内置的str 与int 互化的函数

>>> str(4515)
''
>>> int('')
5252

练习:利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

Python基础笔记:函数式编程:高阶函数、返回函数、匿名函数的更多相关文章

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

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

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

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

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

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

  4. Python基础:函数式编程

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

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

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

  6. python基础之函数式编程、匿名函数、内置函数

    一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...

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

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

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

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

  9. [Python3] 035 函数式编程 高阶函数

    目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...

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

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

随机推荐

  1. 「CF126B」Password

    题目描述 给定一个字符串 \(S\),我们规定一个字符串 \(P\) 是可行解,\(P\) 需要满足: \(P\) 是 \(S\) 的前缀 \(P\) 是 \(S\) 的后缀 \(P\) 出现在 \( ...

  2. ubuntu14 安装Node.js

    @brief ubuntu  安装Node.js @date 2018-06-28 @see Ubuntu 上安装 Node.js(https://www.runoob.com/nodejs/node ...

  3. jmeter实现文件下载

    通过浏览器下载文件时,会提示选择保存路径,但是利用测试工具jmeter请求时,在页面看到请求次数是增加了,而本地没有具体下载下来的文件. 需要在具体的文件下载请求下面,添加后置处理器-bean she ...

  4. 二十、oracle通过复合索引优化查询及不走索引的8种情况

    1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...

  5. 报错信息 Context []startup failed due to previous errors

    文章转自:http://blog.sina.com.cn/s/blog_49b4a1f10100q93e.html 框架搭建好后,启动服务器出现如下的信息: log4j:WARN No appende ...

  6. golang Context for goroutines

    概要 goroutine 的控制 取消控制 超时控制 goroutine 之间的传值 总结 概要 golang 的提供的 channel 机制是基于 CSP(Communicating Sequenc ...

  7. 用python写测试数据文件

    f是指向文件的指针,r是转义字符,可以让字符串中的\保持不被转义.路径点属性查然后加上当前文件. 'w'表示只写,‘r’表示只读. import random 导入random数 s = []开一个空 ...

  8. MQTT 协议学习:003-MQTT通信流程介绍

    背景 有关博文:通信报文的构成 . 上一讲说到可变头与消息体要结合不同的报文类型才能够进行分析(实际上,官方的文档的介绍顺序就是这样的) 那么,我们就来具体看看有关的报文类型. 在此之前 我们捋一捋完 ...

  9. java 十大经典排序算法

    十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示:这还 ...

  10. [Codeforces] #603 (Div. 2) A-E题解

    [Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...