Allen Downey" Think Python,版本2.0.17"对于Python 2.x,唐尼有一个关于函数接口的说法:
函数的接口是对其使用方式的总结:参数是什么?什么 功能呢?什么是回报值?如果界面是“as”,那么界面是“干净的” 虽然简单,但并不简单。 (爱因斯坦)”
我根本得不到这个。接口是一个书面摘要,如文档字符串,是否附加到函数的某个位置?或者它完全是另一回事?
我是一个完整的编程初学者,所以我没有太多的背景可供借鉴。我无法在目前(非常低的)水平找到任何我能理解的解释!
快速示例(虽然回答问题并非绝对必要):唐尼谈论画圈(在Turtleworld的背景下)。他的职责是
def circle(t, r):
circumference = 2 * math.pi * r
n = 50
length = circumference / n
polygon(t, n, length)
其中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)
什么?你不想弄乱界面(无论是什么),所以你......弄乱了界面?还是功能?还是功能的主体?我的意思是,我不知道界面是什么,但无论它是什么 - 这个解决方案看起来只是整个功能更加混乱,而不仅仅是添加一个参数。
而且,由于我还没有遇到过关于函数如何在任何地方使用的书面摘要,我开始认为我对Downey的函数接口定义的解释都是错误的。
同样,这只是一个例子,我想强调一下,我想了解一般的功能界面,而不仅仅是与这个具体情况有关。但我认为这个例子是一个好的开始。
答案 0 :(得分:1)
界面是其他人所看到的。当有人必须使用此功能时,他们必须知道名称,它接受的参数以及它将产生什么样的结果。
举一个例子:你现在可能知道print()
函数会做什么。你不必知道 这个功能是如何工作的,你所知道的就是它在你调用它时会做什么,你知道你可以传递给它的是什么类型的东西。使用print()
函数需要知道的所有事情都是接口。
您也在问题中使用了这个概念。您向我们解释了polygon()
函数的作用:
Polygon是一个函数,它将乌龟,多边形的边
n
和边长(边长)作为参数,并绘制具有这些规格的多边形。
当你这样做时,你描述了该功能的界面。
现在,为什么将n
作为参数添加到circle()
会使接口混乱?因为您作为用户现在必须了解您需要提供的值n
。并且要了解您需要了解有关实际实现如何绘制圈子的更多信息。理想情况下,作为调用者您不需要了解此实现细节。你只想要一个圆圈,为什么功能不能这样做,为什么需要知道涉及多少段。
什么做和不做一个干净的界面是主观的,你在编写软件时建立一种感觉。我现在不会太担心这个。
答案 1 :(得分:0)
作者似乎在谈论功能签名。
def add(x, y):
pas ##some implementation here
告诉你这个函数需要两件事。 你无法看到里面发生了什么。 如果您查看实现,您可以看到内部发生的情况。
为什么这很重要? 这是一个不同的问题 - 但如果一个函数需要很多参数,那么使用它会让人感到困惑。