初学者:为什么输出命令中不包含操作?


23

我正在阅读一本编程入门书,其中列出了一个伪代码中的简单示例:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

我们为什么不能省略创建另一个名为的变量,myAnswer而只是将操作放入输出命令中,如下所示:

Start
  input myNumber
  output myNumber * 2
Stop

为什么前者正确而后者不正确?


39
书上说你不能吗?
图兰斯·科尔多瓦

2
这本书没有说我不能;它什么也没说。
user1475207

5
我认为从较短的第二个块开始,然后在需要时转换为第一个块是很合理的。
Mateen Ulhaq

13
简短的答案:您可以,作者只是这样做(尝试)以使其更加清晰(尽管说实话,它实际上可能根本没有使其更加清晰……)。
Jules'7

1
两种方式都可以。有了更多的经验,您会发现,对于严肃的代码而言,可读性比代码的简单性或独创性更为重要。您的代码应被许多其他维护它的人员轻松阅读。
Frantisek Kossuth

Answers:


36

您可以,但另一个可以,这样您就可以看到发生了什么,因此可以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

没有变量,那将是困难的。计算机书籍是真正的基础知识,大多数编程都很容易,直到您看到复杂性为止。大多数内容在教程中都是微不足道的,而且只有在复杂性方面,您才知道事情在哪里有意义。


1
因此,这是有效的逻辑,但不是最佳实践,因为它不允许我在程序的其他部分重用该操作?
user1475207

@ user1475207参见我的编辑。在这个小程序中,没关系。作者知道您要做的不只是以后输出值。您只会看到复杂的情况。坚持下去。
约翰尼

嗯,我明白了。考虑到这一点,我将继续阅读本书。谢谢。
user1475207

29
@ user1475207两种方式都有它们的位置。有时您可能必须使用额外的变量。有时您可能不需要多余的变量,但无论如何仍要使用它,因为在某些情况下,仅给出一个经过深思熟虑的名称会使它更加清楚。有时您不想使用多余的变量,因为它只会增加噪音。很多时候,差异并不重要。
8bittree '17

3
我认为返回操作结果而不事先将其分配给变量是有效的。但是我习惯于result即使对于短函数也要创建一个变量,因此通过添加进行调试print(result)确实非常快。不过,这样做不是出于便利,而是出于良好的实践。
右腿

33

另一个原因是,赋值set myAnswer = myNumber * 2给结果值命名。阅读两行代码的人只知道它会打印出的值myNumber * 2。一个人阅读这三个行版本可以看到,myNumber * 2就是答案

这似乎并不重要,在这样一个简单的例子,但有时,分配结果值与一个有意义的名称的变量可以使很多方便其他程序员阅读和理解你的代码。


10
+1,尽管在名称有意义时才适用。使用像这样的临时var命名为iresult或其他无意义的标识符不会提高清晰度,只会使代码混乱
Alexander-Reinstate Monica

7
@亚历山大:毫无意义的名字仍然有意义。 i最好是一个数组索引。如果存在result,则功能应以return result或道德上的等同物结尾。依此类推...
凯文(Kevin)

6
@Kevin“毫无意义的名字仍然有意义”呃...确定吗?大声笑
亚历山大–恢复莫妮卡

3
@Kevin如果要转到return result,则最好内联以返回分配给结果的任何内容。我们可以看到结果。您归还了,我们知道了。
亚历山大-恢复莫妮卡

5
@Alexander:显然,如果它是一个简单的表达式,则可以内联返回​​值,但是如果需要在多个语句上构建返回值,该怎么办?使用一致的命名方案可以使您清楚地了解这些情况。
凯文

14

那是伪代码。它不应该是任何特定的实现语言。

某些编程语言不支持对表达式求值,然后将结果输出到同一行代码中。例如,大多数汇编程序都不支持。也许这本书的作者想以低级的方式展示事物。


