1

《Think Python: How to Think Like a Computer Scientist》中,作者将后置条件定义为:

函数结束前应满足的要求。

他还说:

相反,函数末尾的条件是后置条件。后置条件包括函数的预期效果(如绘制线段)和任何副作用(如移动 Turtle 或进行其他更改)。

所以假设我们有一个名为factorial的函数,它有一个名为n的必需参数,它的预期后置条件不是它必须(即它必须)返回一个表示从1n的数字的乘积的正整数吗?阶乘结束后不满足这个要求吗?

这个定义对吗?

将后置条件定义为“函数结束后应满足的要求”。对吗?

注意:我是编程的初学者,一般来说,尤其是 Python。

4

3 回答 3

1

对于它的价值,在 Python 中,在特定执行分支上的函数中可能发生的任何事情都必须在函数结束之前发生:

In [6]: import dis

In [7]: def fun():
   ...:     return 42
   ...:

In [8]: dis.dis(fun)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

在简单的情况下,只有 42,常量被加载。

但是更复杂一点的东西呢,比如try带有return内部的 a 呢?

In [9]: def fun_with_exceptions():
   ...:     try:
   ...:         return 42
   ...:     finally:
   ...:         print('Returning')
   ...:

结果是:

In [11]: dis.dis(fun_with_exceptions)
  2           0 SETUP_FINALLY            4 (to 6)

  3           2 LOAD_CONST               1 (42)
              4 RETURN_VALUE

  5     >>    6 LOAD_GLOBAL              0 (print)
              8 LOAD_CONST               2 ('Returning')
             10 CALL_FUNCTION            1
             12 POP_TOP
             14 END_FINALLY
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

finally 中的所有内容仍然在函数实际返回之前执行 - 所以后置条件的定义为

函数结束前应满足的要求。

仍然是完全有效的。

于 2017-04-20T19:27:59.607 回答
1

后置条件是“在函数结束时必须为真的要求”,即:在函数结束的确切时刻,没有任何事情发生,函数的后置条件必须为真。

您书中的定义实际上与此有些一致:如果函数在结束之前满足后置条件,并且该函数没有执行任何会使条件变为 false的操作,那么此时后置条件当然会为真函数结束。

您的定义与此一致,即在函数结束后,其后置条件必须为真。

我认为这里的主要问题是“满足”这个词的定义。如果我们将“满足一个条件”理解为“使该条件为真”(这似乎是你的书使用的定义),那么后置条件必须在函数运行时和返回之前的某个时刻变为真,以便它可以在函数执行结束时为真。如果您将“满足”表示“使条件为真”(这似乎是您使用该词的方式),那么您的定义是有意义的——在函数结束后,它的后置条件必须为真。

语义!

于 2017-04-20T19:18:52.663 回答
0

定义“函数结束应满足的要求”。是正确的。

考虑create_logger(file_name)它接受字符串参数和文件名的函数,返回给定文件名的文件流,可用于写入日志消息。

在这种情况下,后置条件是返回的对象是可写文件流(函数的主要目标)。
此外,它还可以确保清除任何以前具有相同名称的文件(内务管理/清理活动)。
并且有足够的空间/权限来写入新创建的文件(完整性检查)。
可以为主要目标和健全性检查创建后置条件。这将在函数执行期间和返回之前的某个时刻变为真。

但是,在函数返回后,这些条件不必保持为真。因此,“功能结束后应满足的要求。” 是不正确的。
例如,在函数返回后的某个时间点,磁盘可能会填满,并且返回的文件流对象可能不再可写。

于 2017-04-20T19:32:59.987 回答