Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是";功能在结束前应满足的要求。”;在Python中正确定义后置条件?_Python_Python 3.x_Factorial_Design By Contract_Post Conditions - Fatal编程技术网

是";功能在结束前应满足的要求。”;在Python中正确定义后置条件?

是";功能在结束前应满足的要求。”;在Python中正确定义后置条件?,python,python-3.x,factorial,design-by-contract,post-conditions,Python,Python 3.x,Factorial,Design By Contract,Post Conditions,在“思考Python:如何像计算机科学家一样思考”中,作者将后条件定义为: 函数在结束前应满足的要求 他还说: 相反,函数末尾的条件是后置条件。 后置条件包括功能的预期效果(如 绘制线段)和任何副作用(如移动海龟或 进行其他更改) 因此,假设我们有一个名为factorial的函数,它有一个名为n的必需参数,它的预期后条件不是必须(即必须)返回一个表示从1到n的数字乘积的正整数吗?阶乘结束后,这个要求不满足吗 这个定义正确吗 将后置条件定义为“功能结束后应满足的要求”是否正确 注意:一般来说,我是

在“思考Python:如何像计算机科学家一样思考”中,作者将后条件定义为:

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

他还说:

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

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

这个定义正确吗

将后置条件定义为“功能结束后应满足的要求”是否正确

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

后条件是“函数结束时必须为真的要求”,即:在函数结束的确切时刻,函数的后条件必须为真

你书中的定义实际上与此有点一致:如果函数在结束前满足后条件,并且函数没有做任何使条件为false的事情,那么在函数结束时后条件当然为true

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

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


语义

值得一提的是,在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

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中的所有内容仍然在函数实际返回之前执行-因此后条件的定义为

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

仍然是完全有效的。

定义“功能在结束前应满足的要求”是正确的

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

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

但是,在函数返回后,这些条件不必保持为真。因此,“功能结束后应满足的要求”是不正确的。

例如,在函数返回后的某个时间点,磁盘可能已满,返回的文件流对象可能不再可写。

考虑使用一个参数并返回它的函数标识。谢谢你,Pedro。“使该条件为真”和“使该条件为真”之间有什么区别?“使该条件为真”意味着该条件以前为假,某些操作会将其变为真。使用“满足”表示改变条件真值的动作。“条件为真”只意味着条件已经满足,不涉及任何操作。