有没有更好的方法来运行随机选择的功能?

时间:2015-03-28 03:25:50

标签: python function eval

我制作了一个Tic-Tac-Toe游戏,对于我制作的AI之一,它选择一个用引号括起来的随机函数(所以它是一个字符串)并在其上调用eval()。这是它的样子:

import random

func_list = ["func1()", "func2()", "func3()"]

eval(random.choice(func_list))

我真的不喜欢使用eval()(不确定为什么,只是看起来不对)。我不喜欢将列表中的函数作为字符串。 有更好的方法吗?

6 个答案:

答案 0 :(得分:9)

函数是Python中的第一类对象。这意味着您可以传递它们,并将它们存储在列表中,就像任何其他对象一样。

那么为什么不这样做?

func_list = [func1, func2, func3]
random.choice(func_list)()

答案 1 :(得分:4)

跳过评估并直接存储您的功能:

import random

func_list = [func1, func2, func3]

random.choice(func_list)()

答案 2 :(得分:3)

在Python中,函数是对象,您可以存储对它们的引用。然后,您可以使用引用调用它们,只要它们都可以处理相同的参数列表。

import random

def revlist(mylist):
    return mylist[::-1]

func_list = [list, set, tuple, revlist]

f = random.choice(func_list)

x = f([1,2,3,4,5,1])
print x

每次执行此操作时,您都会随机获得listsettuple或反向列表。

答案 3 :(得分:3)

func_list = [func1, func2, func3]

random.choice(func_list)()

您可以直接将功能放入列表中。

答案 4 :(得分:2)

您可以使用locals访问随机选择的功能 -

locals()[random.choice(func_list)]()
如果函数位于同一模块中,则

locals可用。

如果您要拨打的功能来自其他模块,您还可以使用getattr

import module_name
getattr(module_name, random.choice(func_list))

答案 5 :(得分:1)

在Python中,函数是第一级对象。只需将该功能放入列表中并直接调用即可。

def a(): pass
def b(): pass

funcs = [a,b]

# call function 'a'
funcs[0]()