假设您有10个变量,其中一个变为真,其他变量为假。除了有大量的if / elif语句之外,是否有更好的方法来查找哪个变量为真,然后根据哪个变量为真做“某事”?根据哪个变量为真,每个“东西”都会有所不同。
答案 0 :(得分:4)
bools = [False, False, False, True, False]
# we're using constants here but you can use variables
# find first True value
whichbool = bools.index(True)
# now call a function based on that value
[func0, func1, func2, func3, func4][whichbool]()
如果可能没有True
值或多个值,您可能需要检查此值。检查这两种情况的最简单方法是使用sum()
函数。 True
作为整数是1,因此如果您获得除1之外的任何总和,则列表中的True
值太少或不够。
答案 1 :(得分:1)
首先,您可以将值存储在列表中而不是存储在单独的变量中:
l = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10]
print l.index(True)
如果0
为真,则会打印v1
,如果1
为真,则会v2
,依此类推。
然而,这并不能解决如何处理不同变量的不同行为的问题。如果您发现if
- elif
- ...
令人反感,您可以为十个案例中的每个案例调用一系列函数。
fns = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10]
fns[l.index(True)]() # call the appropriate function
这是否可以被视为比拥有大量elif
块的改进实际上取决于与f1
... f10
相关联的代码量。
答案 2 :(得分:1)
是的,有。它是这样的:
def func1():
print "function 1"
def func2():
print "function 2"
def func3():
print "function 3"
lookup = {'val1': func1, 'val2': func2, 'val3': func3}
toCall = 'val2'
lookup[toCall]()
这将允许您根据变量的值检索和调用函数。与其他答案不完全相同,但非常相似。这是从其他语言模拟switch
语句的标准方法。
答案 3 :(得分:0)
任何时候你有很多变量,而你想根据条件选择它们,你应该考虑改用dict。
bools['a'] = False
bools['b'] = False
bools['c'] = True
for k, v in bools.iteritems():
if v:
print "The true variable is", k
使用变量名称,您可以按名称调用函数:
class MyHandlers(object):
def a_is_true(self):
# do something because of a
def b_is_true(self):
# do something because of b
handler = MyHandlers()
handler.getattr(k + "_is_true")()