Anfänger: Warum sind Operationen nicht in Ausgabebefehlen enthalten?


23

Ich gehe ein einführendes Programmierbuch durch und es listet ein einfaches Beispiel im Pseudocode auf:

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

Warum können wir nicht auf das Erstellen einer weiteren Variablen verzichten, die aufgerufen wird, myAnswerund die Operation einfach in den Ausgabebefehl einfügen:

Start
  input myNumber
  output myNumber * 2
Stop

Warum ist Ersteres richtig und Letzteres nicht?


39
Sagt das Buch, dass Sie nicht können?
Tulains Córdova

2
Das Buch sagt nicht, dass ich nicht kann; es sagt nichts darüber aus.
user1475207

5
Ich halte es für vernünftig, mit dem kürzeren zweiten Block zu beginnen und ihn dann in den ersten umzuwandeln, wenn Sie ihn benötigen.
Mateen Ulhaq

13
Kurze Antwort: Sie können, der Autor tut dies nur (in einem Versuch), um es klarer zu machen (obwohl es ehrlich gesagt wahrscheinlich überhaupt nicht klarer macht ...).
Jules

1
Beide Wege funktionieren. Mit mehr Erfahrung werden Sie feststellen, dass für eine seriöse Codierung die Lesbarkeit weitaus wichtiger ist als die Einfachheit oder Originalität des Codes. Ihr Code sollte für viele andere, die ihn verwalten, leicht lesbar sein.
Frantisek Kossuth

Antworten:


36

Sie könnten aber die andere ist, damit Sie sehen, was los ist und Sie myAnswerspäter im Programm verwenden können. Wenn Sie Ihr zweites verwenden, können Sie es nicht wiederverwenden myAnswer.

So später im Programm möchten Sie vielleicht:

myAnswer + 5
myAnswer + 1
etc.

Möglicherweise haben Sie andere Operationen, für die Sie es verwenden möchten.

Betrachten Sie den Austausch von Zahlen:

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

Ohne Variablen wäre das schwierig. Computerbücher sind sehr einfach und die meisten Programmieraufgaben sind einfach, bis Sie die Komplexität erkennen. Fast alles ist in Tutorials trivial, und man sieht nur in der Komplexität, wo Dinge Sinn machen oder nicht.


1
Es ist also eine gültige Logik, aber keine bewährte Methode, da ich die Operation nicht in anderen Teilen des Programms wiederverwenden kann.
user1475207

@ user1475207 Siehe meine Bearbeitung. In diesem winzigen Programm spielt es keine Rolle. Der Autor weiß, dass Sie viel mehr tun werden, als den Wert später auszugeben. Das sieht man nur an der Komplexität. Bleib dabei.
Johnny

Ah ok, ich verstehe. In diesem Sinne werde ich das Buch durcharbeiten. Vielen Dank.
user1475207

29
@ user1475207 Beide Wege haben ihren Platz. Manchmal müssen Sie möglicherweise die zusätzliche Variable verwenden. Manchmal brauchen Sie die zusätzliche Variable nicht, möchten sie aber trotzdem verwenden, da es in manchen Situationen viel klarer ist, wenn Sie nur einen durchdachten Namen vergeben. Manchmal möchten Sie die zusätzliche Variable nicht verwenden, da sie nur ein zusätzliches Rauschen darstellt. Und oft spielt der Unterschied keine Rolle.
8bittree

3
Ich denke, es ist gültig, das Ergebnis einer Operation zurückzugeben, ohne es zuvor einer Variablen zuzuweisen. Aber ich habe mir angewöhnt, resultauch für kurze Funktionen eine Variable zu erstellen , damit das Debuggen durch Hinzufügen print(result)sehr schnell geht. Es ist jedoch mehr aus Bequemlichkeit als aus gutem Grund.
Rechtes Bein

33

Ein weiterer Grund: Die Zuweisung set myAnswer = myNumber * 2gibt dem resultierenden Wert einen Namen . Eine Person, die die zweizeilige Version Ihres Codes liest, weiß nur, dass sie den Wert von ausgibt myNumber * 2. Eine Person, die die dreizeilige Version liest, kann sehen, dass dies myNumber * 2die Antwort ist .

In einem solchen trivialen Beispiel mag es nicht wichtig erscheinen, aber manchmal kann das Zuweisen eines Ergebniswerts zu einer Variablen mit einem aussagekräftigen Namen anderen Programmierern das Lesen und Verstehen Ihres Codes erheblich erleichtern.


