什么是在Python中的许多选择之间切换的正确方法

时间:2016-10-03 15:28:33

标签: python

我想在Python中编写类似AI的东西:

  1. 我的第一个代码是这样的:

    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()
    
  2. 但是决定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
    
  3. 当我的代码越来越多选择时,它变得越来越混乱和丑陋,我考虑使用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()
    
  4. 是否滥用Exception

    在Python中做出选择的写入方式是什么?

4 个答案:

答案 0 :(得分:0)

如果choice_函数成功返回TrueFalse如果不成功,那么您可以依次尝试每个函数,直到成功完成:

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