如何在Python3中通过字符串创建函数?
嘿,这个需求其实挺容易实现的,我以Python为例给你拆解步骤,代码直接就能跑起来~
实现步骤与代码示例
1. 核心思路拆解
我们需要做三件事:
- 从标准输入(stdin)读取命令行输入
- 解析
define命令,提取函数名和运算表达式 - 创建可调用的函数并存储,支持后续调用
2. 完整代码实现
import sys import ast # 用字典存储所有定义的函数,键是函数名,值是可调用的函数对象 functions = {} def safe_eval(expr): """安全的表达式求值,只允许数字和加减乘除运算""" allowed_nodes = (ast.Expression, ast.BinOp, ast.Num, ast.Add, ast.Sub, ast.Mult, ast.Div) try: # 解析表达式语法树 tree = ast.parse(expr, mode='eval') # 检查所有语法节点是否在允许范围内 for node in ast.walk(tree): if not isinstance(node, allowed_nodes): raise ValueError(f"不支持的表达式元素:{type(node).__name__}") # 编译并执行表达式 return eval(compile(tree, filename='<ast>', mode='eval')) except Exception as e: raise ValueError(f"表达式解析错误:{str(e)}") def main(): print("欢迎使用简易函数定义工具!") print("支持命令:") print("- define 函数名 运算表达式 (例如:define f1 3 + 5)") print("- 直接输入函数名调用(例如:f1)") print("- 输入exit退出程序\n") while True: # 读取一行输入并去除首尾空格 line = sys.stdin.readline().strip() if not line: continue if line.lower() == "exit": print("程序退出~") break # 拆分输入,最多拆成3部分(命令、函数名、表达式) parts = line.split(maxsplit=2) # 处理define命令 if parts[0].lower() == "define": if len(parts) != 3: print("⚠️ 格式错误!正确格式:define 函数名 运算表达式") continue func_name, expr = parts[1], parts[2] # 创建封装表达式计算的函数 def create_calculation_func(expr): return lambda: safe_eval(expr) # 存入函数字典 functions[func_name] = create_calculation_func(expr) print(f"✅ 函数 {func_name} 已成功定义!") else: # 尝试调用函数 func_name = parts[0] if func_name in functions: try: result = functions[func_name]() print(f"📊 {func_name} 的执行结果:{result}") except ValueError as e: print(f"❌ 执行出错:{e}") else: print(f"❌ 未找到函数 {func_name},请先使用define命令定义") if __name__ == "__main__": main()
3. 关键细节说明
- 安全求值:我用了
ast模块来解析表达式,只允许数字和加减乘除运算,避免了eval()直接执行任意代码的安全风险,适合可控范围外的输入场景 - 函数存储:用字典来管理函数,通过函数名快速查找和调用,非常灵活
- 错误处理:针对命令格式错误、表达式无效、函数未定义等情况都做了友好提示
测试示例
输入:
define f1 3 + 5 f1 define f2 10 * (2 + 3) f2 exit
输出:
✅ 函数 f1 已成功定义! 📊 f1 的执行结果:8 ✅ 函数 f2 已成功定义! 📊 f2 的执行结果:50 程序退出~
内容的提问来源于stack exchange,提问作者袧懈泻懈褌邪 楔懈褕泻懈薪
相关产品推荐
相关产品推荐

