我正在阅读一本编程入门书,其中列出了一个伪代码中的简单示例:
Start
input myNumber
set myAnswer = myNumber * 2
output myAnswer
Stop
我们为什么不能省略创建另一个名为的变量,myAnswer
而只是将操作放入输出命令中,如下所示:
Start
input myNumber
output myNumber * 2
Stop
为什么前者正确而后者不正确?
我正在阅读一本编程入门书,其中列出了一个伪代码中的简单示例:
Start
input myNumber
set myAnswer = myNumber * 2
output myAnswer
Stop
我们为什么不能省略创建另一个名为的变量,myAnswer
而只是将操作放入输出命令中,如下所示:
Start
input myNumber
output myNumber * 2
Stop
为什么前者正确而后者不正确?
Answers:
您可以,但另一个可以,这样您就可以看到发生了什么,因此可以myAnswer
稍后在程序中使用。如果使用第二个,则不能重复使用myAnswer
。
因此,稍后在程序中您可能想要:
myAnswer + 5
myAnswer + 1
etc.
您可能要使用其他操作。
考虑交换数字:
Start
input myNumber
set myAnswerA = myNumber * 2
output myAnswerA
set myAnswerB = myNumber * 3
output myAnswerB
set temp = myAnswerA
set myAnswerA = myAnswerB
set myAnswerA = temp
output myAnswerA
output myAnswerB
Stop
没有变量,那将是困难的。计算机书籍是真正的基础知识,大多数编程都很容易,直到您看到复杂性为止。大多数内容在教程中都是微不足道的,而且只有在复杂性方面,您才知道事情在哪里有意义。
result
即使对于短函数也要创建一个变量,因此通过添加进行调试print(result)
确实非常快。不过,这样做不是出于便利,而是出于良好的实践。
另一个原因是,赋值set myAnswer = myNumber * 2
给结果值命名。阅读两行代码的人只知道它会打印出的值myNumber * 2
。一个人阅读这三个行版本可以看到,myNumber * 2
就是答案。
这似乎并不重要,在这样一个简单的例子,但有时,分配结果值与一个有意义的名称的变量可以使很多方便其他程序员阅读和理解你的代码。
i
,result
或其他无意义的标识符不会提高清晰度,只会使代码混乱
i
最好是一个数组索引。如果存在result
,则功能应以return result
或道德上的等同物结尾。依此类推...
return result
,则最好内联以返回分配给结果的任何内容。我们可以看到结果。您归还了,我们知道了。
那是伪代码。它不应该是任何特定的实现语言。
某些编程语言不支持对表达式求值,然后将结果输出到同一行代码中。例如,大多数汇编程序都不支持。也许这本书的作者想以低级的方式展示事物。
其他答案已经解决了具体的机械细节,并举例说明了一种或另一种形式何时会更好的方法,但是我想提一点更深层次的背景,从哲学上讲:
您正在学习一门语言。
语言是一种可以表达和理解(交流)思想的东西。计算机编程语言具有附加的属性,可以由设计用来根据使用该语言指定并提供的想法(决策)采取行动(执行)的机器机械地对其进行解析。
在所有有用的语言中,都有不止一种表达该语言可表达思想的方法。
考虑英语中可用的各种细微差别。甚至是一个简单的句子,例如
猫跳到箱子上。
可以改变,以表达稍有不同的想法,或将重点放在场景的不同部分,同时指的是相同的物理宇宙动作。
首先是语法变体:
那箱子被猫跳了上去。
猫跳到箱子上。
然后是越来越广泛的变化,仍然指的是相同的身体动作:
盒子在猫的撞击下摇了摇。
那只猫在盒子的顶部摔了一跤。
猫轻轻地跳到空中,整齐地落在附近的盒子上。
只要看看最后一句话中“附近”一词的含义即可。它的包含传达了一个全新的概念范围,而其他方面则是不存在的。
有始终做到这一点,方法不止一种 Python的禅与此相反。
当然,将有一种方法可以完美地表达您的意图,并且最合适,就像您仅根据想要传达的内容选择上面的一个英语句子一样。 这就是Python的Zen。
但是在一个编程课程或介绍英语课程,你必须先了解各种方式(字眼,代码段),在其中您可以沙发的想法之前,你会发展的判断,选择这是最完美的配合。
__init__
和__new__
,仅举几例。关键是每种方法都适用于稍有不同的问题。您不会随机选择这些英语句子之一,也不会随机选择这些Python语言功能之一。
您只在询问myAnswer
似乎多余的变量。其他答案已经解释了省略或使用它的原因和时间,其中还有一些:还有什么呢?
Start
output input * 2
Stop
甚至那个
Start output input * 2 Stop
在大多数语言中,这仍然有效,但是您可以阅读吗?这很困难,因此我们经常使用辅助变量,因为计算机不是唯一读取代码的计算机。我们需要对其进行维护并在几个月后理解它,而编写代码甚至更困难,之后您仍然无法理解它,然后再编写一个可以正常工作的代码……通常仅几天之后,您就不知道为什么要以特定方式进行操作。
(*2)
。但是,我要反对的是,执行输入不一定可以安全地表示为仅访问变量/执行算术运算:它可能具有明显的副作用。
您可以同时使用这两种变体(在这种简单情况下),但是对于更复杂的情况,第一种变体变得更具可读性和结构化。第一个变体显示IPO模型,每一步用一行(其中两个已经使用正确的名称):
Start
input myNumber // Input
set myAnswer = myNumber * 2 // Process
output myAnswer // Output
Stop