2016-03-16 17 views
5

我遇到以下:在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的隨機值死亡。

它是如何工作的,更具體地說,比較符號(<&)在索引內完成了什麼?

回答

7

有人在這裏打碼打高爾夫球,並使用hacky技巧來儘量減少使用的代碼量。

  • <是一個常規比較運算符;它基於兩個操作數返回TrueFalse。 Python bool類型是int的子類,當解釋爲整數時,True1,False0。因此,C[r<1]要麼選擇C[0]要麼選擇C[1]

  • &是一個按位運算符,而不是比較運算符; & 1將數字屏蔽到最後一位,有效測試數字是奇數還是偶數(最後一位是否設置)。所以如果r是奇數,則使用C[1],否則爲C[0]

打破下來:

  • Co和空格字符
  • C[r<1]選秀權或者o或基於羯羊它是小於1。它永遠不會是一個空間(一個字符串random.randint(1,6)確保這一點),所以這是總是o。這似乎是代碼中的錯誤或疏忽。
  • C[r<3]爲1和2選擇空間,否則爲o
  • C[r<5]選擇一個o爲5或6,否則爲空格。
  • C[r&1]爲2,4和6挑選o,否則爲空格。

在所有,它打印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]) 

演示(包裹串建設一個功能):

>>> 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| 
----- 
+0

這正是我在尋找。謝謝 –