我想在Python中编写类似AI的东西:
我的第一个代码是这样的:
def run()
if choice_a_is_avilable:
choice_a()
return
elif choice_b_is_avilable:
if choice_b_1_is_avilable:
choice_b_1()
return
elif choice_b_2_is_avilable:
choice_b_1()
return
else:
choice_c()
while 1:
run()
但是决定choice_a_is_avilable的代码是否很长,条件应该绑定到方法。我更改代码以使其更清晰。
def run():
if(choice_a()):
return
elif(choice_b()):
return
else(choice_c()):
return
def choice_b():
if choice_b_is_avilable:
if(choice_b_1()):
return True
elif(choice_b_2)
return True
return False
当我的代码越来越多选择时,它变得越来越混乱和丑陋,我考虑使用Exception
:
class GetChoiceException(Exception):
"""docstring for GetChoiceException"""
def __init__(self, *args):
super(GetChoiceException, self).__init__(*args)
def run():
try:
choice_a()
choice_b()
choice_c()
except GetChoiceException:
pass
def choice_a():
if choice_a_is_avilable:
some_function()
raise GetChoiceException()
是否滥用Exception
?
在Python中做出选择的写入方式是什么?
答案 0 :(得分:0)
如果choice_
函数成功返回True
,False
如果不成功,那么您可以依次尝试每个函数,直到成功完成:
choice_a() or choice_b() or choice_c()
由于or
被短路,表达式会在找到返回true的操作数后立即结束。
或者,如果看起来更优雅,你可以这样写:
any(x() for x in (choice_a, choice_b, choice_c))
any
一旦发现操作数为真,也会被短路停止。
这也可以让你维护一个属于这个操作的函数选择列表,并像这样使用它:
choices = [choice_a, choice_b, choice_c]
...
any(x() for x in choices)
答案 1 :(得分:0)
没有什么"错误"在您的异常方法中,如果这是您想要做的。但对我来说,它看起来有点静止。
不完全了解您的问题,如果有帮助,可以考虑使用一个可用函数调用列表。您可以在列表中存储函数,类和任何您想要的内容。然后,您可以随机或通过选择选择一个并执行该操作。
from random import choice
def foo():
print "foo"
def bar():
print "bar"
options = [foo,bar]
x = choice(options)
x()
将执行foo()或bar()。然后,您可以通过修改选项列表的内容来添加或删除功能。如果您只想执行列表中的第一个,则可以调用
options[0]()
希望这会有所帮助。
哈努哈利
答案 2 :(得分:0)
这会有效吗?
choices = {'a': 1, 'b': 2}
result = choices.get(key, 'default')
答案 3 :(得分:0)
我是桌面驱动程序的忠实粉丝。
ctrl_table = [
[choice_a_test, choice_a_func],
[choice_b_test, choice_b_func],
[choice_c_test, choice_c_func]]
for test, func in ctrl_table:
if test():
func()
break