Python NameError:未定义名称“z”

Python NameError:未定义名称“z”,python,binary,decimal,converter,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 = inpu

我试图为我的计算类中的一个项目制作一个二进制到十进制的转换器,我的代码出现了这个错误: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
任何帮助都将不胜感激

您需要将z指定给一个值,因为您可以使用+=

将z=0添加到脚本的顶部。

您从未初始化过z,因此,如果将z=0放在if语句上方的行上,您将不再有问题

bd = input("""
Would you like to convert a number into:
a) Binary to Decimal
b) Decimal to Binary
""")

z = 0 
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

这是你的第一种编程语言吗?如果是这样,让我向您介绍变量初始化的概念

当计算机运行代码时,它正在处理内存和CPU之间的字节。您可能已经知道这一点,但您可能没有意识到的是,在您的代码中,您要求计算机对z执行操作,而z是一个尚不存在的变量

记住一些别的事情。Python不需要初始化变量就可以分配给它。那么,为什么在程序运行之前需要初始化z呢?答案很简单:对z的第一次引用是一个操作。尽管Python可以在没有初始化的情况下动态地自动分配变量,这与其他编程语言不同,但通常情况下,它仍然需要该变量存在,然后才能进行数学运算

简单的解决方案是在if bd='a'之前的任意一点添加z=0:因为如果将它放在后面,每次它进入if语句时,它都会用0重写z,破坏它的逻辑

快乐编码

编辑:除此问题外,您还将面临以下错误:

你看,当你输入“1”时,你说1是一个字符串,因为你用引号把它括起来,就像你写的一样:

if answer [i] == "1":
相反,你需要的是线路

if answer [i] == 1:
因为这告诉它分配数字1。然后在行动中,

answer += 1*z**i
您将告诉它将三个数字相乘,而不是两个数字和字符串1相乘

在C等其他语言中,必须声明变量,以便计算机知道变量类型。您必须编写字符串变量\ u name=字符串文本,以便告诉计算机该变量是字符串。在Python中,类型转换是自动进行的。Python看到variable=string文本,它知道因为您使用了,所以它是字符串类型的变量。不幸的是,这意味着您错误地将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
从上到下,我会复习我写的东西,跳过你的代码,我会解释它是做什么和如何做的。希望这能帮助您进行十进制->二进制转换,因为我假设您仍然需要这样做

因此,我们首先对你的开场白做一些修改。以前的bd=input,现在的bd=raw\u input.lower

bd仍然是a或b。但在那份声明中有一些不稳定的类型处理,至少在我这边。所以,我使用了原始输入,不管答案是什么,它都会将答案转换成字符串。例如,如果您使用101010011进行回答,它将存储变量101010011,而不是数字101010011,尽管这无论如何都是错误的-它将以10为基数,因此它实际上是101010011。。。我还加了一句。lower,正如你可能猜到的,它把你的答案从你写的东西变成了你写的东西。这是数据卫生的一个例子,在一个好的程序中是至关重要的,因为人们可能很愚蠢,希望计算机知道他们的意思。当然,计算机不知道你的意思,所以你必须非常小心,知道用户会犯什么错误,并提前做好计划。这是一部关于这个主题的漫画,你现在肯定会看到

因此,我们来谈谈这项计划的内容。我们首先用以下方法测试答案a的条件:

现在,如果你加入A,这仍然有效,因为。更低。如果你把b放进去,如果它不起作用,你还得把十进制->二进制代码放进去!,永远记住,有一天,有人会输入C,只是为了欺骗你,所以用一个elif表示b,用另一个表示其他任何东西

在这之后,我们遇到的第一个迹象,它只是我的代码

