

プログラム1.

[code]

    def make_cmd(i):
      return lambda : buff.set("button{} pressed".format(i))
    
    button = Tkinter.Button(root, text = "Button{}".format(i), command = make_cmd(i))
    
[/code]

プログラム2.

[code]

    def make_cmd(i):
      return buff.set("button{} pressed".format(i))
    
    button = Tkinter.Button(root, text = "Button{}".format(i), command = make_cmd(i))
    
[/code]

1 の場合はうまく動作するのですが、2 は `button` への代入でエラーが出てしまいます。  
1 の返り値を表示すると `<function <lambda> at 0xb714adbc>`、2 は `none` でした。  
なぜ、2 は `none` になるのですか?


CC BY-SA 3.0
2016-03-14T17:02:18.280
23135
2016-03-15T00:40:40.100
2016-03-14T17:21:01.817
76
14741
question
python tkinter
returnとはなにを返しているのか？


> なぜ、2 は none になるのですか?

buff.set()関数がNoneを返しているからです。

このプログラムでポイントになるのは、TKinter.Buttonのcommand引数へ渡す値です。  
command引数は関数オブジェクトを期待しています。  
例えばいかのような実装サンプルは正常に動作します。

[code]

    def callback():
        print "click!"
    
    b = Button(master, text="OK", command=callback)
    
[/code]

ここで、プログラム1の実装を見てみると、lambdaを使っています。

[code]

    def make_cmd(i):
        return lambda : buff.set("button{} pressed".format(i))
    
[/code]

これをlambdaを使わずに実装すると、以下のようになります。

[code]

    def make_cmd(i):
        def cmd():
            buff.set("button{} pressed".format(i))
        return cmd
    
[/code]

`make_cmd` 関数が返しているのはcmd関数で、それがTKinter.Buttonのcommand引数に渡されることになります。
`buff.set` の返値をcommand引数に渡しているのではないことに注意して下さい。  
この例ではcmdという関数内関数を定義していますが、これを短くインラインで書いたものがプログラム1にある `lambda`
を使う方法です。lambdaを使えば、make_cmd関数を定義せずにTKinter.Buttonに直接渡す事もできます。

[code]

    button = Tkinter.Button(
                 root,
                 text="Button{}".format(i),
                 command=lambda:buff.set("button{} pressed".format(i))
             )
    
[/code]


CC BY-SA 3.0
2016-03-14T23:40:06.540
23139
2016-03-14T23:40:06.540
806
23135
answer


とても簡単に言ってしまいますと、次のようになります。

プログラム1は、ラムダ式そのもの、つまりボタンが押されたときの処理関数を返しています。関数の内容はこの時点では実行されるわけではありません。ボタンが押されたときに実行されます。

プログラム2は、`buf.set()`の実行結果を返す形になっていますが、実際には何も返らないので、`none`になるのです。`buf.set()`はこの時点で実行されています。


CC BY-SA 3.0
2016-03-15T00:40:40.100
23144
2016-03-15T00:40:40.100
14779
23135
answer