Python高阶函数是什么,怎么样应用
Admin 2022-05-21 群英技术资讯 488 次浏览
每个语言都有函数,甚至大家用的Excel里面也有函数,我们以前学习的数学也很多各种各样的函数。
Python中的函数也是一样的。
def f(x): print("参数为:",x) return x
这里的函数 y = f(x), 在数学中表示为一条斜率为1的直线。
def z(x): pass def f(x): print("参数为:",x) return z(x)
像这样,我们在f(x)中调用了z(x)函数(这里使用了pass关键字,实现先不写,仅作展示目的)
我们能不能不定义z(x)就定义一个函数调用别的函数呢?
就像实现一个数的平方,函数的‘平方',大概这个意思。
def f(z): return z()
这就是高阶函数,f函数需要外界提供一个参数,这个参数必须是一个函数。
在使用f(z)的时候,我们不能给一个f(2), f(3)这样的值。或者有个函数如d(x)返回非函数值结果,我们不能这样调用:f(d(1))。
学委准备了下面的代码,从简单函数逐步演化为高阶函数:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello def f1(x): return x def f2(x, z=100): return x + z / 10 def f3(x, z=100, *dynamic_args): sum = 0 for arg in dynamic_args: sum += arg return x + z / 10 + sum / 10000.0 def dummy_sum(*args): return 0 def f4(x, z=100, sum_func=dummy_sum): return x + z / 10 + sum_func() / 10000.0 print(f1(100)) print(f2(100, z=50)) print(f3(100, 50, 4, 5, 6)) def sum_g(*dynamic_args): def sum_func(): sum = 0 for arg in dynamic_args: sum += arg return sum return sum_func print(f4(100, 50, sum_g(4, 5, 6)))
这里我们看到函数f1, f2, f3, f4。
补充一个知识点: *dynamic_args 是一个动态参数,不定长度的参数。
也就是f3明明声明了3个参数,最后我们给了5个参数。
这里f3认为x=100, z=50, dynamic_args = [4, 5, 6]
我们先看看输出结果:
f3 和f4 看起来结果一样。
但是性质完整不一样,读者可以思考十秒。
f4弹性非常大,因为第三个参数为函数。
高阶函数可以帮助我们把计算‘降维'(三维变成二维,二维变一维)。
相信大家闭着眼都能写出下面两个函数:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def rectangle_area(a, b): return a * b
这是圆形面积的数学公式:
f ( r ) = π ∗ r 2
这是矩形面积的数学公式:
f ( a , b ) = a ∗ b
我们看到这里有的有1个参数的,有的有两个的怎么变成高阶函数?
读者可以思考一会。
下面是代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def rectangle_area(a, b): return a * b def area(x, linear, factor): return x * linear(x, factor) def relation(x, factor): return x * factor a = 10 b = 20 print("长方形面积:", rectangle_area(a, b)) print("圆形面积:", circle_area(a)) print("长方形面积:", area(a, relation, factor=b / a)) print("圆形面积:", area(a, relation, factor=math.pi))
结果如下图:
这只是一种解法。
从代码可以看到,我们把圆形和矩形都看作某一个参照物(半径/一条边)的平方,再成乘以一个系数。
下面,我们把正方形面积计算加上:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def square_area(a): return a * a def rectangle_area(a, b): return a * b def area(x, linear, factor): return x * linear(x, factor) def relation(x, factor): return x * factor a = 10 b = 20 print("长方形面积:", rectangle_area(a, b)) print("正方形面积:", square_area(a)) print("圆形面积:", circle_area(a)) print("长方形面积:", area(a, relation, factor=b / a)) print("正方形面积:", area(a, relation, factor=1)) print("圆形面积:", area(a, relation, factor=math.pi))
上面的代码执行结果如下:
这就是高阶函数的神奇之处,我们从正方形的角度思考。
只用一个area函数和relation函数,这两个函数都不必修改,只需要给一个factor(经验因子),就能快速计算它的面积。
从上面距离的计算面积的函数,我们可以看到计算圆形和长方形,都能看成一个一维函数。
然后以正方形面积为参照物,快速估算出圆形和方形的面积。
当然上面的计算圆形面积采用了半径,还不够直观,读者可以自行改为直径,这样factor = math.pi / 4。
这样在感受上会更贴切。
除了上面介绍的函数,参数,高阶函数。我们还可以使用lambda函数:
lambda 参数1, 参数2,。。。,第n个参数 : 计算表达式
上面的函数relation函数可以省略不写,最后调用改为:
print("长方形面积:", area(a, lambda x, f: x * f, factor=b / a)) print("正方形面积:", area(a, lambda x, f: x * f, factor=1)) print("圆形面积:", area(a, lambda x, f: x * f, factor=math.pi))
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在Python的备忘单是用于Python 3的编程语言中的单页参考表。 有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
这篇文章主要给大家介绍了关于Python中os模块的简单使用及重命名操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
问题场景:问题描述原因分析及解决方案:问题场景:在SparkSQL中,因为需要用到自定义的UDAF函数,所以用pyspark自定义了一个,但是遇到了一个问题,就是自定义的UDAF函数一直报Attri
这篇文章主要介绍了Django csrf校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了语义分割任务中Unet一个有意思的模型-Keras。Keras是一个由Python编写的开源人工神经网络库,可进行深度学习模型的设计、调试、评估、应用和可视化。感兴趣的小伙伴快来跟随小编一起学习一下吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008