バイナリの組み合わせで変数を反復する

2
2022.01.14

真/偽のすべての可能な組み合わせを通じて変数をループする簡単な方法はありますか?たとえば、関数があるとします。

def f(a, b, c):
  return not (a and (b or c))

a,b,c 、 、001、、、などを通して100をループする方法はありますか?

私の最初の考えは、整数をループし、変数の位置に対応するビットを取得することです。

for i in range (8):
  a = i & 4
  b = i & 2
  c = i & 1
  print(f(a,b,c), " ", a,b,c)

それは動作するように見えますが、出力されるときの、a、およびcはすべて整数であり、整数は論理演算子とブール値とは異なるやり取りします。 たとえば、4 and 22に等しく、9 or 39と等しくなります。私はそれをあまり気にしない、それは自分自身を納得させるためにいくつかの考えを要した、これは問題ではない。

しかし、疑問はまだ立っていますが、可能なすべての真偽または0/1の値をループする簡単な方法はありますか?

回答
3
2022.01.14

itertools.productを使用する:

from itertools import product


for a, b, c in product([True, False], repeat=3):
  print(f(a,b,c), " ", a,b,c)

本当に整数1と0が必要な場合は 、[True, False][1, 0]に置き換えてください。整数をビット配列として扱う理由はほとんどありません。