10
+1, obwohl dies nur gilt, wenn der Name aussagekräftig ist. Mit temporären Vars wie dies genannt i, resultoder eine andere bedeutungslose Kennung tut nichts zur Verbesserung der Klarheit und unübersichtlich nur den Code
Alexander - wieder einzusetzen Monica

7
@Alexander: Bedeutungslose Namen können immer noch bedeutungsvoll sein. iBesser wäre ein Array-Index. Wenn es eine gibt result, sollte die Funktion mit return resultoder dem moralischen Äquivalent enden . Und so weiter ...
Kevin

6
@ Kevin "Bedeutungslose Namen können immer noch bedeutungsvoll sein" uhhh ... bist du dir sicher? lol
Alexander - Reinstate Monica

3
@ Kevin Wenn Sie gehen return result, dann können Sie auch einfach inline zurückgeben, was auch immer Sie dem Ergebnis zuweisen. Wir können sehen, dass es ein Ergebnis ist. Du gibst es zurück, das verstehen wir.
Alexander - Wiedereinsetzung von Monica

5
@Alexander: Natürlich können Sie die Rückgabe inline setzen, wenn es sich um einen einfachen Ausdruck handelt, aber was ist, wenn Sie ihn über mehrere Anweisungen aufbauen müssen? Die Verwendung eines einheitlichen Namensschemas macht deutlich, was Sie in diesen Fällen tun.
Kevin

14

Das ist Pseudocode. Es wird nicht vorausgesetzt, dass es sich um eine bestimmte implementierte Sprache handelt.

Einige Programmiersprachen unterstützen nicht die Auswertung eines Ausdrucks und die Ausgabe des Ergebnisses in derselben Codezeile. Zum Beispiel unterstützen die meisten Assembler dies nicht. Vielleicht wollte der Autor des Buches die Dinge auf einer niedrigen Ebene zeigen.


