可以使用变量来调用函数吗

Can you use a variable to call a function

我有四个子程序来乘、除、加和减 2 个数字,我会要求用户提供这些数字。

我未完成的代码是:

def multiply(a, b):
    print(f"{a} x {b} = {a*b}")
    
def divide(a, b):
    print(f"{a} ÷ {b} = {a*b}")

num1 = int(input("What is the first number?\n"))
num2 = int(input("What is the second number?\n"))
calculation = input("What calculation would you like to perform? [multiply, divide]\n")

calculation(num1, num2)

但它给出了 TypeError: 'str' object is not callable

是否有必要使用如下 if 语句:

if calculation == 'multiply':
     multiply()
elif calculation == 'divide':
     divide()

对于所有四个子程序还是我可以使用变量计算来代替函数名。

使用字典来保存你的函数

funcs = {'multiply': multiply, 'divide': divide}

然后访问funcs[calculation].

...或者如果你有一个 DRY 恋物癖:

funcs = {f.__name__: f for f in [multiply, divide]}

演示:

>>> funcs['multiply'](3, 4)
3 x 4 = 12

您还可以访问 globals() 字典

>>> globals()['multiply'](3, 4)
3 x 4 = 12

但这不是一个好主意,因为要调用的函数来自用户输入,谁知道 globals().

中有哪些奇怪的可调用对象

奖励:防止错误输入

from functools import partial
def notfound(fname, *_, **__):
    print(f'function {fname!r} not found')

用法:

>>> calculation = 'multiply'
>>> funcs.get(calculation, partial(notfound, calculation))(3, 4)
3 x 4 = 12
>>> calculation = 'none'
>>> funcs.get(calculation, partial(notfound, calculation))(3, 4)
function 'none' not found