因此,我尝试制作一个简单的Base 10到Base 16转换器(我意识到这是Base 10整数到模拟Base 16字符串)。我是Python的新手。我本周刚刚开始学习它(我有使用C#的编程经验,所以我不会对此感到迷茫)。

R1 = 0
R2 = 0
R3 = 0
R4 = 0
R5 = 0

number = int(raw_input("Enter a base 10 number (Smaller than 1048576): "))

def numberConvert(a=0):
  a = str(a)

  if (a == "10"):
    a = "a"
  elif (a == "11"):
    a = "b"
  elif (a == "12"):
    a = "c"
  elif (a == "13"):
    a = "d"
  elif (a == "14"):
    a = "e"
  elif (a == "15"):
    a = "f"
  else:
    a = a

#Dividing

Q1 = (number // 16)
R1 = (number % 16)

Q2 = (Q1 // 16)
R2 = (Q1 % 16)

Q3 = (Q2 // 16)
R3 = (Q2 % 16)

Q4 = (Q3 // 16)
R4 = (Q3 % 16)

Q5 = (Q4 // 16)
R5 = (Q4 % 16)

R1 = numberConvert(R1)
R2 = numberConvert(R2)
R3 = numberConvert(R3)
R4 = numberConvert(R4)
R5 = numberConvert(R5)

print R1 + R2 + R3 + R4 + R5


运行并输入1048575(这是它可以达到的最高水平,因此我期望将“ fffff”作为输出),它给了我:

C:\PythonPrograms\Modules>Decimal_to_Hex.py
Enter a base 10 number (Smaller than 1048576): 1048575
Traceback (most recent call last):
  File "C:\PythonPrograms\Modules\Decimal_to_Hex.py", line 50, in <module>
    print R1 + R2 + R3 + R4 + R5
TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'


在运行了一些主要涉及在函数的开头和结尾将R1转换为R5值的测试之后,我得出的结论是问题出在R1 = numberConvert(R1)部分。在此之前的任何时间,变量均正常运行。输入功能后,在功能开始时,R变量的编号为0到15。

在功能numberConvert完成之前,它们是0到9或“ a”到“ f”。但是,如果我要在R1之后立即打印值R1 = numberConvert(R1),它将为我提供None作为输出。

根据我的阅读,这实际上是Python的null值。因此,我将问题缩小到运行函数numberConvert的部分。

最佳答案

除非您具有return-statement,否则Python中的所有函数默认都会返回None。因此,如果您希望numberConvert函数返回除None以外的其他值,则需要输入一个:

def numberConvert(a=0):
  a = str(a)

  if (a == "10"):
    a = "a"
  elif (a == "11"):
    a = "b"
  elif (a == "12"):
    a = "c"
  elif (a == "13"):
    a = "d"
  elif (a == "14"):
    a = "e"
  elif (a == "15"):
    a = "f"
  else:
    a = a

  ########
  return a
  ########




因为您说自己有C#经验,所以也许您认为这样做:

R1 = numberConvert(R1)


将通过R1作为参考,只要您这样做,该参考就会在numberConvert内部进行修改:

a = ...


但是,这是不正确的,因为a被视为分配了R1值的本地名称。有关此的更多信息,请参见How do I pass a variable by reference?



另外,关于您的numberConvert函数,我想说几件事:


在Python中,不需要括号和if语句。实际上,大多数Python程序员都认为它们是不好的风格。相反,您应该这样做:

if a == "10":
  a = "a"
elif a == "11":
  a = "b"
...

确实没有理由这样做:

a = str(a)


因为您可以直接与整数进行比较:

if a == 10:
  a = "a"
elif a == 11:
  a = "b"

如果需要,可以使用dictionary来避免所有这些if语句:

def numberConvert(a=0):
    return {"10":"a","11":"b","12":"c","13":"d","14":"e","15":"f"}.get(a, a)

关于python - 为什么我所有变量的值都为None?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27762092/

10-12 22:48