【问题标题】:Why am I getting a None value for all of my variables?为什么我的所有变量都得到 None 值?
【发布时间】:2015-01-04 03:32:16
【问题描述】:

所以,我尝试制作一个简单的 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'

在我运行了一些主要涉及在函数开头和结尾打印R1R5 值的测试之后,我得出的结论是问题出在R1 = numberConvert(R1) 部分的某个地方。在此之前的任何时间,变量都会正常运行。在函数的开头,输入后,R 变量是数字 0 到 15。

就在函数numberConvert 完成之前,它们是0 到9,或“a”到“f”。但是,如果我要在R1 = numberConvert(R1) 之后立即打印值R1,它会给我None 作为输出。

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

【问题讨论】:

  • 嗯,你实际上并没有从你的函数中 return 任何东西。
  • 你为什么一开始就转换成字符串?为什么不与 number 15 比较(例如)?如果要返回字符串,则在返回值时进行字符串转换。

标签: python function variables arguments nonetype


【解决方案1】:

默认情况下,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)
    

【讨论】:

  • 啊,我明白了;我只是习惯于使用括号作为组织。
猜你喜欢
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2020-07-10
相关资源
最近更新 更多