如何打印自定义函数参数及获取运算参数与对应最大值?
嘿,我来帮你搞定这两个问题,都是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
相关产品推荐
相关产品推荐