number_original = raw_input("Please enter a bin...
我将其命名为number_original,因为在代码中,清晰简洁始终是最佳实践。记住,变量名this_是_变量_我用_计算_我的周长比x好,只要它能清楚地解释它是什么,并帮助其他人理解你的工作。在这种情况下,更高级的程序员喜欢模棱两可,但很多时候这只是在炫耀

我再次使用原始输入,因为我实际上希望我的号码是stor 他像一根绳子一样被捆起来。还记得我说过101010011对计算机来说是101010011吗?这将很难检查,因为计算机将假定一个以10为基数的数字。因此,我将其存储为字符串101010011,避免了整个问题。还有一个额外的好处是字符串具有操作方法,使其更易于使用,比您尝试使用range8引入的逻辑更容易。很快就能看到那个操纵器

接下来,我们声明变量:

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.
正如我在这篇文章的原始版本中提到的,它们是初始化的,因为当你第一次在循环中对它们进行操作时,你需要对它们进行数学运算,它们需要作为一个数字存在,然后才能进行运算。即使它们从0开始

现在我们来看最有趣的部分,for循环。基于您的原始工作,您可以了解for循环是如何工作的,但我将详细介绍它们,希望它能在您需要了解全局时尽可能帮助您

在for循环中,您需要迭代一系列数字。在原始代码中,您生成了要迭代的范围[0,1,2,3,4,5,6,7]。我想你这样做是为了跟踪你在二进制数中的哪个位置,我也在这样做,但方式不同,我慢慢设计了一种方法,以帮助你尽可能地实现最好的十进制到二进制

首先,记住数字现在是字符串,所以'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.
上述代码将为您提供以下结果:

s
u
p
e
r mari
super mari
o brothers
请特别注意,索引从0开始,这就是为什么demo_字符串[1]是u而不是s

知道了这一点,您可能会开始意识到为什么我们将number_original保留为一个字符串:现在我们可以使用它的索引并对其进行迭代,而不是使用range创建我们自己的范围!这就是为什么我们可以在ReverseEnumber_original中输入i;因为这使得它从ReverseEnumber_original[0]循环到ReverseEnumber_original[i],直到我能走的为止**注:**我们将很快讨论使用*反转的原因

是学习数字/计算机科学和数学的时候了! 你已经学会了用二的幂来表示每一个二进制数字了吗?我知道你理解二进制数转换的基本概念。好吧,这里还有一个很酷的技巧,你可能知道,也可能不知道:

... #  #  #  #  #  # <--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...)
因为现在,for循环将向后迭代!它将为我们从右向左读取字符串

我们还知道2^x=十进制的数字值

因此,我们在for循环的每次迭代中要做的是:

检查i='1'注释,这次我们希望它是一个字符串。 如果i='1',如中所示,我们突出显示的数字是'1',那么。。。 将转换后的数字加上转换后的数字+2^j 然后累积一次到j,因此下一次的行程会更高。 为了直观地表达这一点,我将对编号101010011进行两次循环

环路4 j=4 已转换的数量=仍在转换的3 反向编号是否为原始编号[3]=“1”?10101001,所以没有 然后将1加上j=5 环路5 j=5 已转换的数量=仍在转换的3 反向编号是否为原始编号[4]=“1”?1010101,所以是的! 然后取转换后的数字3,再加上2^j 2^5=16,转换后的数字=25 然后在j=6上加1 环路6 j=6 已转换的数量=35个仍在转换中 这将持续到最后

好了。二进制到十进制,在python中

如果您对此有任何疑问,请询问。我记得我刚开始的时候对这些东西感到困惑

同样,快乐编码。

您从未定义过z。请尝试以下代码:


谢谢,这很有效,但我知道得到错误:回溯最近的调用最后:文件C:/Users/joshua/Desktop/Task 1.py,第15行,在回答+=1*z**I类型错误:无法将“int”对象转换为strimplicitly@user2904154,查看我的答案-我已经解释了您所面临的第一个和第二个错误。@jwarner112,您的答案要完整得多。谢谢,这很有效,但我知道会出现错误:回溯最近一次调用上次:文件C:/Users/joshua/Desktop/Task 1.py,第15行,答案+=1*z**I类型错误:无法将“int”对象转换为strimplicitly@user2904154,在编程中,解决一个问题会导致下一个问题的出现是很常见的。你对z的使用被破坏了;你对答案的使用也是如此。你需要解决这两个问题才能让你的程序运行。是的,我现在明白了,谢谢,这是我的第一种编程语言,但是现在它说“Indexer:字符串索引超出范围”很抱歉,这是我的GCSE考试的一部分,我选择了计算,然后大部分时间都是在医院学习的,背部骨折,所以我在这方面没有学到很多东西。@user2904154请放心,我还在做这件事-只是多任务。@jwarne112,我不得不祝贺你做出了如此惊人的成绩
我的回答很难听+我希望这能得到更多的选票。@heather几年后,听到人们仍然得到帮助,真是太好了!:@jwarner真棒的回答
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.
s
u
p
e
r mari
super mari
o brothers
... #  #  #  #  #  # <--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...)
for i in reversed(string):
z = 0
bd = raw_input("Would you like to convert a number into:\n a) Binary to Decimal\n b) Decimal to Binary")


if bd == 'a':
    answer = raw_input("Please enter a Binary number. Up to, and including, 8 digits of 1 and 0")
z += 2
ex = 0
for i in xrange(8):
    if answer[i] == '1':
        ex += 1*z**i