在 Python 中比较索引的目的是什么?

What is the purpose of compares in indices in Python?

我遇到了以下情况:

r = random.randint(1,6)
C = "o "
s = '-----\n|' + C[r<1] + ' ' + C[r<3] + '|\n|' + C[r<5]
print(s + C[r&1] + s[::-1])

在 IDLE 中执行时,这会输出一个带有随机值的 ASCII 骰子。

它是如何工作的,更具体地说,比较符号(<&)在索引中完成什么?

有人在这里玩代码,并使用 hacky tricks 来尽量减少使用的代码量。

  • <是常规比较运算符;它 returns TrueFalse 基于两个操作数。 Python bool 类型是 int 的子类,当解释为整数时,True1False0。因此 C[r<1] 选择 C[0]C[1]

  • &bit-wise 运算符,不是比较运算符; & 1 将数字屏蔽到最后一位,有效地测试数字是奇数还是偶数(最后一位是否设置)。所以如果r是奇数,就用C[1],否则C[0]就是。

分解:

  • C 是一个包含 o 和 space 字符的字符串
  • C[r<1] 根据是否小于 1 选择 o 或 space。它永远不会(random.randint(1,6) 确保这一点),所以这是 总是一个o。这似乎是代码中的错误或疏忽。
  • C[r<3] 为 1 和 2 选择 space,否则为 o
  • C[r<5] 为 5 或 6 选择 o,否则为 space。
  • C[r&1] 为 2、4 和 6 选择 o,否则为 space。

总的来说,它打印 r 加一个 作为骰子。 r = 1 给你两个点,而 r = 6 导致 7 个点,也许是程式化的点?

修复代码需要递增所有 r 测试并反转 odd/even 测试:

s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6]
print(s + C[1-r&1] + s[::-1])

演示(将字符串构建包装在一个函数中):

>>> import random
>>> def dice(r, C='o '):
...     s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6]
...     print(s + C[1-r&1] + s[::-1])
...
>>> for i in range(1, 7):
...     dice(i)
...
-----
|   |
| o |
|   |
-----
-----
|o  |
|   |
|  o|
-----
-----
|o  |
| o |
|  o|
-----
-----
|o o|
|   |
|o o|
-----
-----
|o o|
| o |
|o o|
-----
-----
|o o|
|o o|
|o o|
-----