python 通过变量名调用定义
python calling definition by variable name
这里是 python 初学者。我以前的编程经验是八十年代的基础,以及专有系统中的逻辑编程,两者对学习帮助不大python。所以,对于我的问题:
我正在写一个数学问答程序(只是为了学习),我通过定义一个功能块做了一个"main menu";在其中,如果输入是 a
,则调用另一个 func addition()
,如果输入是 s
,则调用 func subtraction()
,这按预期工作。在这些功能块中,我将全局变量 quiztype
设置为该功能的名称。然后我从其中调用另一个函数 again()
来查询用户是否想要另一个相同类型的问题,如果是,我尝试 return 到相关函数 quiztype ()
和这个失败 TypeError: 'str' object is not callable
.
我确实找到了一些看似相关的主题,但由于我是初学者,所以要么无法实施答案,要么根本不明白他们在说什么。
我有哪些选项可以return调用之前执行的函数?
这是代码:(注意变量名不是上面的 - 不同的语言)
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 ()
在终端中 return 编辑了什么:
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
可以把function赋给一个变量(因为function是在Pythonfirst-classcitizen),这样有效,例如:
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 类型。使用我的修改在函数中调用它,您将看到函数类型。
但是我不确定这段代码是怎么回事,这是芬兰语吗?瑞典语?
我们确实需要查看您的代码以了解您想要实现的目标,但从它的声音来看您想要做这样的事情。从这个问题看来,您将在函数内调用函数并返回函数,创建不是 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()
尽管您的 global
声明在一个奇怪的地方,但您的代码目前还不错。尽管如此,删除围绕 Lasku
定义的倒逗号,它将其定义为 string
并且它将起作用。
global Lasku
Lasku=Yhteenlasku
P.S。欢迎回到编程!
针对您的问题,全局变量通常会在代码的开头或要定义的数据可用时声明,但在这种情况下,您将其定义为函数,因此直到函数已经定义。我想只要它有效,它在哪里都可以。就个人而言,在这种情况下,我会在这里定义它:
global Lasku
Lasku=Yhteenlasku
Alku ()
这里是 python 初学者。我以前的编程经验是八十年代的基础,以及专有系统中的逻辑编程,两者对学习帮助不大python。所以,对于我的问题:
我正在写一个数学问答程序(只是为了学习),我通过定义一个功能块做了一个"main menu";在其中,如果输入是 a
,则调用另一个 func addition()
,如果输入是 s
,则调用 func subtraction()
,这按预期工作。在这些功能块中,我将全局变量 quiztype
设置为该功能的名称。然后我从其中调用另一个函数 again()
来查询用户是否想要另一个相同类型的问题,如果是,我尝试 return 到相关函数 quiztype ()
和这个失败 TypeError: 'str' object is not callable
.
我确实找到了一些看似相关的主题,但由于我是初学者,所以要么无法实施答案,要么根本不明白他们在说什么。
我有哪些选项可以return调用之前执行的函数?
这是代码:(注意变量名不是上面的 - 不同的语言)
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 ()
在终端中 return 编辑了什么:
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
可以把function赋给一个变量(因为function是在Pythonfirst-classcitizen),这样有效,例如:
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 类型。使用我的修改在函数中调用它,您将看到函数类型。
但是我不确定这段代码是怎么回事,这是芬兰语吗?瑞典语?
我们确实需要查看您的代码以了解您想要实现的目标,但从它的声音来看您想要做这样的事情。从这个问题看来,您将在函数内调用函数并返回函数,创建不是 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()
尽管您的 global
声明在一个奇怪的地方,但您的代码目前还不错。尽管如此,删除围绕 Lasku
定义的倒逗号,它将其定义为 string
并且它将起作用。
global Lasku
Lasku=Yhteenlasku
P.S。欢迎回到编程!
针对您的问题,全局变量通常会在代码的开头或要定义的数据可用时声明,但在这种情况下,您将其定义为函数,因此直到函数已经定义。我想只要它有效,它在哪里都可以。就个人而言,在这种情况下,我会在这里定义它:
global Lasku
Lasku=Yhteenlasku
Alku ()