python 函数的规格

1,273 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

python 函数的规格

函数的规范定义了函数的实现者与将要编写使用该函数的程序的人员之间的协定。我们将函数的用户称为其客户端。可以将此协定视为包含两个部分:假设:这些条件描述函数的客户端必须满足的条件。通常,它们描述对实际参数的约束。它们几乎总是为每个参数指定可接受的类型集,并且不经常指定一些

对一个或多个参数的值的约束。例如,find_root的规范可能要求电源为

正整数。

保证:这些条件描述函数必须满足的条件,前提是函数的调用方式满足假设。例如,find_root的规范可以保证它返回 None ifasise 以查找不存在的根(例如,负数的平方根)。

函数是一种创建我们可以视为基元的计算元素的方法。它们提供分解和抽象。

分解产生结构。它允许我们将程序分解为合理独立的部分,并且可以在不同的环境中重用。

抽象隐藏了细节。它允许我们使用一段代码,就好像它是一个黑匣子一样 - 也就是说,它的内部细节我们看不到,不需要看到,甚至不应该看到.31抽象的本质是保留与给定上下文相关的信息,并忘记在该上下文中无关的信息。在编程中有效使用抽象的关键是找到一个既适合抽象的构建者又适合抽象的潜在客户的相关性概念。这才是真正的编程艺术。

抽象就是遗忘。有很多方法可以模拟这一点,例如,大多数青少年的听觉设备。

少年说:今晚我可以借车吗?

家长说:是的,但是在午夜之前回来,并确保油箱已满。

少年听到:是的。

这个少年忽略了所有那些他或她认为无关紧要的讨厌的细节。抽象是一个多对一的过程。如果父母说“是的,但是在凌晨2点之前回来,并确保汽车是干净的”,它也将被抽象为“是”。

通过类比,假设你被要求制作一个包含25个讲座的入门计算机科学课程。一种方法是招募25名教授,并要求他们每个人都就他们最喜欢的主题准备一个小时的讲座。虽然你可能会得到25个小时的精彩时间,但整个事情可能会感觉像是皮兰德娄的《寻找作者的六个角色》(或你与15位客座讲师一起选修的政治学课程)的戏剧化。如果每个教授都是孤立地工作,他们就不知道如何将他们讲座中的材料与其他讲座中涵盖的材料联系起来。

不知何故,你需要让每个人都知道其他人在做什么,而不是产生太多没有人愿意参与的工作。这就是抽象的用武之地。你可以写25个规范,每个规范都说明学生应该在每次讲座中学习什么材料,但没有给出任何关于如何教授这些材料的细节。你得到的东西在教学上可能不是美妙的,但至少它可能是有道理的。

这是组织使用程序员团队完成工作的方式。给定一个模块的规范,程序员可以实现该模块,而不必担心团队中的其他程序员在做什么。此外,其他程序员可以使用该规范开始编写使用该模块的代码,而不必担心模块将如何实现。

Eigure 4=7 为图 4-3 中find_root的实现添加了一个规范。

image.png

三重引号之间的文本在Python中称为文档字符串。按照惯例,Python程序员使用文档字符串来提供函数的规范。可以使用内置函数帮助访问这些文档字符串。

Python IDE的一个好处是,它们提供了一个交互式工具来询问内置对象。如果您想知道特定函数的作用,只需在控制台窗口中键入 help(object)。例如,帮助 (abs) 在模块内置的内置函数 abs 上生成文本“帮助”:

image.png

这告诉我们abs是一个将单个参数映射到其绝对值的函数。(参数列表中的 / 表示参数必须是位置参数。如果输入 help(),将启动交互式帮助会话,解释器将在控制台窗口中显示提示帮助>。交互模式的一个优点是,您可以获得有关不是对象的Python构造的帮助。例如,

image.png

如果代码如图4-4所示。已加载到 IDE 中,在外壳中键入帮助(find_root)将显示

image.png

find_root规范是满足规范的所有可能实现的抽象。find_root的客户端可以假设实现符合规范,但他们应该假设仅此而已。例如,客户端可以假定调用find_root(4, 2, 0.01) 返回某个平方介于 3.99 和 4.01 之间的值。返回的值可以是正数或负数,即使 4 是完美的平方,返回的值也可能不是 2 或 -2。至关重要的是,如果不满足规范的假设,则无法假设调用函数的效果。例如,调用find_root (8, 3, 0) 可以返回 2。但它也可能崩溃,永远运行,或者返回一些不靠近立方根8的数字。