什么是函数接口(在 Python 中)?

Ius*_*sar 3 python interface function

在 Allen Downey 的 Python 2.x 的“Think Python, version 2.0.17”中,Downey 对函数的接口是这样说的:

函数的接口是对它如何使用的总结:参数是什么?函数有什么作用?返回值是多少?如果一个界面“尽可能简单,但不简单”,那么它就是“干净的”。(爱因斯坦)”

我完全不明白这一点。接口是一个书面摘要,如文档字符串,附加到函数的某个地方吗?或者它完全是别的东西?

我是一个完整的编程初学者,所以我没有很多背景可以借鉴。在我目前(非常低)的水平上,我找不到任何我能理解的解释!

快速示例(虽然不是回答问题所必需的):唐尼谈到了画圆圈(在海龟世界的背景下)。他的功能是

def circle(t, r):
    circumference = 2 * math.pi * r
    n = 50
    length = circumference / n
    polygon(t, n, length)
Run Code Online (Sandbox Code Playgroud)

其中t是来自 Turtleworld 的海龟(他称之为 Bob),r是要绘制的圆的半径。Polygon 是一个函数,它将海龟、n多边形的边数和(其边的)长度作为参数,并用这些规格绘制多边形。足够高n,这看起来像一个圆圈。

然后他评论道:

该解决方案的一个限制是它n是一个常数,这意味着对于非常大的圆,线段太长,而对于小圆,我们浪费时间绘制非常小的线段。一种解决方案是通过将函数n作为参数来泛化该函数。这会给用户(无论谁调用circle)更多的控制,但界面会不那么干净。

再次,什么接口?什么是接口?好吧,让我们暂缓一下。

在这个例子中,r 属于接口,因为它指定了要绘制的圆。n不太合适,因为它涉及如何渲染圆的细节。与其把界面弄得乱七八糟,不如选择一个合适的值n取决于circumference

def circle(t, r):
    circumference = 2 * math.pi * r
    n = int(circumference / 3) + 1
    length = circumference / n
    polygon(t, n, length)
Run Code Online (Sandbox Code Playgroud)

什么?你不想弄乱界面(不管那是什么),所以你……弄乱了界面?还是功能?还是函数体?我的意思是,我不知道接口是什么,但不管它是什么——这个解决方案看起来只会让整个函数更加混乱,而不仅仅是添加一个参数。

而且,鉴于我目前还没有遇到关于函数在任何地方如何使用的书面总结,我开始认为我对唐尼函数接口定义的解释是完全错误的。

同样,这只是一个例子,我想强调的是,我想了解函数接口的一般含义,而不仅仅是与这种具体情况有关。但我认为,这个例子是一个好的开始。

Mar*_*ers 7

界面是其他人看到的。当有人必须使用这个函数时,他们必须知道它的名称、它接受的参数以及它会产生什么样的结果。

举一个不同的例子:你现在可能知道这个print()函数会做什么。你不必知道这个函数是如何工作的,你只知道调用它时它会做什么,你知道可以传递给它什么类型的东西。要使用该print()功能,您需要知道的所有事情就是界面。

您在问题中也使用了这个概念。您向我们解释了该polygon()函数的作用:

Polygon 是一个函数,它将海龟、n多边形的边数和(其边的)长度作为参数,并用这些规格绘制多边形。

当你这样做时,你描述了那个函数的接口。

现在,为什么添加n作为参数来circle()弄乱界面?因为您作为用户现在必须了解您需要提供什么价值n。并且要了解您需要更多地了解实际实现如何绘制圆圈。理想情况下,您作为调用者不需要知道这个实现细节。你只是想要一个圆,为什么函数不能那样做,为什么需要知道涉及多少段。

什么能和不能创造一个干净的界面是主观的,这是你在编写软件时建立的一种感觉。我现在不会太担心这个。