54013


`def hoge()`を定義した時に、`print(hoge())`を実行すると正常な結果が取得できます。  
しかし関数名のみを指定して`print(hoge)`を実行すると`<function hoge at 0x...>`が表示されるのは何故でしょうか。

[code]

    def hoge():
        return "foo" 
    
    print(hoge())  #foo
    print(hoge)    #<function hoge at 0x...>
    
[/code]

※これはpythonに関する回答への[コメント](https://ja.stackoverflow.com/a/53927)で頂いた質問に加筆修正したものです。


CC BY-SA 4.0
2019-04-08T05:31:00.760
54012
2019-04-08T13:07:29.173
2019-04-08T13:07:29.173
9820
9820
question
python python3
関数に括弧を付けずprintすると<function hoge at 0x が表示される理由


実行結果は正常です。  
`print(hoge)`のように関数に括弧をつけず実行すると、 **関数オブジェクト**
の[識別子](https://docs.python.org/ja/3/library/functions.html#id)を[表示します](https://stackoverflow.com/a/40098556)。

関数名は[特殊属性](https://docs.python.org/ja/3/library/stdtypes.html?highlight=__name__#definition.__name__)として、識別子は組み込み関数`id()`で取得できます。  
すなわち `"<function {0} at {1}>".format(hoge.__name__, hex(id(hoge)))`
で質問の表示内容を再現できます。

この機能の何が嬉しいのかというと、関数自体を別の関数や配列に代入できることです。  
ともあれ定義済みの関数名を`print`するとエラーにならず、関数自体を識別する一意の値が返ります。  
括弧を付けないと関数の中身は **実行されない** のでご注意ください。

[code]

    def hoge():
        return "foo" 
    
    print(hoge())  #foo
    print(hoge)    #<function hoge at 0x...>
    print("<function {0} at 0x{1:X}>".format(hoge.__name__, id(hoge))) #同上(ただしHEXの前ゼロは消える)
    
    fuga = hoge
    print(fuga())  #foo
    
    ppp = [ hoge, hoge, hoge ]
    for piyo in ppp:
        print(piyo()) #foo foo foo
    
    i = 0
    def add():
        global i
        i += 1
    
    print(i) #0
    add()
    print(i) #1
    add
    print(i) #1 ※値が加算されていない
    
[/code]


CC BY-SA 4.0
2019-04-08T05:31:36.690
54013
2019-04-08T05:31:36.690
9820
54012
answer