我制作了一个Tic-Tac-Toe游戏,对于我制作的AI之一,它选择一个用引号括起来的随机函数(所以它是一个字符串)并在其上调用eval()
。这是它的样子:
import random
func_list = ["func1()", "func2()", "func3()"]
eval(random.choice(func_list))
我真的不喜欢使用eval()
(不确定为什么,只是看起来不对)。我不喜欢将列表中的函数作为字符串。 有更好的方法吗?
答案 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
每次执行此操作时,您都会随机获得list
,set
,tuple
或反向列表。
答案 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]()