可以使用变量来调用函数吗
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
我有四个子程序来乘、除、加和减 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