線
digits=x*(2**length)
指「設置變量digits
保持x*(2**length)
」。由於digits
是您必須訪問數字列表的唯一方式,並且您只保留了一位數字,所以您無法訪問列表的其餘部分(並且Python意識到這一點並銷燬列表)。相反,它看起來像你想設置x
th元素digits
,可以通過digits[x]
訪問。這意味着你想要的行是
digits[x] = digits[x]*(2**length)
但是,這不是實現這一目標的最好方法。一方面,你只是將一堆數字加在一起;在不更改列表的情況下更容易做到這一點。例如:
total = 0
for x in range(len(digits)):
total += digits[x] * (2**length)
length=length-1
print(total)
(我從sum
改變了變量名total
因爲它往往是一個壞主意,覆蓋內置的名字)
需要注意的是,現在我們訪問x
的唯一途徑是通過調用digits[x]
。這是通常更地道遍歷列表本身,而不是指數:
total = 0
for digit in digits:
total += digit * (2**length)
length=length-1
print(total)
這個循環可以簡化爲不需要length
變量都:
total = 0
for digit in digits:
total *= 2
total += digit
print(total)
這加倍total
第一,和然後添加下一個數字。這是更可讀性(因爲length
作爲名稱通常表示總計長度,它不會改變,所以減少它似乎很奇怪),即使我們不知道我們有多少數字,工程。
另一個需要注意的是你如何生成digits
列表:
digits = [int(x) for x in str(digits)]
在這一點上,digits
已經是一個str
(因爲它是input()
的結果),所以你不需要轉換它打電話給str
;只是說[int(x) for x in digits]
最後,有一個更簡單的方法,所有這一切。如果我們在Python解釋器中運行的命令help(int)
,我們看到如下int
構造進行了說明:如果
int(x=0) -> integer
int(x, base=10) -> integer
轉換一個數字或字符串爲整數,或返回0無給出了參數 。如果x
是一個數字,則返回x.__int__()
。對於浮點數 ,這會向零截斷。
如果x
不是數字或如果基給出,然後x
必須是一個字符串, 字節或ByteArray實例表示在 給定的基本文字的整數。字面上可以前面有'+'
或'-'
,並且被空格包圍 。基數默認爲10.有效基數爲0和2-36。 基數0意味着將字符串中的基數解釋爲整數字面量。
>>> int('0b100', base=0)
4
這意味着,你可以讓你的整個程序
# There's no need to import sys; you never use it
#binary to decimal
# Your original program do the same thing in Python 2 and 3
print("Value:")
digits=input()
print(int(digits, 2))
當然,該版本並不在你開始學習Python的既定目標做的好工作。
'digits = x = x *(2 ** length)'?我看起來不正確,但後來我不知道python。無論如何,你應該舉例說明它失敗的輸入以及你得到的輸出。 – hnefatl
你爲什麼試圖在迭代時更改列表? – user2357112
@ user2357112爲此目的:[1 * 2^2,0 * 2^1,0 * 2^0]所以我可以然後對數組進行求和 – gethelplearning