嘿伙计们我的目标是通过制作一个我可以在vim中使用的简单工具箱来开始学习python。这是我尝试制作二进制到十进制计算器,但我似乎无法在迭代时更改我的列表。我是来自C的蟒蛇初学者。谢谢。 这就是我在心理上要做的事情:
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)
答案 0 :(得分:3)
该行
digits=x*(2**length)
表示“设置变量digits
以保留x*(2**length)
”。由于digits
是您必须访问数字列表的唯一方法,并且您刚刚使其保持一个数字,因此您将无法访问列表的其余部分(并且Python意识到这一点并销毁列表)。相反,您似乎想要设置x
的{{1}}元素,可以使用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
的结果),因此您无需通过调用{{1}来转换它};只要说input()
最后,对所有这些都有一种更简单的方法。如果我们在Python解释器中运行命令str
,我们会看到[int(x) for x in digits]
构造函数记录如下:
help(int)
int
将数字或字符串转换为整数,如果没有参数则返回0 给出。如果
int(x=0) -> integer
是一个数字,请返回int(x, base=10) -> integer
。对于浮点 数字,这会截断为零。如果
x
不是数字或者是否给出了基数,则x.__int__()
必须是字符串, bytes或bytearray实例,表示中的整数文字 给定基数。文字可以在x
或x
之后加以包围 通过空白。基数默认为10.有效基数为0和2-36。 基数0表示将字符串中的基数解释为整数文字。'+'
这意味着你可以制作整个节目
'-'
当然,这个版本在你开始学习Python的既定目标方面做得并不好。
答案 1 :(得分:0)
任何机会,你的意思是写
digits[x] = x*(2**length)
在你的for循环中?由于列表中的digits
,您基本上将整个digits
列表设置为for循环中的单个值。试试看,看看是否有效。