Python函数间传递用户输入报错:缺少x、y位置参数如何解决?
问题分析与解决
核心错误原因
你在main()函数最后调用port()时,没有传入它要求的x、y两个参数,这就是触发TypeError的直接原因。而且你在intro()里已经调用过port(x,y)了,main里的这个port()属于多余调用,直接删掉就行。
优化后的完整代码
除了这个核心错误,代码还有几个可以优化的点,比如重复导入模块、不安全的输入处理、无效的返回语句等,下面是修正后的代码:
import math def main(): def intro(): print("hello") # 用int转换替代eval,避免安全风险,同时处理非整数输入 try: x = int(input("#?")) y = int(input("#?")) except ValueError: print("请输入有效整数") return # 合并输入校验逻辑,不满足条件直接终止后续流程 if x <= 0: print("x必须大于0") return if y > x or y < 0: print("y必须在0到x之间") return print(math.factorial(x)) print(math.factorial(y)) port(x, y) def port(x, y): nCr = math.factorial(x) / (math.factorial(y) * math.factorial(x - y)) print(nCr) print(f"你总共有 {nCr} 种组合") # 一次只能返回一个值,需返回多个可改用元组 return (x, y) intro() main()
关键修改说明
- 将
import math移到全局作用域,避免在函数内重复导入模块 - 用
int(input(...))替代eval(input(...)),eval会执行任意输入代码,存在安全隐患,int转换更安全,还添加了异常处理防止非整数输入 - 合并输入校验逻辑,校验不通过时直接return,避免后续无效计算
- 修复port函数里的return语句:原代码中
return x之后的return y永远不会执行,若需返回多个值可使用元组 - 删除main里多余的
port()调用,因为intro内已经传参调用过该函数
内容的提问来源于stack exchange,提问作者Half_cafa
相关产品推荐
相关产品推荐

