在python中调用函数和括号有什么区别?

时间:2017-09-01 13:25:37

标签: python

我有一个问题。让我们假设我们有函数hello()。用括号和没有括号调用它有什么区别?当我调用hello()时,它指的是一个值等于此函数的对象。或许我错了?如果我在没有括号的情况下调用它会发生什么?

我想知道为什么

def hello():
    pass

print(id(hello))
print(id(hello()))

返回不同的结果

4400606744
4398942536

5 个答案:

答案 0 :(得分:4)

简短回答:请参阅https://nedbatchelder.com/text/names.html以更好地了解对象与用于引用对象的名称之间的区别。

如果使用括号,则调用函数if和 hello()调用该函数; hello只是绑定到函数的名称,例如,可用于将函数对象作为参数传递给另一个函数。

def caller(f):
    f()

def hello():
    print("hi")

def goodbye():
    print("bye")

caller(hello)  # Prints "hi"
caller(goodbye)  # Prints "bye"

关于您的更新,id返回不同的值,因为每次调用id都会收到一个完全独立的对象作为其参数。使用id(hello)id获取函数对象本身。使用id(hello())id通过调用hello获取对象返回;它与

相同
x = hello()
print(id(x))

答案 1 :(得分:2)

TL; DR :括号执行函数本身;如果没有它们,你会将函数视为变量

在python中,如果要调用,则将括号(内置可选变量)附加到函数名

但是还有另一种使用函数名的方法。 实际上,在python函数中是第一类对象,这意味着函数可以像传递名称那样传递。为此,您不得在函数名末尾添加括号()。

检查以下内容:

def f():
    return 'f'

print( type(f) ) # result: <class 'function'>
print( type(f()) ) # result: <class 'str'>

如您所见,在第一个实例中,我们打印f的类型(没有括号),这是一个函数

在第二个实例中,我们打印f()(带括号)的类型,它是一个字符串,它是f调用时返回的类型。

此行为对于将函数作为其他函数等的参数传递非常有用。

id()和id(函数调用&gt;)返回不同的id:

print(id(hello))   # here it returns the id of the function name

print(id(hello())) # here it returns the id 
                   # of the object returned by the function itself

答案 2 :(得分:1)

hello是指函数对象,hello()调用函数本身。

例如:

>>> def hello():
...     print "hello"
... 
>>> hello
<function hello at 0x106c91398>
>>> hello()
hello

答案 3 :(得分:0)

函数是一个对象,就像Python中的任何其他对象一样。如果定义新函数,则会创建一个新的函数对象并将其分配给函数的名称。

def spam():
    print('The knights who say Ni!')

print(spam) # => <function spam at 0x7fc64efc6f28>

spam() # => output: 'The knights who say Ni!

正如您在定义函数后所看到的那样,它被赋予了spam的名称。它基本上类似于正在运行的赋值语句。现在该名称将为您提供访问,但为了实际使用它,您必须使用spam()等括号调用。如果不使用括号调用它,它将只返回已分配给名称spam的函数对象。

答案 4 :(得分:0)

简而言之,带有括号()的函数实际上是在调用(调用)该函数,而没有括号()的函数是该对象的对象可以作为参数传递的函数,以后可以通过在其后面附加()来调用。

def hello():
    return 1


hello >>返回对象
hello() >>输出1