初心者:操作が出力コマンドに含まれないのはなぜですか?


23

私はプログラミングの入門書を読んでいますが、擬似コードで簡単な例をリストしています:

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

次のように呼ばれる別の変数の作成を省略してmyAnswer、単に操作を出力コマンドに入れることができないのはなぜですか?

Start
  input myNumber
  output myNumber * 2
Stop

前者は正しいのに、後者は正しくないのはなぜですか?


39
本はあなたができないと言っていますか?
Tulainsコルドバ

2
この本は、私にできないとは言っていません。それについては何も言わない。
user1475207

5
短い2番目のブロックから始めて、必要に応じて最初のブロックに変換することは非常に合理的だと思います。
Mateen Ulhaq

13
簡単な答え:できます、著者はそれを明確にするために(試みで)ただこれを行っています(正直なところ、おそらく実際にはそれをまったく明確にしません...)。
ジュール

1
両方の方法が機能します。より多くの経験を積むと、深刻なコーディングの読みやすさは、コードの単純さや独創性よりもはるかに重要であることがわかります。あなたのコードは、それを維持している他の多くの人が簡単に読めるはずです。
フランティセクKossuth

回答:


36

可能ですが、もう1つは、何が起こっているかを確認myAnswerし、プログラムで後で使用できるようにすることです。2番目のものを使用する場合、再利用できません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

3
事前に変数に割り当てることなく、操作の結果を返すことは有効だと思います。しかしresult、短い関数に対しても変数を作成する習慣をつけたため、追加によるデバッグprint(result)は非常に高速です。しかし、それは優れた実践よりも便利さから外れています。
右脚

33

もう1つの理由は、割り当てset myAnswer = myNumber * 2により、結果の値に名前が付けられることです。コードの2行バージョンを読んでいる人は、の値を出力することを知っているだけですmyNumber * 2。3行バージョンを読む人はそれmyNumber * 2答えであるのを見ることができます

それは、このような簡単な例では重要思えないかもしれませんが、時々 、意味の名前を持つ変数に結果値を代入することは、作ることができる非常に簡単に他のプログラマがあなたのコードを読んで理解するために。


10
+1。ただし、これは名前に意味がある場合にのみ適用されます。名前のこのよう一時的VARSを使用してiresultまたは他のいくつかの無意味な識別子は唯一の明瞭度を改善するために何もしない、とのコードをクラッタ
アレクサンダー-復活モニカ

7
@Alexander:意味のない名前でも意味があります。 i配列インデックスであることが望ましい。が存在するresult場合、関数は終了するreturn resultか、道徳的に同等である必要があります。など
ケビン

6
@Kevin「無意味な名前はまだ意味がある」ええと...確かですか?笑
アレクサンダー-モニカの復活

3
@Kevinを使用する場合はreturn result、インラインに配置して、結果に割り当てたものを返すこともできます。結果であることがわかります。あなたはそれを返している、それを得る。
アレクサンダー-モニカの復活

5
@Alexander:単純な式の場合、明らかに戻り値をインライン化できますが、複数のステートメントにまたがって構築する必要がある場合はどうでしょうか?一貫した命名スキームを使用すると、これらのケースで何をしているのかが明確になります。
ケビン

14

それは擬似コードです。特定の実装言語であるとは考えられていません。

一部のプログラミング言語は、式の評価と、同じコード行での結果の出力をサポートしていません。たとえば、ほとんどのアセンブラはそれをサポートしていません。おそらくこの本の著者は、物事を低レベルで見せたいと思っていたのでしょう。


