2012-03-11 7 views
7

私は練習41をPythonのハード・ウェイで学びます。私は、ハード・ウェイを学ぶために、自分の頭脳を包み込むことに本当に苦労しています。変数。私は、これはそれがどのように動作するかであることを確認するために、小さなスクリプトを書き、それはありません:なぜfoo = function()はPythonで関数を実行しますか?

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants() 
thing = shorts() 

結果がされた状態で:

Put on some pants! 
And don't forget your underwear! 

だから、明らかにこの問題が発生したが、私は理由を理解することはできません言語はそのように機能します。これは言語が言語の背後にあり、これを貴重な操作方法にしています。 なぜこれがであるのかを理解するために役立つと思います。

わかりやすくするために、私がやっていることは、何かの価値としてそれを割り当てるときに、なぜ機能が動作しているのか(私は推測しています)。 printステートメントはちょうどそこにあるので、関数が実際に実行されていることがわかります。

それは私が今まで実際に

パンツ()私を混乱さ ショートパンツ()

を実行していないという事実です。拷問アナロジーを作成するには

私ベーク・クッキー・アット・ホーム「は、クッキー()」だった、と私は土曜日にクッキーを作るとしたら、私は最終的にその

土曜日=クッキー()信じているかもしれません

ちょうどなぜちょうど

を言っ土曜日=クッキー()

が実際にコを焼くん... 実際に焼くクッキーと同じではありません「ねえ、土曜日はクッキーの日です」思考いくつかの後の使用のために変数 "cookies()"を使って土曜日を設定するのではなく、okies?

+5

あなたなら、おそらく混乱 '' return'でprint'。 – JJJ

+2

私はジュハナが正しいかもしれないと思います。あなたは 'zap'が「パンツを履く」という価値を期待していますか?もしそうなら、 'print'を' return'に変更し、割り当てられた後に 'print zap'を実行してください。 – chooban

+1

はい、明らかにあなたの期待は言語に合わせていません。何を期待していたのですか? –

答えて

16

括弧()を使用すると、関数が呼び出されます。関数を変数に代入して再利用する場合は、かっこを削除する必要があります。

例:

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants 
thing = shorts 

そして、あなたはこれらの関数を呼び出したい:

zap() 
thing() 
+0

したがって、of()はPythonの目で関数を「変換」し、Pythonはそれらの関数を即座に実行して戻り値を取得しようとします。 – JeanSibelius

+1

