python高级函数,将函数作为变量、返回函数
python中使用函数作为参数
在python中,我们可以用一个变量来存放函数。示例:
a = len
length = a([1,2,3,4,5])
print(length)
在上面我将len()
函数赋值给了变量a
。那么我们以后我们使用len()
函数的的时候就完全可以使用a
这个变量来代替了。
既然我们可以用一个变量来存放函数,那么函数一可以当作一个函数的参数使用。
示例代码:
def add(x,y,f):return f(x)+f(y)result = add(1,-2,abs)
print(result)
在上面的函数中,拥有3个变量,x,y
表示传入的值,f
表示传入的函数
我们在调用此函数的时候就传入了1,-2
两个值,然后将abs
函数传入了进去,(abs()
就是获取值的绝对值)
这样,我们就实现了将函数作为参数传入参数中去。
再例如,我们需要求
这个表达式的值,那么我们可以这样做:
import mathdef add(x,y,f):return f(x)+f(y)result = add(1,-2,abs)
result1 = add(9,16,math.sqrt)
print(result,result1)
这样,我们就可以求出上面表达式的值了。
python中的map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f
依次作用在list
的每个元素上,得到一个新的 list
并返回。
例如,将一个列表中的所有值都变为原来的平方
def func(x):return x*xnew_list = map(func,[1,2,3,4,5,6,7,8,9])for list in new_list:print(list)
需求:假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:
输入:['adam', 'LISA', 'barT']
输出:['Adam', 'Lisa', 'Bart']
代码:
def format_name(s):return s[0].upper() + s[1:].lower()new_list = map(format_name,['adam', 'LISA', 'barT'])
for list in new_list:print(list)
python中的reduce()函数
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数
,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
在python3中,reduce()函数已经从全局函数中移除了,放在fucntools
,所以我们首先得导入从fucntools
中导入reduce()函数
from functools import reducedef add1(x,y):return x+ysum = reduce(add1,[1,3,5,7,9])
print(sum)
执行上面的代码的时候,reduce()函数会做一下计算:
- 先计算头两个元素:f(1, 3),结果为4;
- 再把结果和第3个元素计算:f(4, 5),结果为9;
- 再把结果和第4个元素计算:f(9, 7),结果为16;
- 再把结果和第5个元素计算:f(16, 9),结果为25;
- 由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值
。如果把初始值设为100
,计算:
sum = reduce(add1,[1,3,5,7,9],100)
那么结果将会变成125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。
Python内置了求和函数sum(),但没有求积的函数,我么来尝试一下用reduce()函数求积:
例如:
输入:[2, 4, 5, 7, 12]
输出:2*4*5*7*12的结果
代码:
def prod(x,y):return x*ysum = reduce(prod,[2,4,5,7,12])
print(sum)
这样就能达到我们想要的效果了。
python中filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:是奇数返回True,否则返回False
def is_odd(x):return x%2 == 1
然后使用filter()过滤偶数:
new_list2 = filter(is_odd,[1,2,3,4,5,6,7,8,9])
for list in new_list2:print(list)
这样就能将偶数过滤掉了。
利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):return s and len(s.strip()) > 0new_list4 = filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
for list in new_list4:print(list)
需求:请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
def is_sqr(x):r = int(math.sqrt(x))return r*r == xtest_list = []
for i in range(1,101):test_list.append(i)
new_list3 = filter(is_sqr,test_list)
for list in new_list3:print(list)
python中返回函数
Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!
示例:
def f():print('我是外层函数')def g():print('我是内层函数,被返回的函数')return gf()
print('*'*10)
test = f()
print('*'*10)
test()
然后我们可以查看运行结果
可以看到,当我们执行函数f
的时候,并不会执行里面的函数。当我们用一个变量test
接收f函数
的返回值时,然后再调用test()
才执行了g函数
里面的代码
需求:请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
from functools import reducedef calc_prod(lst):def lazy_prod():def f(x, y):return x * yreturn reduce(f, lst, 2)return lazy_prod
f = calc_prod([1, 2, 3, 4])
result = f()
print(result)
这样就实现了我们的需求了。
python闭包
闭包本身是一个晦涩难懂的概念,在这里我们以简单粗暴地理解为闭包就是一个定义在函数内部的函数
,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
例如:
def func(x):def func1(y):return x + yreturn func1test = func(4)
print(test)
tes1 = test(5)
print(tes1)
在上面的func函数中拥有x变量,但是在func1函数中并没有x变量,但是因为python中函数支持闭包操作,也就是在函数中定义一个函数可以访问函数范围之外的变量。
python中lambda表达式
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。其一般有如下几种使用方式:
f= lambda x: x*x
print(f(3))
上面的代码相当于
def test(x):return x*x
print(test(3))
参考连接:https://www.imooc.com/video/6064
python高级函数,将函数作为变量、返回函数相关推荐
- Python函数式编程简介(二)返回函数
本文为Python函数式编程的第二部分主要讲解返回函数和闭包 2.返回函数 2.1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常 ...
- python函数实例解析_python支持返回函数的实例解析
这篇文章主要介绍了python支持返回函数的实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近接触python,看到了python中返回函数的概念,以前只接触过 ...
- python变量必须以字母和下划线_【转载】关于python中带下划线的变量和函数的意义...
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...
- python中变量和函数的区别_关于python中带下划线的变量和函数 的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- 关于python中带下划线的变量和函数 的意义
转载:https://www.cnblogs.com/wangshuyi/p/6096362.html 总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问 ...
- 关于python中带下划线的变量和函数 的意义,class类带一个下划线和带两个下划线的定义
总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量, 3. 大写加下划线的变量: ...
- python中定义变量为啥要用下划线_关于python中带下划线的变量和函数 的意义
核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始. 一般来讲,变量名_xxx被看作是"私有 ...
- python的高级特性3:神奇的__call__与返回函数
__call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = absIn [1 ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊...
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
最新文章
- ssh tar 命令把远程文件拉回来或推过去
- Compiling: main.cpp /bin/sh: g++: not found
- Js结束,项目进行中
- 数开头的成语有哪些_艺术留学文书申请过程中应避开哪些雷区?ACG艺术留学
- MyBatis中PersistenceException:Error querying database. Cause: org.apache.ibatis.type.TypeException:
- setfacl 权限导出_linux学习-setfacl设置特定目录用户权限
- 豆瓣评分9分+,每一部看完不禁感慨!这里是神州大地!
- tl wn322g linux驱动下载,怎样才能装好tl_wn322G+V2.0版USB无线网卡的Linux驱动
- UG/Open API基础知识-语法1
- api postmain 鉴权_API授权与验证 - 文档中心 - 快代理
- 巴斯勒相机外部触发接线_PLC控制柜的设计原理,电装布局、接线图和原理图
- 视频直播技术(三):低延时直播经验总结
- c / c++ 整数除法 保留小数及浮点型的比较
- 操作系统死锁 四个必要条件
- VHDL实验二::半加器、一位和四位全加器(绘制原理图)
- 使用AT89C51芯片实现生日快乐歌
- 中国电信上海电信光猫路由器设置和外接路由器
- MicroByte蓝牙手柄初探
- 洛谷P1010 [NOIP1998 普及组] 幂次方题解
- 获取手机唯一识别码IMEI