【问题标题】:python calling definition by variable namepython通过变量名调用定义
【发布时间】:2023-03-10 17:33:01
【问题描述】:

这里是python初学者。我之前的编程经验是八十年代的basic,和专有系统中的逻辑编程,这对学习python没有多大帮助。所以,对于我的问题:

我正在编写一个数学测验程序(仅用于学习),并且我通过定义一个功能块制作了一个“主菜单”;在其中,如果输入为a,则调用另一个函数addition(),如果输入为s,则调用函数subtraction(),并按预期工作。在这些功能块中,我将一个全局变量 quiztype 设置为该函数的名称。然后我从其中调用另一个函数again(),以查询用户是否想要另一个相同类型的问题,如果是,我尝试使用quiztype () 返回相关函数,但TypeError: 'str' object is not callable 失败。

我确实找到了一些看似相关的主题,但由于我是初学者,要么无法实施答案,要么甚至不明白他们在说什么。

我有哪些选项可以返回到之前执行的函数?

这是代码:(注意变量名不是上面的 - 不同的语言)

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

【问题讨论】:

  • 你能把你的完整代码显示到它中断的地方吗? (粘贴并格式化到问题中)
  • 请编辑您的问题并粘贴代码的相关部分以及完整的错误消息。
  • 嗯,这肯定比只问代码的问题要好,但我们仍然需要代码来帮助你。

标签: python variables definition


【解决方案1】:

尽管您的 global 声明在一个奇怪的地方,但您的代码就目前而言还不错。尽管如此,删除您对 Lasku 的定义周围的反逗号,它将其定义为 string 并且它将起作用。

global Lasku
Lasku=Yhteenlasku

附:欢迎回到编程!

在回答您的问题时,通常会在代码开头或要定义的数据可用时声明全局变量,但在这种情况下,您将其定义为函数,因此在函数之前无法定义它已定义。我想只要它有效,它就可以了。就个人而言,在这种情况下,我会在这里定义它:

global Lasku
Lasku=Yhteenlasku

Alku ()

【讨论】:

  • 全球声明哪里比较好?
【解决方案2】:

我们确实需要查看您的代码以了解您想要实现的目标,但从它的声音来看,您想要做这样的事情。从这个问题看来,您将在函数中调用函数并返回函数,创建不是 Python 的递归,并且最终会抛出错误,而在这种情况下,另一个并不是真正需要的。 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()

【讨论】:

  • 我粘贴了这段代码,第一个似乎循环回菜单(因为我猜“减法”或“加法”中没有任何内容),第二个返回错误,无论如何返回菜单在“减法”或“加法”中回答了一个问题后,这不是我的问题 - 我希望我添加到我的问题中的代码有助于澄清这一点。
【解决方案3】:

你可以将函数赋值给一个变量(因为函数是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 类型。用我的修改在函数中调用它,你会看到函数的类型。

但是我不确定这段代码中发生了什么,这是芬兰语吗?瑞典语?

【讨论】:

  • 实施后,这似乎返回了与我最初得到的相同的错误消息。就其本身而言,它按说明运行。
  • 你如何准确地实现它?您应该引用函数本身,而不是将其名称作为字符串。好的,我明白了,我会检查这个
  • 这总是会让我回到功能 Yhteenlasku;这不是我想要达到的目标。我正在尝试返回 Uudestaan 启动的任何功能;这就是为什么我在函数Yhteenlasku 中有这条线。在另一个函数中,我将变量 Lasku 设置为任何其他值,然后 Uudestaan 将能够将我送回我来自的地方。 ...看起来我需要从 global Lasku Lasku = 'Yhteenlasku' 中删除 's
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
相关资源
最近更新 更多