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.
它是如何工作的,更具体地说,比较符号(<和&)在索引中完成了什么?
有人在这里进行代码高尔夫,并使用hacky技巧来减少使用的代码量.
<是一个常规比较运算符; 它返回True或False基于两个操作数.Python的bool类型是子类int,并True为1,False是0当解释为整数.因此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)
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |