运行 随机选择的函数有更好的方法吗?

Is there a better way to run a randomly chosen function?

我制作了一个井字游戏,对于我制作的一个 AI,它选择了一个用引号括起来的随机函数(因此它是一个字符串)并对其调用 eval()。这是它的样子:

import random

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

eval(random.choice(func_list))

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

您可以使用 locals 访问随机选择的函数 -

locals()[random.choice(func_list)]()
如果函数在同一个模块中,

locals 有效。

如果您调用的函数来自另一个模块,您也可以使用 getattr

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

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

那为什么不这样做呢?

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

在 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 或反向列表。

跳过评估并直接存储您的函数:

import random

func_list = [func1, func2, func3]

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

random.choice(func_list)()

您可以直接将函数放在列表中。

在Python中,函数是一级对象。把函数放在列表里直接调用就可以了

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

funcs = [a,b]

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