在 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 True
或 False
基于两个操作数。 Python bool
类型是 int
的子类,当解释为整数时,True
是 1
,False
是 0
。因此 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|
-----
我遇到了以下情况:
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 来尽量减少使用的代码量。
<
是常规比较运算符;它 returnsTrue
或False
基于两个操作数。 Pythonbool
类型是int
的子类,当解释为整数时,True
是1
,False
是0
。因此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|
-----