2
また、一部の言語(Cなど)では両方を同時に使用できます。本当に必要な場合は、「出力(答え=答え* 2)」のようなものを書くことができます。(ただし、「output(answer == answer * 2)」はまったく異なることを意味することに注意してください
...-alephzero

9

他の答えは、特定のメカニックの詳細と、どちらか一方のフォームがより良い場合の例に対処していますが、もう少し哲学的である背景について言及したいと思います:

あなたは言語を学んでいます。

言語とは、アイデアを表現し、理解(コミュニケーション)できるものです。コンピュータープログラミング言語には、その言語を使用して指定および供給されるアイデア(決定)に基づいてアクション(実行)を行うように設計されたマシンによって機械的に解析できる追加のプロパティがあります。

役に立つすべての言語で、その言語で表現可能なほぼすべてのアイデアを表現する方法は複数あります。


英語で利用できる多種多様なニュアンスを考慮してください。次のような単純な文でも

猫は箱に飛び乗った。

わずかに異なるアイデアを表現したり、シーンのさまざまな部分に重点を置いて同じ物理的な宇宙のアクションを参照するように変化させることができます

最初は文法的なバリエーションです:

箱は猫に飛び乗った。

箱の上に猫が飛びました。

それから、同じ物理的行動を依然として参照する、より幅広いバリエーションがあります:

猫の衝撃で箱が揺れた。

猫は箱の上部に音を立てて降りてきました。

ネコは軽く空中に飛び上がり、近くの箱にきれいに着地しました。

最後の文の「近く」という言葉の意味を見てください。その包含は、他の方法では存在しないまったく新しい概念を伝えます。


あり、常にそれを行うには複数の方法、逆にPythonの禅。


もちろん、まさにあなたが伝えたいものに応じて上記の英語の文章の1つだけを選択するのと同じように、あなたの意図を完璧に表現し、最適な方法が1つあります それがPythonの禅の目的です。

しかし、プログラミング入門コースまたは入門英語コースでは、まず、あなたが様々な方法(文言、コードスニペット)学ばなければならないことができますあなたがする判断ソファアイデアを開発する前に、選択した最も完璧にフィットしているし。


3
もちろん、Pythonは独自のルールを破っています。ラムダとネストされた関数があります。ループ、リスト内包表記、ジェネレーター式。浮動小数点、小数、および分数。そして__init__そして__new__、ほんの数名に。ポイントは、それぞれが微妙に異なる問題に適しているということです。これらの英語の文のいずれかをランダムに選択することも、これらのPython言語機能の1つをランダムに選択することもありません。
ケビン

1
@Kevin、はい、同意しました。ポイントは、誰かのためということで全く新しいプログラミングに、必要な構文の正確さをすることができますコピー、何も成し遂げ、すなわちをすることができます唯一の方法があることが見えるように正確にどのように中学校の数学の問題に類似チュートリアル逐語からのコードを、 (573 x 247)正しい答えは1つだけです。「何ですのような質問も参照してファイルを縮小するためのプログラムに?」あなたが私の答えを読んだとしても、私はランダムに何もしないと言っているのではありません。私はあなたあなたプログラムするとき、常に選択をしていると言っています
ワイルドカード

1
それは確かに公平です。問題は、Zen of Pythonを少し単純化/不正確に表現していることだと思います。全体的なポイントは、これらの決定は最終的に問題の輪郭によって決まり、自由に選択できるものではないということです。それを行うための1つの方法を見つけるには、多くの反復とリファクタリングを行う必要があるかもしれません。あなたの要件に完全に適合する1つの方法は、読みやすく、簡潔で、エレガントです。しかし、どのような問題に対しても、そのような理想的な解決策が必要であり、適切に設計された言語がそっとあなたを導きます。それが禅の意味です。
ケビン

4
皮肉屋は「Pythonにはそれを行う方法は1つしかありませんが、Pythonのすべての新しいバージョンは、以前のバージョンが行った方法に「そして今ではまったく異なる」機能を適用します」;)
alephzero

3
PEP20からの引用:「それを行うための明白な方法は1つ、できれば1つだけである必要があります。オランダ人でない限り、その方法は最初は明らかではないかもしれません。」
vaxquis

5

myAnswer冗長であると思われる変数についてのみ質問しています。他の回答では、それを省略または使用することが理にかなっている理由と時期の一部をすでに説明していますが、もう1つあります。これはどうですか。

Start
  output input * 2
Stop

それとも

Start output input * 2 Stop

ほとんどの言語でこれは機能しますが、読むことができますか?難しいので、コードを読むのはコンピューターだけではないため、ヘルパー変数をよく使用します。数か月でそれを維持して理解する必要がありますが、後で動作するコードを後で理解できるコードを書くのはさらに難しいです... 。


2
...またはそれだけでも(*2)。ただし、入力を実行することは、単に変数にアクセスする/算術演算を実行するだけで安全に表現できるわけではないことに反対します。
17

2

両方のバリアントを実行できます(この単純な場合)が、最初のバリアントはより複雑なケースで読みやすく、構造化されます。最初のバリアントは、ステップごとに1行のIPOモデルを示しています(すでに正しい名前の2つ)。

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.