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 ()