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

Jos*_*sco 5 python compare slice python-3.x

我遇到了以下情况:

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])
Run Code Online (Sandbox Code Playgroud)

在IDLE中执行时,会输出一个带有随机值的ASCII die.

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

Mar*_*ers 7

有人在这里进行代码高尔夫,并使用hacky技巧来减少使用的代码量.

  • <是一个常规比较运算符; 它返回TrueFalse基于两个操作数.Python的bool类型是子类int,并True1,False0当解释为整数.因此C[r<1]选择C[0]或选择C[1].

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

打破这个:

  • C是带有o空格字符的字符串
  • C[r<1]选择一个o或一个基于它的空间小于1.它永远不会(random.randint(1,6)确保这一点),所以这总是一个o.这似乎是代码中的错误或疏忽.
  • C[r<3]选择1和2的空格,o否则.
  • C[r<5]选择o5或6,否则为空格.
  • C[r&1]选择一个o2,4和6,否则为空格.

总之,它打印r 加一个作为骰子.r = 1给你两个点,而r = 6结果是七点,也许是一个风格化的点?

修复代码需要递增所有r测试并反转奇数/偶数测试:

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

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

>>> 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|
-----
Run Code Online (Sandbox Code Playgroud)