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

如何打印自定义函数参数及获取运算参数与对应最大值?

嘿,我来帮你搞定这两个问题,都是Python里很实用的小技巧哦!

1. 如何打印自定义函数的参数?

这得看你函数定义的参数类型,不同类型的参数打印方式略有不同:

  • 普通位置参数:直接在函数里引用参数名打印就行,简单直接:
def greet(name, age):
    print(f"传入的参数:name={name}, age={age}")

greet("Bob", 30)
# 输出:传入的参数:name=Bob, age=30
  • 可变位置参数*args:args本身是一个元组,直接打印它就能看到所有传入的位置参数:
def sum_nums(*args):
    print(f"传入的所有参数:{args}")
    return sum(args)

sum_nums(1, 2, 3, 4)
# 输出:传入的所有参数:(1, 2, 3, 4)
  • 关键字参数**kwargs:kwargs是一个字典,打印它能看到键值对形式的参数:
def print_info(**kwargs):
    print(f"关键字参数:{kwargs}")

print_info(city="Beijing", job="Engineer")
# 输出:关键字参数:{'city': 'Beijing', 'job': 'Engineer'}

如果是想拿到参数的原始表达式(比如你第二个问题里的2+1这种),普通传参方式做不到——因为Python在调用函数时会先计算表达式的值,再把结果传进去。这时候就得像第二个问题那样,换一种传参思路啦。

2. 获取运算表达式及其对应分数,输出指定格式

你原来的代码里,largest_num(2+1,30-24,8*3)调用时,这些表达式已经被计算成3、6、24传入函数了,函数里只能拿到计算后的值,拿不到2+1这种原始表达式文本。所以得换个方式:把表达式以字符串的形式传进去,在函数内部计算值同时保留原始字符串。

方法一:用eval()快速实现(适合自用场景)

如果是自己写的表达式,不用担心安全问题,用eval()很方便:

def largest_num(*expr_strings):
    # 存储(计算值, 表达式字符串)的列表
    expr_results = []
    for expr in expr_strings:
        try:
            value = eval(expr)
            expr_results.append((value, expr))
        except Exception as e:
            print(f"表达式「{expr}」无效:{e}")
            continue
    
    if not expr_results:
        print("没有有效的运算表达式")
        return
    
    # 找到值最大的那一项
    max_result = max(expr_results, key=lambda x: x[0])
    print(f"max value is {max_result[1]} = {max_result[0]}")

# 调用时传入表达式字符串
largest_num("2+1", "30-24", "8*3")
# 输出:max value is 8*3 = 24

方法二:用AST实现更安全的版本(适合不可信输入场景)

如果表达式来自外部输入,eval()有安全风险(可能执行恶意代码),这时候可以用Python的ast模块做安全校验,只允许基本算术运算:

import ast

def safe_calculate(expr):
    try:
        # 解析表达式为抽象语法树
        tree = ast.parse(expr, mode='eval')
        # 定义允许的语法节点(只保留基本算术运算相关)
        allowed_nodes = (
            ast.Expression, ast.BinOp, ast.UnaryOp, ast.Constant,
            ast.Add, ast.Sub, ast.Mult, ast.Div, ast.Mod, ast.Pow
        )
        # 遍历语法树,检查是否有不允许的节点
        for node in ast.walk(tree):
            if not isinstance(node, allowed_nodes):
                raise ValueError(f"不允许的操作:{type(node).__name__}")
        # 安全执行表达式
        return eval(compile(tree, filename='', mode='eval'))
    except Exception as e:
        raise ValueError(f"表达式错误:{e}")

def largest_num(*expr_strings):
    expr_results = []
    for expr in expr_strings:
        try:
            value = safe_calculate(expr)
            expr_results.append((value, expr))
        except ValueError as e:
            print(e)
            continue
    
    if not expr_results:
        print("没有有效的运算表达式")
        return
    
    max_result = max(expr_results, key=lambda x: x[0])
    print(f"max value is {max_result[1]} = {max_result[0]}")

largest_num("2+1", "30-24", "8*3")
# 输出:max value is 8*3 = 24

这个版本能防止执行恶意代码,更适合处理不可信的输入。


内容的提问来源于stack exchange,提问作者Seba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:23:11