use*_*154 0 python binary decimal converter
我正在尝试为我的计算类中的项目创建一个二进制到十进制的转换器,并且我的代码出现了这个错误:"NameError:name'z'未定义"我查找了答案,他们修复了一个错误但是给出了另一个.这是代码:
bd = input("""
Would you like to convert a number into:
a) Binary to Decimal
b) Decimal to Binary
""")
if bd == 'a':
answer = input("""
Please enter a Binary number. Up to, and including, 8 digits of 1 and 0
""")
z += 2
for i in range(8):
if answer [ i ] == '1':
answer += 1*z**i
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助!
jwa*_*112 38
这是你的第一个编程语言吗?如果是这样,让我向您介绍可变初始化的概念.
当计算机运行代码时,它正在处理内存和CPU之间的字节.您可能已经知道了这一点,但您可能没有意识到的是,在您的代码中,您要求计算机对z尚不存在的变量执行操作.
记住别的东西.Python不需要初始化变量以便分配给它.那么,为什么z在程序运行之前需要初始化呢?答案很简单:您的第一个参考z是操作.尽管Python可以自动(无需初始化)动态分配变量(通常与其他编程语言不同),但在使用它完成数学之前,它仍然需要存在所述变量.
简单的解决办法是增加z = 0在之前的任何点if bd == 'a':(因为如果你把它后,每次进入时if声明,它会随着写z有0,破坏了逻辑吧.
快乐的编码!
编辑:除了这个问题,你将面临错误的问题:
File "C:/Users/<USERNAME>/Desktop/Task 1.py", line 15, in <module> answer += 1*z**i TypeError: Can't convert 'int' object to str implicitly
Run Code Online (Sandbox Code Playgroud)
来自这条线:
if answer [ i ] == '1':
Run Code Online (Sandbox Code Playgroud)
你看,当你输入时'1',你说这1是一个字符串,因为你用引号括起来,就像你写的一样:
if answer [i] == "1":
Run Code Online (Sandbox Code Playgroud)
相反,你需要的就是这条线
if answer [i] == 1:
Run Code Online (Sandbox Code Playgroud)
因为这告诉它分配号码 1.然后,在操作中
answer += 1*z**i
Run Code Online (Sandbox Code Playgroud)
你将告诉它乘以三个数而不是两个数字和字符串 "1".
在其他语言(如C)中,必须声明变量,以便计算机知道变量类型.你必须写string variable_name = "string text",以告诉计算机该变量是一个字符串.在Python中,类型转换会自动发生.Python看到variable = "string text"并且它知道因为你使用过"",它是一个字符串型变量.不幸的是,这意味着你错误地制作1了一个字符串.
了解?
编辑2:发生的事
好的,所以你一直遇到错误.当我运行你的代码时,我一直遇到不同的错误.因为在各类棘手的语法和改变的暗示,我决定一个更容易的路线走是重写代码和向你解释如何和为什么它的工作原理.所以,这是新代码:
bd = raw_input("""
Would you like to convert a number into:
a) Binary to Decimal
b) Decimal to Binary
""").lower()
## ORIGINAL CODE
##
##if bd == 'a':
## answer = input("""
##Please enter a Binary number. Up to, and including, 8 digits of 1 and/or 0
##""")
##
## print answer
## for i in range(8):
## z += 2
## if answer[i] == '1':
## answer += 1*z**i
##NEW CODE
if bd == 'a':
number_original = raw_input("Please enter a Binary number (a string of 1's and 0's)")
j = 0
number_converted = 0
for i in reversed(number):
if i == '1':
number_converted += 2**j
j+=1
print number_converted
Run Code Online (Sandbox Code Playgroud)
从上到下,我将回顾我写的内容(我将跳过你的代码),我将解释它的作用以及它是如何做到的.希望这会帮助你进行十进制 - >二进制转换,因为我认为你还有这个要做.
因此,我们首先对您的开场问题进行一些更改.在你之前bd=input(""),你现在有bd=raw_input("").lower().
bd仍然是a或b.但是在那个声明中有一些不稳定的类型处理,至少在我的结尾.所以,我利用raw_input()它将你的答案变成了一个字符串,无论它是什么.如果你回答,101010011例如,它将存储变量"101010011"而不是数字101010011(虽然这将是错误的 - 它会base 10,所以它实际上是101,010,011)...我还添加了.lower(),你可能会猜测,转动你的从回答whAtevErYouWritE到whateveryouwrite.这是一个例子数据卫生,是至关重要的在一个好的计划中,因为人们可能是愚蠢的,并期望计算机知道他们的意思.当然,计算机不知道你的意思,所以你必须非常小心,知道用户可以犯的错误,并提前做好计划(奖励:这里有关于这个主题的漫画,你现在肯定会得到).
所以对程序的肉.我们首先测试答案的条件a:
if bd == 'a':
Run Code Online (Sandbox Code Playgroud)
现在,如果你投入A,这仍然会有效.lower().如果你放b,如果不行(你还没有输入你的十进制 - >二进制代码!),并且永远记住,有一天,有人会投入C,只是为了哄你,所以包括一个eliffor b和elsefor for for anything其他.
在此之后,我们遇到了它的第一个迹象,只是我的代码.
number_original = raw_input("Please enter a bin...
Run Code Online (Sandbox Code Playgroud)
我把它命名为number_original,因为在代码中,最好的做法是清晰简洁.请记住,变量名称this_is_the_variable_i_use_to_calculate_my_circumference要好于x它清楚地解释它是什么,并帮助其他人了解您的工作.更高级的编码员喜欢在这种情况下模棱两可,但很多时候它只是炫耀.
我raw_input()再次使用,因为我实际上希望我的号码存储为字符串.还记得当我说那101010011是101,010,011电脑吗?这将非常难以检查,因为计算机将采用基数为10的数字.因此,我只是将它存储为字符串"101010011",并避免了整个问题.此外还有一个额外的好处,即字符串具有操作方法,使其更易于使用,比您尝试引入的逻辑更容易range(8).很快就能看到那个操纵者.
接下来,我们声明我们的变量:
j = 0 #This 'j' accomplishes the same work done by your 'z' variable.
number_converted = 0 #this will be correctly converted by the end, as we add to it.
Run Code Online (Sandbox Code Playgroud)
正如我在这篇文章的原始版本中提到的那样,这些是初始化的,因为你第一次在循环中对它们进行操作时,你会对它们进行数学计算,并且它们需要在你做到之前作为数字存在.即使他们从0开始.
所以现在我们来看看最有趣的部分,即for循环.根据您的原创作品,您可以了解for循环的工作原理,但我将详细介绍它们,以便有希望在您需要查看大图时尽可能地帮助您.
在for循环中,您需要迭代一系列数字.在原始代码中,您生成了[0,1,2,3,4,5,6,7]迭代范围.我想你是这样做的,所以你可以跟踪你所在的二进制数中的哪个位置,我也是这样做的,但是以不同的方式,我设计得很慢,以帮助你做到最好十进制到二进制系统我可以.
首先,记住现在number是一个字符串,所以`"101010011".接下来,意识到字符串具有可以像这样访问的索引.
demo_string = "super mario brothers"
print demo_string[0]
print demo_string[1]
print demo_string[2]
print demo_string[3]
print demo_string[4:10]
print demo_string[:10] #if you leave out the first number, it starts at the beginning
print demo_string[10:] #if you leave out the last number, it ends at the end.
Run Code Online (Sandbox Code Playgroud)
上面的代码将为您提供以下结果:
s
u
p
e
r mari
super mari
o brothers
Run Code Online (Sandbox Code Playgroud)
要特别注意的索引开始为0,这就是为什么demo_string[1]是u和不是s.
知道了这一点,你可能会开始意识到我们为什么离开number_original了一个字符串:现在我们可以使用它的索引并迭代它而不是使用我们自己的范围range()!这就是我们可以打字的原因for i in reverse(number_original); 因为这使得它从循环reverse(number_original)[0]到reverse(number_original)[i],只要i是能去.**注意:***我们将简要介绍我们为何使用*reverse() .
您是否已经学会了以2的幂形式表达每个二进制数字?我知道你理解二进制数转换的基本概念.好吧,这是你可能或可能不知道的另一个很酷的技巧:
... # # # # # # <--The binary number, eg "101010"
...32 16 8 4 2 1 <--What each digit stands for in decimal form
... 5 4 3 2 1 0 <--The power of two that it stands for (2^5=32, 2^4=16...)
Run Code Online (Sandbox Code Playgroud)
你会意识到的另一件事是通常(并非总是如此,但通常情况下,二进制数字是从右到左读取的.这将在一瞬间派上用场).
所以我们处于for循环中.我们现在知道我们可以迭代一个字符串.但二进制数字从右向左读取.那么,二进制数10 = 2,不是10 = 1.这就是为什么我们写道:
for i in reversed(string):
Run Code Online (Sandbox Code Playgroud)
因为现在,for循环将向后迭代!它会为我们从右到左读取字符串.
我们也知道2^x = (digit value in decimal).
那么我们在循环的每次迭代中会做的for是:
i == '1' 注意,这次我们希望它是一个字符串.i == '1',我们突出显示的数字是 a '1',那么......number_converted并添加number_converted + 2^jj,所以它的较高下一趟之一.为了直观地说,我会在数字上做两个循环101010011.
循环4
j = 4
number_converted = 3(仍在转换)
被反转(number_original)[3] =='1'?(1 1 0 0 1 0 1 0 1,所以没有)
然后将1添加到j(j = 5)
循环5
j = 5
number_converted = 3(仍在转换)
被反转(number_original)[4] =='1' ?(1 1 0 0 1 0 1 0 1,所以是!)
然后取number_converted(3)并将2 ^ j(2 ^ 5 = 16)加到它(number_converted = 25)然后将1加到j(j = 6)
循环6
j = 6
number_converted = 35(仍在转换)
这将继续直到结束!
所以你有它.二进制到十进制,在python中.
如果您对此有任何疑问,请询问.我记得第一次开始时对这些东西感到困惑!
而且,快乐编码.