python通过变量名称调用定义

时间:2017-05-01 09:46:06

标签: python variables definition

这是一个python初学者。我之前的编程经验是八十年代的基础,以及专有系统中的逻辑编程,这对于学习python都没有太大帮助。所以,对我的问题:

我正在写一个数学测验程序(仅供学习),我已经制作了一个主菜单"通过定义功能块;在其中,如果输入为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

3 个答案:

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