我正在写一个数学测验程序(仅供学习),我已经制作了一个主菜单"通过定义功能块;在其中,如果输入为a
,则调用另一个func addition()
,如果输入为s
,则调用func subtraction()
,这将按预期工作。在这些功能块中,我将全局变量quiztype
设置为该功能的名称。然后我从那些函数中调用另一个函数again()
,以查询用户是否想要另一个相同类型的问题,如果是,我尝试使用quiztype ()
返回相关函数,这会失败TypeError: 'str' object is not callable
1}}。
我确实找到了一些看似相关的主题,但要么无法实现答案,要么甚至不理解他们所说的内容,因为我是初学者。
我有什么选择可以返回先前执行的功能?
这里是代码:(注意变量名称不是上面的 - 不同的语言)
from random import randint
def Alku ():
kysy = True
while kysy:
lasku = input('Yhteen, Vähennys, Lopeta? ')
if lasku == 'y':
Yhteenlasku ()
kysy = False
elif lasku == 'l':
break
kysy = False
def Uudestaan ():
kysy = True
while kysy:
samauudestaan = input('uudestaan? (k/e)? ')
if samauudestaan == 'k':
Lasku()
kysy = False
elif samauudestaan == 'e':
Alku ()
kysy = False
def Yhteenlasku ():
global Lasku
Lasku='Yhteenlasku'
n1=(randint(1,10))
n2=(randint(1,10))
a1=n1+n2
print(n1, end="")
print(" + ", end="")
print (n2, end="")
print(" = ", end="")
a2=int(input())
print()
if a1==a2:
print('oikein!')
elif a1!=a2:
print('väärin!')
Uudestaan()
Alku ()
终端返回的内容:
Traceback (most recent call last):
File "laskut2.py", line 43, in <module>
Alku ()
File "laskut2.py", line 8, in Alku
Yhteenlasku ()
File "laskut2.py", line 41, in Yhteenlasku
Uudestaan()
File "laskut2.py", line 19, in Uudestaan
Lasku()
TypeError: 'str' object is not callable
答案 0 :(得分:0)
您可以将函数赋值给变量(因为函数是Python的一等公民),所以有效,例如:
def fun1():
print("fun1")
def fun2():
print("fun2")
def fun3():
print("fun3")
f1 = fun1
f2 = fun2
f3 = fun3
functions = {
"invoke_f1" : f1,
"invoke_f2" : f2,
"invoke_f3" : f3
}
functions["invoke_f1"]()
function_to_invoke = functions["invoke_f2"]
function_to_invoke()
的产率:
fun1
fun2
更多阅读:https://en.wikipedia.org/wiki/First-class_function
在您的具体示例中,修改您的Uudestaan
功能。
def Uudestaan ():
Lasku = Yhteenlasku #Add this line
kysy = True
while kysy:
samauudestaan = input('uudestaan? (k/e)? ')
if samauudestaan == 'k':
Lasku()
kysy = False
elif samauudestaan == 'e':
Alku ()
kysy = False
因为你试图调用字符串,这是不可能的。尝试在你的情况下调用type(Lasku)
,你会发现它是str类型。通过我的修改在函数中调用它,你会看到函数的类型。
但是我不确定此代码中发生了什么,这是芬兰语吗?瑞典?
答案 1 :(得分:0)
我们真的需要看到你的代码才能看到你想要实现的目标,但是从它的声音中你想要做这样的事情。从问题看起来你会回想起函数内部的函数和返回函数,创建不是pythonic的递归,最终会抛出错误而另一个在这种情况下并不是真的需要。 jedruniu也对函数变量赋值做了非常好的解释。
不太健壮的版本:
def addition():
pass # Put code here
def subtraction():
pass # Put code here
def menu():
while True:
cmd = input("Addition or subtraction? (a/s): ")
if cmd == "a":
addition()
elif cmd == "s":
subtraction()
menu()
其他版本(带分数):
def addition():
# Put code here
result = True
return result # Will be added to score, so any integer or True/False
def subtraction():
# Put code here
result = True
return result # Will be added to score, so any integer or True/False
def menu():
score = 0
while True:
cmd = input("Addition or subtraction? (a/s/exit): ").strip().lower()
if cmd == "exit":
break
elif cmd == "a":
score += addition()
elif cmd == "s":
score += subtraction()
else:
print("Unknown option...")
# Do something with score or return score
if __main__ == "__main__":
menu()
答案 2 :(得分:0)
尽管您的global
声明处于奇怪的位置,但您的代码仍然正常。尽管如此,请删除围绕Lasku
定义的倒置逗号,将其定义为string
,它会起作用。
global Lasku
Lasku=Yhteenlasku
P.S。欢迎回到编程!
在回答您的问题时,通常会在代码的开头声明全局变量,或者当要定义的数据变为可用时,但是在这种情况下,您将其定义为函数,因此您无法定义它直到功能已定义。我想只要它有效,它就好了。就个人而言,我在这里定义:
global Lasku
Lasku=Yhteenlasku
Alku ()