2
Und einige Sprachen (zum Beispiel C) erlauben beides gleichzeitig - Sie können Dinge wie "Ausgabe (Antwort = Antwort * 2)" schreiben, wenn Sie wirklich wollen! (aber Vorsicht als "Ausgabe (Antwort == Antwort * 2)" bedeutet etwas ganz anderes ...
Alephzero

9

Andere Antworten haben sich mit den spezifischen mechanischen Details und Beispielen befasst, bei denen die eine oder andere Form besser wäre, aber ich möchte einen etwas weiteren Hintergrund erwähnen, der irgendwie philosophisch ist:

Du lernst eine Sprache.

Eine Sprache ist etwas, in dem Ideen ausgedrückt und verstanden (kommuniziert) werden können. Eine Computerprogrammiersprache hat die zusätzliche Eigenschaft, dass sie von einer Maschine, die darauf ausgelegt ist, auf der Grundlage von Ideen (Entscheidungen), die unter Verwendung dieser Sprache spezifiziert und eingegeben wurden, Maßnahmen zu ergreifen (auszuführen), mechanisch analysiert werden kann.

In JEDER Sprache, die überhaupt nützlich ist, gibt es mehr als eine Möglichkeit, fast jede Idee auszudrücken, die in dieser Sprache zum Ausdruck kommt.


Betrachten Sie die Vielfalt der Nuancen, die in der englischen Sprache verfügbar sind. Schon ein einfacher Satz, wie z

Die Katze sprang auf die Kiste.

kann variiert werden, um leicht unterschiedliche Vorstellungen auszudrücken oder die Betonung auf verschiedene Teile der Szene zu legen, während auf dieselbe exakte Aktion des physischen Universums Bezug genommen wird.

Erstens sind grammatikalische Variationen:

Die Kiste wurde von der Katze angesprungen.

Auf die Kiste sprang die Katze.

Dann gibt es immer größere Variationen, die sich immer noch auf dieselbe physische Handlung beziehen:

Die Kiste zitterte unter dem Aufprall der Katze.

Die Katze kam mit einem dumpfen Schlag auf die Kiste.

Die Katze sprang leicht in die Luft und landete sauber auf einer nahe gelegenen Kiste.

Schauen Sie sich nur die Implikationen des Wortes "in der Nähe" in diesem letzten Satz an. Seine Aufnahme vermittelt eine ganze Reihe von Konzepten, die sonst nicht vorhanden sind.


Es gibt immer mehr als einen Weg, Python Zen dagegen.


Natürlich wird es EINEN Weg geben, der Ihre Absicht perfekt zum Ausdruck bringt und der am besten geeignet ist, so wie Sie nur EINEN der obigen englischen Sätze auswählen würden, je nachdem, was Sie genau mitteilen möchten . Darum geht es im Zen of Python.

Aber in einem einleitenden Programmierkurs oder einen einleitenden Englischkurs, müssen Sie zunächst die verschiedenen Möglichkeiten (Benennungen, Code - Snippets) erfahren , in dem Sie können Couch eine Idee , bevor Sie das Urteil entwickeln zu wählen , welche ist am vollkommensten paßt.


3
Natürlich bricht Python seine eigene Regel. Sie haben Lambdas und verschachtelte Funktionen. Schleifen, Listenverständnisse und Generatorausdrücke; Schwimmer, Dezimalstellen und Brüche; und __init__und __new__, um nur einige zu nennen. Der Punkt ist, dass jedes für ein subtil anderes Problem geeignet ist. Sie würden keinen dieser englischen Sätze zufällig auswählen, noch würden Sie eine dieser Python-Sprachfunktionen zufällig auswählen.
Kevin

1
@ Kevin, ja, stimmte zu. Der Punkt ist, dass es für jemanden , der mit dem Programmieren völlig neu ist , aufgrund der Genauigkeit der erforderlichen Syntax den Anschein erwecken kann , dass es nur eine Möglichkeit gibt, etwas zu erreichen - nämlich den genauen Code aus dem Tutorial wörtlich zu kopieren , ähnlich wie bei Mathematikproblemen in der Mittelschule (573 x 247) haben nur eine richtige Antwort. Siehe auch Fragen wie "Was ist das Programm zum Verkleinern von Dateien?" Wenn Sie meine Antwort lesen, sage ich nicht, dass Sie irgendetwas nach dem Zufallsprinzip tun sollen. Ich sage , dass Sie sind immer Entscheidungen zu treffen , wenn Sie programmieren.
Wildcard

1
Das ist sicher fair. Ich denke, das Problem ist, dass Sie den Zen of Python ein bisschen vereinfachen / falsch darstellen. Der springende Punkt ist, dass diese Entscheidungen letztendlich durch die Konturen Ihres Problems bestimmt werden und nicht durch Entscheidungen, die Sie frei treffen können. Möglicherweise müssen Sie viele Iterationen und Umgestaltungen durchführen, um die eine Möglichkeit zu finden, die perfekt zu Ihren Anforderungen passt. Sie ist lesbar, präzise und sogar elegant. Für jedes Problem sollte es jedoch eine ideale Lösung geben, und eine gut gestaltete Sprache wird Sie behutsam dahin führen. Das ist es, was der Zen bedeutet.
Kevin

4
Ein Zyniker könnte sagen: 'In Python gibt es nur einen Weg, dies zu tun, aber jede neue Version von Python wendet die Funktion "und jetzt für etwas völlig anderes" auf die Art und Weise an, wie es die vorherige Version getan hat';)
alephzero

3
Zitat aus PEP20: "Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun. Auch wenn dieser Weg auf den ersten Blick nicht offensichtlich ist, es sei denn, Sie sind Holländer."
Vaxquis

5

Sie fragen nur nach der myAnswerVariablen, die redundant zu sein scheint. Andere Antworten erklären bereits, warum und wann es sinnvoll ist, sie wegzulassen oder zu verwenden, aber hier ist noch eine: Wie wäre es damit?

Start
  output input * 2
Stop

oder auch das

Start output input * 2 Stop

In den meisten Sprachen würde dies immer noch funktionieren, aber können Sie es lesen? Es ist schwierig , so oft wir verwenden Helfer Variablen , weil Computer nicht die einzigen sind, die den Code lesen. Wir müssen es in wenigen Monaten warten und verstehen, und es ist noch schwieriger, Code zu schreiben, den Sie später noch verstehen können als einen funktionierenden. In der Regel wissen Sie nach nur wenigen Tagen nicht, warum Sie etwas auf eine bestimmte Weise getan haben .


2
... oder auch nur (*2). Ich würde jedoch einwenden, dass das Ausführen von Eingaben nicht unbedingt sicher ausgedrückt werden kann, indem nur auf eine Variable zugegriffen wird / eine arithmetische Operation ausgeführt wird: Es kann beobachtbare Nebenwirkungen haben.
links um den

2

Sie können beide Varianten ausführen (in diesem einfachen Fall), aber die erste Variante wird für komplexere Fälle besser lesbar und strukturierter. Die erste Variante zeigt das IPO-Modell mit einer Zeile für jeden Schritt (zwei davon bereits mit dem richtigen Namen):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.