首页 > 解决方案 > 使用高阶函数发现了一种模式。这种模式叫什么?

问题描述

我正在开发一个 python 项目,在该项目中我经常需要使用matplotlib. 每次生成图形的代码都是相同的。但是,我正在调用我自己的函数,这些函数接受轴对象作为其参数之一并对其进行修改。在我的整个项目中,我调用这些函数的不同组合来填充我的图形轴。

然后我突然想到,我实际上将这些函数本身及其参数的元组传递给了一个更高阶的函数。高阶函数将负责调用函数来填充两个轴对象以生成我的图形。我在下面做了一个玩具示例来说明这一点。

import matplotlib.pyplot as plt
import numpy as np

def A(ax, x, a, b, c):

    y = a*x**2+b*x+c
    ax.plot(x, y)

    return ax

def B(ax, x, a):

    y = a*x**2
    ax.scatter(x, y)

    return ax

def C(ax, n):

    ax.axhline(n)

    return x

def plot(ax1, f1, args1, ax2, f2, args2):

    ax1 = f1(ax1, *args1)
    ax2 = f2(ax2, *args2)

    return ax1, ax2
if __name__=="__main__":
    x = np.linspace(0,10,10)

    fig, (ax1, ax2) = plt.subplots(2, 1)
    ax1, ax2 = plot(ax1, A, (x, 1, 2, 3), ax2, C, (5,))

    plt.show()

    x = np.linspace(0, 10, 10)

    fig, (ax1, ax2) = plt.subplots(2, 1)
    ax1, ax2 = plot(ax1, B, (x, 1), ax2, C, (5,))

    plt.show()

这里的函数plot就是这种高阶函数的一个例子。它可以采用任何功能组合f1f2. 然后它在给定的坐标区对象上调用这些函数以生成图形。该函数plot不关心有多少参数f1f2这使得它足够通用以减少我拥有的重复代码的数量。

这是什么图案?这是装饰器的一个例子吗?如果没有,python 是否有任何内置的语法糖可以在更基础的层面上支持这一点?

标签: pythonmatplotlibdesign-patternsdesign-principles

解决方案


推荐阅读