如何通过用户输入调用自定义函数?寻求替代多if语句的映射实现方法
实现输入与自定义函数的关联映射(替代大量if语句)
当然可行!这在Python里是非常常见的代码优化方式,用字典映射就能完美实现你想要的类似Excel VLOOKUP的关联效果,彻底摆脱冗长的if-elif链,让代码更简洁、易维护。
核心思路
Python中函数是一等对象,你可以直接把函数作为字典的值,将输入字符串(比如"phone"、"customer")作为字典的键,这样就能通过输入直接找到对应的函数并调用。
改造后的完整代码示例
# 自定义函数集合 def retrieve_phone_data(): # 模拟业务逻辑 return ["iPhone 14", "Samsung Galaxy S23", "Google Pixel 7"] def retrieve_customer_data(): # 模拟业务逻辑 return {"customer_id": 1001, "name": "Alice Smith", "email": "alice@example.com"} def retrieve_order_data(): # 新增的函数,直接在映射里添加即可 return [{"order_id": 2001, "product": "iPhone 14", "amount": 899}] def retrieve_inventory_data(): # 再新增一个函数 return {"iPhone 14": 50, "Samsung Galaxy S23": 30} # 关键:创建输入与函数的映射字典 function_mapping = { "phone": retrieve_phone_data, "customer": retrieve_customer_data, "order": retrieve_order_data, "inventory": retrieve_inventory_data } def main(input1, input2): # 获取所有有效输入选项 valid_inputs = list(function_mapping.keys()) # 检查两个输入是否都有效 if input1 in valid_inputs and input2 in valid_inputs: # 通过映射调用对应函数,并获取返回结果 data1 = function_mapping[input1]() data2 = function_mapping[input2]() # 这里可以根据需求处理返回结果,比如打印、存储等 print(f"Retrieved {input1} data:\n{data1}") print(f"\nRetrieved {input2} data:\n{data2}") else: print(f"Error: Please enter valid input. Valid options are: {', '.join(valid_inputs)}") # 测试调用 if __name__ == "__main__": # 有效输入测试 main("phone", "customer") # 无效输入测试 # main("phone", "invalid_input")
优势说明
- 扩展性极强:新增函数时,只需要在
function_mapping字典里添加一行键值对,完全不需要修改main函数的逻辑。 - 代码更简洁:10多个函数的情况下,用字典映射比写10多段if-elif代码清爽太多,可读性更高。
- 易维护:输入与函数的对应关系集中在字典里,后续修改或调整关联逻辑非常方便。
额外扩展:支持任意数量的输入
如果后续需要支持1个或多个输入的组合,只需要稍微调整main函数即可:
def main(*inputs): valid_inputs = list(function_mapping.keys()) invalid_inputs = [inp for inp in inputs if inp not in valid_inputs] if invalid_inputs: print(f"Error: Invalid input(s): {', '.join(invalid_inputs)}. Valid options are: {', '.join(valid_inputs)}") return # 遍历所有输入,调用对应函数 for inp in inputs: data = function_mapping[inp]() print(f"\nRetrieved {inp} data:\n{data}") # 调用示例:支持1个、2个或多个输入 main("phone") main("customer", "order", "inventory")
内容的提问来源于stack exchange,提问作者The Crow
相关产品推荐
相关产品推荐

