这个方法只会评估必要的部分,也就是说,只有在 if 语句被打乱后需要评估的部分才会被评估:
def some_func():
conditions_and_results = [
(lambda: condition_1, lambda: result_1),
(lambda: condition_2, lambda: result_2),
...
]
random.shuffle(conditions_and_results)
for condition, result in conditions_and_results:
if condition():
return result()
更高效的方法是(至少对于大型列表来说),每次重复使用同一个列表,只洗牌需要的部分:
ifs = [
(lambda: condition_1, lambda: result_1),
(lambda: condition_2, lambda: result_2),
...
]
def some_func():
for i, if_i in enumerate(ifs):
j = random.randrange(i, len(ifs))
condition, result = ifs[i] = ifs[j]
ifs[j] = if_i
if condition():
return result()
演示 (在线尝试!):
import random
ifs = [
(lambda: x > 0, lambda: '> 0'),
(lambda: x > 1, lambda: '> 1'),
(lambda: x > 2, lambda: '> 2'),
(lambda: x > 3, lambda: '> 3'),
]
def some_func():
for i, if_i in enumerate(ifs):
j = random.randrange(i, len(ifs))
condition, result = ifs[i] = ifs[j]
ifs[j] = if_i
if condition():
return result()
x = 2
print([some_func() for _ in range(10)])
样例输出:
['> 1', '> 0', '> 1', '> 0', '> 0', '> 0', '> 0', '> 1', '> 0', '> 0']