You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者袧懈泻懈褌邪 楔懈褕泻懈薪

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:39:27