使用二进制"switch"迭代和/或枚举的Pythonic方法

Lam*_*ell 2 python iterator loops

我正在处理一些事情,那时我将需要以二进制方式迭代2 n个可能的结果.

我想要一些二进制枚举或类似的东西,我可以用来在每次迭代中打开和关闭运算符和/或函数.

符号(或+/-运算符)在2 3 = 8次迭代中变化的示例可以是:

loop1: + var1 + var2 + var3
loop2: + var1 + var2 - var3
loop3: + var1 - var2 + var3
loop4: + var1 - var2 - var3
loop5: - var1 + var2 + var3
loop6: - var1 + var2 - var3
loop7: - var1 - var2 + var3
loop8: - var1 - var2 - var3
Run Code Online (Sandbox Code Playgroud)

排序的二叉树,但作为代码结构而不是数据结构?

有没有一个有用的内置?

Mar*_*ers 7

只需生成二进制标志的产品; 如果你需要切换3个不同的东西,生成(False, True)三次产品:

from itertools import product

for first, second, third in product((False, True), repeat=3):
Run Code Online (Sandbox Code Playgroud)

您也可以生产运营商的产品; 您的示例可以使用operator模块函数:

import operator
from itertools import product

unary_op = operator.pos, operator.neg

for ops in product(unary_op, repeat=3):
    result = sum(op(var) for op, var in zip(ops, (var1, var2, var3)))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> from itertools import product
>>> import operator
>>> var1, var2, var3 = 42, 13, 81
>>> unary_op = operator.pos, operator.neg
>>> for ops in product(unary_op, repeat=3):
...     vars = [op(var) for op, var in zip(ops, (var1, var2, var3))]
...     print('{:=3d} + {:=3d} + {:=3d} = {sum:=4d}'.format(*vars, sum=sum(vars)))
...
 42 +  13 +  81 =  136
 42 +  13 + -81 = - 26
 42 + -13 +  81 =  110
 42 + -13 + -81 = - 52
-42 +  13 +  81 =   52
-42 +  13 + -81 = -110
-42 + -13 +  81 =   26
-42 + -13 + -81 = -136
Run Code Online (Sandbox Code Playgroud)