为什么我的函数会自动执行?

时间:2014-01-25 09:45:16

标签: python function dictionary function-call

我有一个dict,存储两个这样的函数:

def quick():
    print("dex is 1")

def strong():
    print("str is 1")

def start():
    suffix = {"quick" : quick(), "strong" : strong()}
    suffix.get("quick")

start()

然后我执行此代码,输出为:

dex is 1
str is 1

似乎我的dict.get()在这里效果不佳。为什么两个函数都执行了,而不仅仅是quick函数?

4 个答案:

答案 0 :(得分:2)

您必须在dict中使用函数作为变量,并仅在需要时拨打电话:

def quick():
    print("dex is 1")

def strong():
    print("str is 1")

def start():
# without a `()` after a function's name, the function is just a variable, 
# waiting for a call
    suffix = {"quick" : quick, "strong" : strong}
    suffix.get("quick")() # and here is the actual call to the function

start()

答案 1 :(得分:2)

因为函数名后面有()。函数调用的返回值用于字典值而不是函数。

def start():
    suffix = {"quick" : quick(), "strong" : strong()}
    #                        ^^                   ^^

修正:

def start():
    suffix = {"quick" : quick, "strong" : strong} # Use function itself.
    func = suffix.get("quick")  # Get function object.
    func()                      # Call it.

答案 2 :(得分:2)

当你写作时

suffix = {"quick" : quick(), "strong" : strong()}

函数quick()strong()正在执行。您需要将其更改为

suffix = {"quick" : quick, "strong" : strong}

并将其称为:

suffix["quick"]()

这是python中的一个很酷的功能。如果您想将争论传递给函数quick(),可以将它们作为

传递
suffix["quick"](<arguments>)

答案 3 :(得分:2)

问题是你没有在dict中存储函数,而是存储这些函数的返回值:当你写quick()时,你调用函数。你的dict最终看起来像这样:

suffix = {"quick": None, "strong": None}

你想要做的是将函数本身存储在dict中,如下所示:

suffix = {"quick": quick, "strong": strong}  # no parentheses!

这会给你一个内部有两个函数对象的字典。您现在可以从dict中取出其中一个函数并调用它:

func = suffix.get("quick")
func()

就这样,您的代码将正常运行。

def start():
    suffix = {"quick": quick, "strong": strong}  # no parentheses!
    func = suffix.get("quick")
    func()

start()  # output: dex is 1

如果您需要将某些参数与dict中的函数相关联,请查看this question