2
并且某些语言(例如C)同时允许两种语言-如果您确实愿意,可以编写诸如“输出(answer = answer * 2)”之类的东西!(但要小心,而不是“输出(answer ==答案* 2)”意味着完全不同的东西……
alephzero

9

其他答案已经解决了具体的机械细节,并举例说明了一种或另一种形式何时会更好的方法,但是我想提一点更深层次的背景,从哲学上讲:

您正在学习一门语言。

语言是一种可以表达和理解(交流)思想的东西。计算机编程语言具有附加的属性,可以由设计用来根据使用该语言指定并提供的想法(决策)采取行动(执行)的机器机械地对其进行解析。

在所有有用的语言中,都有不止一种表达该语言可表达思想的方法。


考虑英语中可用的各种细微差别。甚至是一个简单的句子,例如

猫跳到箱子上。

可以改变,以表达稍有不同的想法,或将重点放在场景的不同部分,同时指的是相同的物理宇宙动作。

首先是语法变体:

那箱子被猫跳了上去。

猫跳到箱子上。

然后是越来越广泛的变化,仍然指的是相同的身体动作:

盒子在猫的撞击下摇了摇。

那只猫在盒子的顶部摔了一跤。

猫轻轻地跳到空中,整齐地落在附近的盒子上。

只要看看最后一句话中“附近”一词的含义即可。它的包含传达了一个全新的概念范围,而其他方面则是不存在的。


始终做到这一点,方法不止一种 Python的禅与此相反。


当然,将有一种方法可以完美地表达您的意图,并且最合适,就像您仅根据想要传达的内容选择上面的一个英语句子一样 这就是Python的Zen。

但是在一个编程课程或介绍英语课程,你必须先了解各种方式(字眼,代码段),在其中您可以沙发的想法之前,你会发展的判断,选择这是最完美的配合。


3
当然,Python打破了自己的规则。您有lambda和嵌套函数;循环,列表推导和生成器表达式;浮点数,小数和分数;和__init____new__,仅举几例。关键是每种方法都适用于稍有不同的问题。您不会随机选择这些英语句子之一,也不会随机选择这些Python语言功能之一。
凯文

1
@Kevin,是的,同意。问题的关键是,有人全新的编程,所需的语法的正确性可以使它看起来只有一个办法什么都可以实现,即复制确切的代码教程逐字,类似于如何中学数学题(573 x 247)只有一个正确的答案。另请参阅“ 缩小文件程序是什么?”之类的问题。如果您阅读了我的回答,我并不是说随意做任何事情;我是说,一直在进行选择时,你的程序。
通配符,1:

1
那当然是公平的。我认为问题在于您有点简化/歪曲了Python的Zen。重点在于,这些决定最终取决于问题的轮廓,而不是您可以自由选择的选择。您可能需要经过大量的迭代和重构才能找到一种实现方法,一种完全适合您的要求的方法是可读,简洁,甚至优雅。但是,对于任何给定的问题,都应该有一个理想的解决方案,精心设计的语言将逐步引导您迈向这一目标。那就是禅宗的意思。
凯文(Kevin)

4
一个愤世嫉俗的人可能会说:“在Python中,只有一种方法可以做到这一点,但是每个新版本的Python都将“并且现在
有了

3
PEP20的话:“应该有一种(最好只有一种)明显的方法。尽管起初除非您是荷兰人,否则这种方法可能并不明显。”
vaxquis

5

您只在询问myAnswer似乎多余的变量。其他答案已经解释了省略或使用它的原因和时间,其中还有一些:还有什么呢?

Start
  output input * 2
Stop

甚至那个

Start output input * 2 Stop

在大多数语言中,这仍然有效,但是您可以阅读吗?这很困难,因此我们经常使用辅助变量,因为计算机不是唯一读取代码的计算机。我们需要对其进行维护并在几个月后理解它,而编写代码甚至更困难,之后您仍然无法理解它,然后再编写一个可以正常工作的代码……通常仅几天之后,您就不知道为什么要以特定方式进行操作。


2
...甚至只是(*2)。但是,我要反对的是,执行输入不一定可以安全地表示为仅访问变量/执行算术运算:它可能具有明显的副作用。
大约

2

您可以同时使用这两种变体(在这种简单情况下),但是对于更复杂的情况,第一种变体变得更具可读性和结构化。第一个变体显示IPO模型,每一步用一行(其中两个已经使用正确的名称):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.