如何在Python函数中随机排列if语句的顺序?

6

我在Python中有一个函数,其中包含一系列if语句。

def some_func():
    if condition_1:
        return result_1
    if condition_2:
        return result_2
    ... #other if statements

但我希望每次调用函数时更改这些if语句的顺序。 例如,如果我调用函数,并且 condition_1condition_2 都为真,但由于首先检查 condition_1,因此我将获得 result_1,但我希望第二次调用函数时检查其他随机条件(因为该功能中仅有五个 if 语句,因此是其中任何一个条件)。 所以是否有一种方法可以像将条件存储在列表或类似的东西中那样做? 感谢任何帮助。

3个回答

5
您可以创建一个包含conditionresult的列表,然后像下面这样进行shuffle操作:
import random
def some_func(x):
    lst_condition_result = [((x>1), True), ((x>2), False)]
    random.shuffle(lst_condition_result)
    
    for condition, result in lst_condition_result:
        if condition:
            return result

输出:

>>> some_func(20)
True

>>> some_func(20)
False

>>> some_func(20)
False

3
这个方法只会评估必要的部分,也就是说,只有在 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']

1
如果您想在运行时随机排序,那么请将条件和结果作为函数放入函数列表中(仅一次),并对其进行洗牌(每次)。然后按照随机顺序评估这些函数,直到获得非假值(假设return语句始终返回非假值)。
在撰写本文时,您没有提供具体示例,因此我将使用以下示例进行说明:
def odd_or_multipleof3(n):
    if n % 2:
        return "odd"
    if n % 3 == 0:
        return "multiple of 3"
    return "neither"

这里odd_or_multipleof3(9)将返回"奇数",但是当交换if块时,它将返回"3的倍数"。为了让块的评估以随机顺序发生,以便您可以获得其中任何一个返回值,您可以这样做:

from random import shuffle 

funcs = [
    lambda n: "odd" if n % 2 else None,
    lambda n: "multiple of 3" if n % 3 == 0 else None
]
def odd_or_multipleof3(n):
    shuffle(funcs) 
    return any((result := func(n)) for func in funcs)  and result

print(odd_or_multipleof3(9))

这种工作方式将确保只有在条件不返回真值时才评估条件,而不会超出此范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接