2017-08-09 77 views
-4

嘿,我打算通過製作一個簡單的工具箱來開始學習python,我可以在vim中使用它。這裏是我試圖做一個二進制到十進制計算器,但我似乎無法改變我的列表,而迭代。我是一名來自C的Python初學者。謝謝。 這就是我想要做的事情:迭代時無法更改列表

100 - > [1,0,0] - > [1 * 2^2,0 * 2^1,0 * 2^0] - > 4 + 0 + 0 = 4

import sys 

#binary to decimal 

print("Needs to be ran in python3\n") 
print("Value:") 

digits=input() 
# add except statement here 
length=len(digits)-1 
digits = [int(x) for x in str(digits)] 

print(digits) 

for x in range(len(digits)): 
     digits=x*(2**length) 
     length=length-1 

sum=sum(digits) 
print(sum) 
+2

'digits = x = x *(2 ** length)'?我看起來不正確,但後來我不知道python。無論如何,你應該舉例說明它失敗的輸入以及你得到的輸出。 – hnefatl

+6

你爲什麼試圖在迭代時更改列表? – user2357112

+0

@ user2357112爲此目的:[1 * 2^2,0 * 2^1,0 * 2^0]所以我可以然後對數組進行求和 – gethelplearning

回答

3

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的既定目標做的好工作。

+0

我怎麼可能不喜歡這個? ;) 做得好! –

+0

@ PM2Ring你在OP評論中提到的唯一沒有提到的東西是直接迭代字符串。我想到了,但是每次你仍然需要在for循環中調用'int',並且我可以看到更加清潔。 –

0

以任何機會,你的意思寫

digits[x] = x*(2**length) 
在for循環

?由於digits在列表中,因此基本上將整個digits列表設置爲該for循環中的單個值。試試看看是否有效。