いいえ、何を関数に変換するかは、宣言するときです。 Pythonではすべてがオブジェクトです。関数は「呼び出し可能な」オブジェクトです。オブジェクトとして、それを変数に、プロパティとして別のオブジェクトに割り当てたり、パラメータとして渡したりすることができます。**それを呼び出すと、そのプロシージャが実行されます。詳細については、Pythonの[データモデル](http://docs.python.org/reference/datamodel.html)を読むことをお勧めします。 –

+1

私の前のコメントに追加: '()'の存在はPythonに**オブジェクトを**呼び出すように指示します。その関数が実行される場合、それが実行されない場合、オブジェクトが呼び出し可能でないことを示す例外が発生します。関数が何かを返すかどうかは、あなた次第で、あなたがする必要があることです。関数の結果を変数に代入したい場合は、他の答えで指摘されているように 'return'を使う必要があります。何かを印刷したいだけなら、 'print'を使うことができ、何も返す必要はありません。 –

2

zap = pants()は、関数の戻り値を変数にバインドします。したがって、関数を変数にバインドすると関数が実行されます。

def foo(): 
    return 1 

var = foo() 
print var 

は、1を印刷します。

こちらがお役に立てば幸いです。

編集:変数の値が「ズボンに入れてください」と思っている場合は、コメントに指摘されているように実際にはprintreturnが混乱しています。

5

あなたの関数が何も返さないように見えるかもしれませんが、実際にはそうです。引用文the Python.org documentation

return文は関数の値を返します。式引数なしのreturnはNoneを返します。関数の終わりが終了するとNoneも返されます。

だからあなたの機能は本当にこのようになります。

def pants(): 
    print "Put on some pants!" 
    return None 

def shorts(): 
    print "And don't forget your underwear!" 
    return None 

あなたの割り当てがzapどんなpantsリターン(pants()のすなわち値)、およびthingどんなshortsリターンに割り当てます。あなたのケースでは、どちらもNoneですが、もちろんこれを把握するためには関数を実行する必要があります(*)。やっぱ、それが可能であることpants戻りうるう年中42、そのshorts戻り'Foobar'をたびに、いくつかの乱数生成器「ロール」6.


(*)余談:機能がなければならない「を実行しなければならない」ということ普遍的に真実とはみなされません。 pure settingでは、Pythonの詳細(そのうちのほとんどはわかっていません)を除いて、コンパイラは両方の関数が同じようにNoneであることに気付き、プログラムの実行時に呼び出しを行わないようにします。しかし、何かを印刷する(または現在の年がうるう年かどうかを検査する、またはダイをロールする)関数は純粋ではありません。

1

インタープリターが関数名の後に()を付けると、その関数を実行するはずであることがわかります。

あなたがしていることは、「これらの関数の結果をこれらの変数に割り当てる」ということです。

しかし、これらの関数から値を返さないため、変数には何も表示されません。

しかし、そこにprintステートメントがあるため、その関数の結果に変数を割り当てるときにインタプリタがそれらの関数を実行していることがわかります。

0

あなたの機能が名前の後にあるため、括弧で呼ばれています。

zap = pants() 

この関数pantsを呼び出し、その結果をzapに格納します。

zap = pants 

ここで、ザップはパンツ機能自体を参照します。

そして、あなたはちょうど

pants() 

を書いたならば、パンツ機能も呼び出されるだろうが、(Noneです)、結果を変数に入れられていないだろう。

6

ので、明らかにこれは起こりますが、言語はそのように動作し、なぜ私が理解できない - ロジックは、この動作貴重な道になり、言語背後にあるもの。私は、なぜこれが動作するのかということではなく、これがなぜであるかを理解するために役立つだろうと思っています。

言語は、関数と関数を呼び出す行為を区別するために何らかの方法が必要です。それがかっこが提供するものです。

f = foo 

ここで、fは、関数自体にバインドされています。関数foof()で実行できました。

f = foo() 

これは、関数fooを呼び出し、fに戻り値をバインドします。かどうか、あなたが名前に戻り値を結合すること

注意は無関係です。単純に書込み

foo() 

も実行されますが、戻り値は単に無視されます。

+0

私が正しく理解していれば、Pythonはほとんどのコンテキストにかかわらず、関数の後に()を使って何かを実行しようとします。関数の戻り値がfunction()の代わりにfunction現在のコンテキストで変数を表すはずのもの? – JeanSibelius

0

ご質問から、zapの値は"Put on some pants!"thingの値は"And don't forget your underwear!"になります。それがあなたの問題なら、それについて話しましょう。さもなければ、私はすべてのことについて話しましたので、それ以上読む必要はありません。

のは、それいくつかの楽しみにしましょう。関数を定義すると、自分がしたいことをするマシンを作成するようなものになります。さあ、マシンを考えてみましょう。あなたがそれに食べ物を与えると、それはチョップされ、何もしません!私はそのマシンで食べ物をチョップして、他のものは作っていないということです!あなたはチョップされた食べ物を元に戻すことはありませんが、実際にそれを作ったときにあなたの食べ物をチョップします。

さて、あなたが戻ってあなたのみじん切り食品をしたいと、あなたの食べ物を取り、別のマシンを作成し、それらをチョップし、あなたにそれらを返します。フルーツマシン、それじゃない? (私は数学で任意のvoid関数を知らないのに!:P)

;-)は、彼らはすべてのプログラミングや数学の関数のために真です。あなたが関数を作成している場合、あなたはそれだけでは、いくつかの作業またはそれは、いくつかの仕事をしないかどうかを伝え、結果を返すことがあります。関数を伝える方法はreturnです。あなたの機能では、あなたは何かをするように言いました。そしてそれはprint "......"であり、関数も同様です。あなたは最後にwith()を呼び出し、彼らの仕事をして、彼らはそれを印刷します。しかし、私が言ったように、結果を返すように言わなければ、それはできません。結果を返さないため、変数には何も割り当てられません(Noneと混同しないでください)。これらの行を(インタプリタの場合)書き込んだりスクリプトを実行すると、その行は表示されますが、zapthingには値がありません。

それでは、どのようにそれを修正するには?それらに変数を返すように指示します。関数にそのことを伝えるには、 printステートメントを returnステートメントに置き換えます。そして、あなたは

はそれがお役に立てば幸いです:-)あなたの知識が真のについて知っていることを知って、あなたが知っていることを実験する気はありません:-)