目录
- 什么是函数
- 函数的嵌套调用
- 高阶函数
- 我们思考一下计算圆形和方形的面积
- 为何高阶函数能够降低维度
- 总结
什么是函数
每个语言都有函数,甚至大家用的Excel里面也有函数,我们以前学习的数学也很多各种各样的函数。
Python中的函数也是一样的。
?123def
f(x):
print
(
"参数为:"
,x)
return
x
这里的函数 y = f(x), 在数学中表示为一条斜率为1的直线。
函数的嵌套调用
?12345def
z(x):
pass
def
f(x):
print
(
"参数为:"
,x)
return
z(x)
像这样,我们在f(x)中调用了z(x)函数(这里使用了pass关键字,实现先不写,仅作展示目的)
我们能不能不定义z(x)就定义一个函数调用别的函数呢?
就像实现一个数的平方,函数的‘平方',大概这个意思。
高阶函数
?12def
f(z):
return
z()
这就是高阶函数,f函数需要外界提供一个参数,这个参数必须是一个函数。
在使用f(z)的时候,我们不能给一个f(2), f(3)这样的值。或者有个函数如d(x)返回非函数值结果,我们不能这样调用:f(d(1))。
学委准备了下面的代码,从简单函数逐步演化为高阶函数:
?1234567891011121314151617181920212223242526272829303132#!/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弹性非常大,因为第三个参数为函数。
高阶函数可以帮助我们把计算‘降维'(三维变成二维,二维变一维)。
我们思考一下计算圆形和方形的面积
相信大家闭着眼都能写出下面两个函数:
?12345678910111213#!/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个参数的,有的有两个的怎么变成高阶函数?
读者可以思考一会。
下面是代码:
?1234567891011121314151617181920212223#!/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))
结果如下图:
这只是一种解法。
从代码可以看到,我们把圆形和矩形都看作某一个参照物(半径/一条边)的平方,再成乘以一个系数。
下面,我们把正方形面积计算加上:
?123456789101112131415161718192021222324252627#!/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函数:
?1lambda
参数
1
, 参数
2
,。。。,第n个参数 : 计算表达式
上面的函数relation函数可以省略不写,最后调用改为:
?123print
(
"长方形面积:"
, 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))
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
您可能感兴趣的文章:- Python常见内置高阶函数即高阶函数用法
- Python技巧匿名函数、回调函数和高阶函数
- Python全栈之迭代器和高阶函数
- 深入了解python高阶函数编写与使用
- python 高阶函数简单介绍
- 一篇文章带你学习Python3的高阶函数