讲讲Python中的普通函数和高阶函数

简介: 正式的Python专栏第25篇,同学站住,别错过这个从0开始的文章!

今天学委都在写代码,写了很多篇,这次再讲讲python中的函数

什么是函数

每个语言都有函数,甚至大家用的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]


我们先看看输出结果:


image.png

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(r) = \pi * r^2

f(r)=π∗r

2


这是矩形面积的数学公式:

f ( a , b ) = a ∗ b f(a, b) = a * b

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))

结果如下图:

image.png

这只是一种解法。

从代码可以看到,我们把圆形和矩形都看作某一个参照物(半径/一条边)的平方,再成乘以一个系数。

下面,我们把正方形面积计算加上:

#!/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))

上面的代码执行结果如下:

image.png

这就是高阶函数的神奇之处,我们从正方形的角度思考。


只用一个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))
目录
相关文章
|
3天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
17天前
|
Python
python 函数
【9月更文挑战第4天】python 函数
36 5
|
22天前
|
Python
Python 中 help() 和 dir() 函数的用法
【8月更文挑战第29天】
19 5
|
23天前
|
Python
12类常用的Python函数
12类常用的Python函数
|
22天前
|
Python
Python eval()函数的使用
Python eval()函数的使用
18 1
|
3天前
|
Unix 编译器 C语言
[oeasy]python034_计算机是如何认识abc的_ord函数_字符序号_ordinal_
[oeasy]python034_计算机是如何认识abc的_ord函数_字符序号_ord
10 0
|
17天前
|
数据采集 自然语言处理 数据挖掘
python查询汉字函数
简洁、高效、易懂的代码对于提高开发效率与项目质量至关重要,并且对于维持代码的可读性和可维护性也有着很大帮助。选择正确的工具和方法可以大幅提升处理中文数据的效率。在编写用户定义函数时,明确函数的功能与返回值类型对于函数的复用和调试也同样重要。当涉及到复杂的文本处理或数据分析时,不宜过分依赖单一的工具或方法,而应根据具体需求灵活选择和组合不同的技术手段。
22 0
WK
|
18天前
|
测试技术 Python
python中的高阶函数作用
Python中的高阶函数(HOFs)在编程中扮演着重要角色,通过将通用操作封装为可复用的函数,提升了代码的抽象能力和可维护性。它们是实现函数式编程的关键,支持映射、归约、过滤等模式,并简化了回调函数的使用。此外,高阶函数还用于实现装饰器,进一步增强了代码的功能,减少了冗余,提高了代码的可读性和可维护性。
WK
9 0
WK
|
18天前
|
Python
python中的高阶函数有哪些用途
在Python中,高阶函数(HOFs)接受或返回函数,增强了代码的灵活性与复用性。常见的高阶函数包括`map()`、`filter()`、`reduce()`及`sorted()`等,它们分别用于对序列应用函数、过滤元素、累积计算及排序。`reduce()`位于`functools`模块中,而`sorted()`则常与键函数配合使用。此外,`lambda`函数和装饰器也常与高阶函数结合使用,前者提供快速定义匿名函数的方式,后者则在不改变原函数的基础上添加新功能。高阶函数的应用远不限于这些特定函数,任何符合定义的函数都可视为高阶函数。
WK
13 0
WK
|
18天前
|
图计算 开发者 Python
python中的函数有哪些用途
Python中的函数具有多种用途,它们极大地增强了代码的复用性、可读性和可维护性。
WK
12 0