高阶函数

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

#函数 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. 「luogu4135」作诗

    「luogu4135」作诗 传送门 分块好题. 预处理出 \(f[i][j]\) 表示 \(i\) 号块到 \(j\) 号块的答案,\(num[i][k]\) 表示 \(k\) 在前 \(i\) 块的 ...

  2. Spring Boot整合Mybatis(注解方式和XML方式)

    其实对我个人而言还是不够熟悉JPA.hibernate,所以觉得这两种框架使用起来好麻烦啊. 一直用的Mybatis作为持久层框架, JPA(Hibernate)主张所有的SQL都用Java代码生成, ...

  3. 设计模式课程 设计模式精讲 19-2 策略模式coding

    1 代码演练 1.1 代码演练1(多态) 1.2 代码演练2(优化应用) 1.3 代码演练3(策略模式结合工厂模式) 1 代码演练 1.1 代码演练1(多态) 需求: 木木网卖课程,为了促进销售,61 ...

  4. 怎样把exe程序注册成系统服务

    怎样把exe程序注册成系统服务 最近一段时间我们公司开发一款新的产品,要在服务器上运行一个服务端程序,为了方便我就希望能将这个程序注册成系统服务开机自动启动而不用每次重启系统都要手动启动程序.要实现这 ...

  5. PyCharm破解安装方法

    1.在3322下载站下好压缩包之后,直接点击安装文件“pycharm-professional-2018.1.exe”进行安装,默认点击“next”下一步进行操作2.选择文件所创建的位置.位置可以选择 ...

  6. three.js的一些介绍

    什么是 WebGL? WebGL(Web 图形库)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,而无需使用插件.WebGL 通过引入一个与 ...

  7. Javaweb实现简单的选课系统(主要技术包括jsp、Servlet、Javabean)

    一.背景信息: 首先,这个选课系统是上周一老师在课堂上让我们做的测试,考试时长三个小时,我只做了一半,也没有实现选课流程. 由于上周忙于写实验报告没有时间继续完成这个测试.这周用前天和昨天一共七个小时 ...

  8. Linux中{ }的用法

    一.生成序列 格式:{#..#},按照ASCII表的顺序进行生成,如{a..c}表示a b c,也可以{c..a}倒叙的形式生成c b a # ..} # echo {z..a} z y x w v ...

  9. 使用redis集群中遇到的错误

    一. 上述错误的原因: 1.在redis服务器上关闭防火墙 2.可能是host写错了 上述错误的原因: 配置文件中jedisClient代表的是单机版的redis,但是在类中转化的时候转化的是集群版

  10. 洛谷 P1094 纪念品分类

    刚开始看到这题就确定这题最好先要排序 第一个想法是排好序后先让第一个和从倒数第一个开始相加和如果就  <= w,那么用n除以2或者再加一得出答案,然后发现随便 当w = 110  n = 5序列 ...