在这个程序中,我让用户输入一个等式并将其显示回来。
我遇到的问题是,当我再次调用要求方程的函数时,我得到一个TypeError。我知道为什么我一直收到这个错误,并尝试了多种方法来尝试修复它。帮助
import parser
def eq():
global eq
global eq_parsed
while True:
eq = input('f(x) = ')
try:
eq_parsed = parser.expr(eq).compile()
x=0
eval(eq_parsed)
break
except:
print("invalid equation")
print ("Your equation: f(x)=", eq)
mark=True
return (mark)
T=True
mark=False
while T==True:
if mark==False:
n=input("\nStart? (y/n): ")
elif mark==True:
n=input("\nStart Again? (y/n): ")
#----------------------------------------
if n=='y':
mark = eq()
elif n=='n':
break
else:
print("Invalid Input*")
答案 0 :(得分:4)
您的问题是您使用eq
同时是函数名和全局变量。因此,当您编写eq()
时,名称eq
将引用全局变量。
def eq(): # eq refers to this function
global eq
....
eq = input('f(x) = ') # now eq refers to the string object return by input
....
mark = eq() # and a string object is not callable
如果为函数和全局字符串变量使用不同的名称,您将使生活变得更轻松。另一种使事情变得更清晰的方法是停止使用global
,并在函数的return语句中返回调用者需要的任何内容。
def eq():
while True:
eq_input = input('f(x) = ')
try:
eq_parsed = parser.expr(eq).compile()
x=0
eval(eq_parsed)
break
except:
print("invalid equation")
print ("Your equation: f(x)=", eq_input)
return True, eq_input, eq_parsed
然后像这样称呼它:
mark, eq_input, eq_parsed = eq()
目前您似乎没有使用分配给函数外部eq_input
和eq_parsed
的值。在这种情况下,您根本不需要返回它们,它们可以保持在函数的本地。
写
是惯用的if val:
而不是
if val == True:
同样
if not val:
优先于
if val == False:
答案 1 :(得分:2)
您已将函数命名为eq()
,并且还有一个名为eq
的全局变量。你不能两者兼得。由于Python(通常)从上到下进行评估,因此首先将函数的名称分配给标识符eq
,然后在input()
调用的结果中进行评估。当您尝试在底部调用eq()
时,您会收到错误,因为Python认为您正在尝试调用字符串。
也许命名变量equation
,以避免混淆。
答案 2 :(得分:1)
def eq():
global eq
# ...
eq = input('f(x) = ')
在调用eq
时将eq
全局重新定义为输入内容,这是一个字符串。为函数和变量使用不同的名称。
因此,你可以只调用eq
一次,然后它引用一个字符串而不再是一个函数。