in "思考python:如何像计算机科学家一样思考" ,作者定义了 postcioncition as:
函数结束之前应满足的要求。
他还指出:
相反,功能结束时条件是后条件。 后条件包括该功能的预期效果(例如 绘制线段(和任何副作用(例如移动乌龟或 进行其他更改(。
因此,假设我们有一个称为 fortorial 的函数,该函数具有所需的参数,称为 n ,不是预期的 postciption 它必须(即需要(返回一个正整数,该整数代表来自 1 到 n 的数字的乘积? castorial 结束后是否满足此要求?
这个定义对吗?
将定义后条件为"函数结束后应满足的要求"。对吗?
注意:我是编程的初学者,尤其是Python。
后条件是"函数结束时必须是正确的要求",即:在函数结束的确切时刻,没有发生任何事情,函数的后条件必须是正确的。
您书中的定义实际上与此相一致:如果后条件在函数结束之前满足后条件,则,并且该函数不会执行任何会使条件false false 的事情当然,在功能结束时,后条件将是正确的。
您的定义是也与此相一致的是,在功能结束后,其后条件必须为真。
我认为这里的主要问题是"满足"一词的定义。如果我们采取"满足条件"的意思是"使该条件成为真实"(这似乎是您的书使用的定义(,那么后条件必须在功能运行和返回之前的某个时刻变为真实在函数执行结束的那一刻要正确。如果您将"满意"表示为"使条件是真实的"(这似乎是您使用该单词的方式(,那么您的定义是有道理的 - 函数结束后,其后条件必须为真。
语义!
对于它的价值,在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个,加载常数。
但是,还有更复杂的事情,例如内部return
的try
?
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
在函数实际返回之前,最后 still 中执行的所有内容 - 因此,后条件的定义为
函数结束之前应满足的要求。
仍然完全有效。
定义"在之前应满足函数的要求。"是正确的。
考虑函数 create_logger(file_name)
它采用字符串参数和file_name,返回给定file_name的文件流,该文件流可用于编写日志消息。
在这种情况下,后条件是返回的对象是可写的文件流(功能的主要目的(。
此外,它还可以确保清除任何具有相同名称的文件(房屋保管/清理活动(。
并且有足够的空间/权限将写入新创建的文件(理智检查(。
可以为主要目标和理智检查创建后条件。在函数执行期间和返回之前,这将在某个时候变为真。
但是,在函数返回后,这些条件无需保持真实。因此," 之后的函数应满足的要求。"是不正确的。
例如,在函数返回后的某个点,磁盘可能会填充,返回的文件流对象可能不再可写。