如何将函数放入字典中以便可以对其进行迭代?

时间:2019-06-19 22:33:09

标签: python dictionary

我正在尝试制作一个包含函数作为值的字典。这个想法是,难度变量将在整个程序中改变,这将影响我们从词典中调用哪个函数。 为此,我将不演示该程序,我做了一个简单的模型来演示我遇到的问题。

每当我运行代码时,甚至不输入键,它就会运行功能。为什么会这样?

def printhello():
    print("hello")

def printgoaway():
    print("go away")


x={1:printhello(),2:printgoaway()}

在这一点上,我没想到会发生任何事情,因为我还没有调用任何键。无论如何,它将运行函数并打印值。

如果我随后通过进行x[1]x[2]对其进行呼叫,则不会发生任何事情。

有人可以告诉我如何在字典中使用函数,并阻止他们在创建字典时自动调用它们

4 个答案:

答案 0 :(得分:1)

在函数名称后面加上()时,将告诉Python立即调用该函数。

您应该更改代码以执行此操作:

x={1:printhello,2:printgoaway}

以便您的词典包含对这些函数的引用,而不是预先调用它们的结果。

那么您以后可以像这样称呼他们

x[0]()

请注意此处的括号,而上一行缺少括号。

答案 1 :(得分:0)

问题是您在括号中的函数名称后放置了括号:

x={1:printhello(),2:printgoaway()}

这将执行功能并将返回的值放入字典中。尝试删除括号:

x={1:printhello ,2:printgoaway}

这会将函数本身放在字典中。

作为示例,这是我的一个程序的一部分:

OPERATIONS = {'+': sum, '*': rdmath.prod}

def evaluate_subtree(node_list, ndx: int) -> int:
    """Evaluate the subtree inside node_list with the root at ndx.
    Use recursion and postorder in depth first search."""
    this_payload, these_children = node_list[ndx]
    if not these_children:  # if a leaf node
        return int(this_payload)
    return OPERATIONS[this_payload](evaluate_subtree(node_list, child)
                                    for child in these_children)

请注意,我将sum函数和rdmath.prod(用于计算迭代对象的乘积)放入字典OPERATIONS中。我的代码片段的最后一行使用字典选择两个函数之一,然后在生成器理解中执行该函数,并返回结果值。 (因此,生成器理解中的值可以相加或相乘。)

尝试类似的方法,看看它是否对您有用。

答案 2 :(得分:0)

printhello()运行printhello

使用x={1:printhello, 2:printgoaway}存储函数并使用x[1]()调用

答案 3 :(得分:0)

您需要将函数放入字典中,然后调用该函数。

def printhello():
    print("hello")

def printgoaway():
    print("go away")

# store functions in dictionary
x={1:printhello,2:printgoaway}

# call object in dictionary as a function
x[1]()