Skip to main content
 首页 » 编程设计

python之为什么我的所有变量都得到一个 None 值

2025年05月04日16davidwang456

因此,我尝试制作一个简单的 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 = numberConvert(R1) 之后立即打印值 R1,它会给我 None 作为输出。

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

请您参考如下方法:

默认情况下,Python 中的所有函数都返回None,除非您有一个return-statement。 .所以,如果你想让你的 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 函数,我还想提几点:

  1. Python 中的 if 语句不需要括号。事实上,大多数 Python 程序员认为它们是糟糕的风格。相反,您应该这样做:

    if a == "10": 
      a = "a" 
    elif a == "11": 
      a = "b" 
    ... 
    
  2. 确实没有理由这样做:

    a = str(a) 
    

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

    if a == 10: 
      a = "a" 
    elif a == 11: 
      a = "b" 
    
  3. 如果需要,您可以使用 dictionary避免所有这些 if 语句:

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