为什么我的所有变量都得到一个 None 值?
Why am I getting a None value for all of my variables?
所以,我尝试制作一个简单的 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 return None
中的所有函数,除非您有 return-statement。所以,如果你想让你的numberConvert
函数return一个不同于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)
所以,我尝试制作一个简单的 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 return None
中的所有函数,除非您有 return-statement。所以,如果你想让你的numberConvert
函数return一个不同于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)