我试图创建一个可以解决简单方程式的函数,但是在添加了一系列“ if”以定义局部变量并随后打印后出现错误
def re_eq(eq):
numbers = ""
for char in eq:
if char.isalpha():
incog = char
elif char.isdigit():
numbers += char
numbers += " "
elif char.isascii():
if char == "+" or "-" or "*" or "/":
sym = char
num1, num2 = numbers.split()
if sym == "+":
resol = int(num2) - int(num1)
elif sym == "-":
resol = int(num2) + int(num1)
elif sym == "*":
resol = int(num2) / int(num1)
elif sym == "/":
resol = int(num2) * int(num1)
print(incog, " = ", resol)
只有在添加第二个链“ if”和“ elif”之后,问题才开始发生:
resol = int(num2) * int(num1)
print(incog, " = ", resol)
那时没有问题
在调用方程式时,应根据所使用的值显示“ x = 2”或类似内容,但我得到了
"local variable 'resol' referenced before assignment"
我无法理解为什么在实际打印它之前先解析它的引用;我可以只使用“ return”,也可以使用全局变量,但我想至少了解正在发生的事情以及为什么要进行学习
(该函数在调用时会使用输入为“ 4 + x = 9”的参数进行调用)
答案 0 :(得分:4)
if-elif
链没有以else
子句结尾。这意味着在某些情况下,控制权可能不会进入任何if-elif
块中,在此期间根本不会创建变量resol
并导致错误。
在resol
链之前将if-elif
初始化为某个默认值,或添加一个else
子句并在其中将resol
初始化为默认值。
此外,更改此行
if char == "+" or "-" or "*" or "/":
...
到
if char in {"+", "-", "*", "/"}:
...
表达式if char == "+" or "-" or "*" or "/":
将始终取值为True
。 or
的优先级比==
低,这意味着它实际上按照if (char == "+") or "-" or "*" or "/":
的顺序进行求值,因此,即使char
不等于"+"
,“- “是一个非空str,始终为True
。控件进入if
语句,并且sym
被赋予char
所具有的任何值,即使这不是您想要的。
答案 1 :(得分:0)
if char == "+" or "-" or "*" or "/":
并不意味着您认为的意思。它实际上与if True:
相同,因为如果char
不等于'+'
,则表达式等于'-'
,这是正确的,因为它的长度非零。您可能是说if char in '+-*/':
。这意味着您的if/elif
部分并不详尽,并且您从未尝试分配resol
,但仍尝试打印它。