2012-02-16 12 views
10

ほとんど真夜中で、私はちょうど私の頭の中で "forループ"ステートメントや関数です。ステートメントとファンクションの違い

私はいつもそれが声明だと思っていましたが、私はそれが機能であることについてGoogle検索を行いましたが、実際にその結果があります。それは何ですか?そしてその場合、関数とステートメントの違いは何ですか?

+0

本当にあなたの言語によります。 Ruby、Python、Javascriptとは何ですか? – deceze

+1

良い質問 - それは巨大なあなたの研究を行ったことを示しています。 – Purag

+0

@decezeは、これら3つの言語のすべての記述ではありませんか? –

答えて

18

forループは、通常は関数ではありませんが、フロー制御構造と呼ばれる特別な種類の文です。

statementはコマンドです。それは何かをする。ほとんどの言語では、文は値を返しません。例:

print "Hello World" 

functionは、プログラムの別の場所で呼び出すことができるサブルーチンです。関数はしばしば(必ずしも必要ではないが)戻り値を返す。例:また、複合文として知ら

function(a) { return a * 2 } 

control structure、実行の流れを導くために使用されるステートメントです。例:

if (condition) then { branch_1 } else { branch_2 } 
for (i = 0; i < 10; i += 1) { ... } 

また注目すべきは、expression値に評価コードの一部であるということです。例:

2 + 2 

すべての例は、擬似コードで、任意の特定の言語に縛られていません。また、これらは排他的なカテゴリーではなく、重複する可能性があることにも注意してください。

+1

そのロジックによって、 'for'ループはステートメント*と*コントロール構造の両方になります、はい?関数は何かを返す必要はありません - 単純な実行にも使えますが、特定のものが可変で、その製品が特定の状況に基づいています。 – Purag

+0

forループはステートメントでも関数でもない(制御構造として使用されているわけではありません)。 forループは、ほとんどの言語の複合文ですが、式や関数にもな​​ります。 Javascript、Python、Rubyではこれが文です。 – zeekay

+0

@Purmou、私はあなたのコメントを投稿したのと同じように私の答えを更新する過程にあった。 –

1

この回答はPython 2.7.2に関連しています。 python tutorialから撮影:

4.その他の制御フローツール

4.2ステートメントのために:。 ザ・はPythonでのステートメントのためにあなたがCやPascalにするために使用することができるものとは少し異なります。 Pythonのfor文は、(Pascalのような)数値の算術的な進展を繰り返したり、反復ステップと停止条件の両方を定義する機能をユーザに与えたりするのではなく、任意のシーケンス(リスト文字列)を順番に表示します。

6

あなたが選んだ3つの言語タグのうち、私はPythonにはあまりよくありませんが、他の多くの言語でも同様の考え方があると思います。ここのサンプルコードはすべてPythonです。

は実行されるものです。言語実装が理解する「何かをするための指示」。例えば

print "Hello World" 

pass 

def foo(n): 
    return n + 1 

if condition: 
    print 'yay' 
else: 
    print 'doh' 

上記のブロックには、printステートメント、passステートメント、関数定義ステートメント、およびif/elseステートメントが含まれています。関数定義とif/else文は複合文であることに注意してください。それらは他のステートメント(おそらくそれらの多く、おそらく他の複合ステートメント)を含んでいます。

は、値を生成するために評価できるものです。例えば

1 

"foo" 

2 * 6 

function(argument) 

None 

上記には、数値リテラル式、文字列リテラル式、数値演算子を含む式、関数呼び出し式、およびリテラルなし式が含まれています。リテラルや変数以外にも、式は他の式で構成されています。 function(argument)では、functionargumentも両方の式です。

重要な違いは、ステートメントは、言語実装が「何かをやる」ように指示する指示です。式は値で評価されます(途中で "何かをする"ために言語の実装が必要な場合があります)。

結果として、値(式を含む)が表示されている場所であれば、他の式を置き換えることができ、何らかの意味があるものが得られます。コンパイルに失敗したり、実行時に例外をスローしたり、何が起きても、少なくとも何らかのレベルでは何が起こっているのかを理解することができます。

は式の中に現れません。(これはRubyとJavascriptでは真実ではないと思いますが、それはリテラルコードブ​​ロックと関数を値として全体として使用し、関数コードブロックにはステートメントが含まれていますが、これは私が話しているものとはまったく異なります)。式は値を持たなければなりません(たとえそれがNoneのような興味深いものであっても)。ステートメントはコマンドです。値を持たないため、式の一部として表示されるのは意味がありません。

多くの言語では、式をステートメントとして使用することもできます。これの通常の意味は、 "値を取得するためにこの式を評価してからそれを放棄する"ことです。 Pythonでは、常にNoneを返す関数は、通常はこのように使用されています

write_to_disk(result) 

のそれは、「コマンド」として使用するので、文のように見えますが、技術的にそれは表現だ、私たちは値を使用していないですそれは何かを評価する。 「裸の表現」は言語の可能な文の1つであると主張することができます(そしてそれらはしばしばそのように解析されます)。

戻り値のない文(プロシージャとも呼ばれる)と同じように使用する必要のある関数と、式のように使用される関数を区別し、文のような関数を使用するためのエラーや警告プロシージャを式として使用するとエラーが発生します。

したがって、fooが式の場合は、1 + fooと書くことができますが、タイプエラーが発生する可能性がありますが、少なくともそれは意味があります。 fooがステートメントの場合、通常1 + fooは解析エラーです。言語の実装は、あなたが何を言おうとしているのかを理解することさえできません。一方、


機能は、あなたが呼び出すことができるものです。それは実際には表現でも文でもありません。 Pythonでは、defステートメントを使用して関数を作成し、関数呼び出しは式です。関数を作成した後に関数にバインドされた名前も式です。しかし、関数自体はの値です。これは技術的には正確に表現されていませんが、確かに声明ではありません。


したがって、forループ。これはPythonのforループです。

for thing in collection: 
    do_stuff(thing) 

if文のように見えます(if文のような複合文)。そして、これは全く意味がない、それを証明(とパースエラー)する。しかし、いくつかの言語で

1 + for thing in collection: 
    do_stuff(thing) 

、ループのための同等の表現で、値、あなたが試みることができますすることがあります1を追加することもできます。一部の言語では、特別な構文ではなく関数でさえあります。

+0

"表現は表現の中に出現することはできません(私はこれがRuby [...]では真実ではないと信じています)" - Rubyには文はなく、式だけはありません。 –

+0

@JörgWMittagその後forループの値は何ですか?コードブロックであるという意味を除いて、Rubyの構文が素早くgoogleの後に*値を持つように見えません。 「コード値」と評価される式と実行されるステートメントは、たとえソースコード内の同じ生のテキストが文脈によってどちらかを表すことができたとしても、異なるものと思われます。私は今問題が発展しているおもちゃの言葉でこの問題に取り組んでいます。 – Ben

+0

@JörgWMittag私はもう少し読んだことがありますが、それはあなたが話していることではないことが分かります。 Rubyはループや条件文などに値を与えます。ニート!しかし、実際には 'break 'のような意味的なステートメントはまだ残っています(Rubyでは、必ずしもそうではありませんが、Rubyでは式として使用すると解析エラーが出ることがあります):http://carboni.ca/blog/p/Rubyにおけるステートメント) – Ben

関連する問題