在 Python 里,函数参数本质上就是变量,而 input() 是一个内置函数,调用后会从标准输入读取一行内容并当成字符串返回。所以从语言设计上说,把 input() 的输入值作为函数参数完全合法,既可以当作默认参数写死在定义处,也可以在调用时动态传进去。不过这两种写法在执行时机和行为表现上有明显区别,用错了就容易出现程序一启动就卡住等输入的尴尬情况。

一、语法层面:input() 能否作为函数参数
Python 的函数参数在调用时会完成求值。如果我们在调用函数时把 input() 写在实参位置,解释器会先执行 input() 拿到用户输入的字符串,再把这个结果绑定到形参上。下面的例子演示了在调用阶段传 input() 返回值作为参数的写法:
def greet(name):
return "你好," + name
# 调用时通过 input() 获取参数
msg = greet(input("请输入你的名字:"))
print(msg)
上面这段代码中,input() 出现在函数调用的括号里,属于实参表达式。只有当 greet 真正被调用时,才会执行 input() 并等待键盘输入,逻辑非常直观,也不会影响模块导入。
另外一种写法是在 def 语句里把 input() 放在形参的默认值位置。这种写法语法上同样不报错,但默认参数的值是在函数定义那一刻就被求出来的,而不是每次调用才求。这就意味着只要 Python 解释器执行到这个 def 语句,就会立刻运行一次 input()。在多数工程场景下,def 语句位于模块顶层,导入模块就会触发输入阻塞。
二、把 input() 放在默认参数位置的隐患
我们用一个具体例子说明默认参数的求值时机问题。下面这段代码如果把 input() 写在 name 的默认值里:
def greet(name=input("请输入名字:")):
return "你好," + name
print("模块加载完毕")
当你用 python 命令运行这个文件,或者别的模块 import 它时,解释器从上往下执行,先碰到 def greet,此时就会立即执行 input(),程序卡在“请输入名字:”这里,必须输完才会继续打印“模块加载完毕”。如果这是一个被很多地方引用的工具模块,别人一导入就要求敲键盘,显然不可接受。
此外,默认参数只会在定义时求值一次。也就是说,如果模块导入时你输入了“张三”,之后不管调用多少次 greet() 且不传参,name 永远都是“张三”,不会再次让你输入。这跟“每次调用都让用户输入”的预期完全相反,属于典型的逻辑误区。
三、推荐的几种安全写法
如果希望函数既能接受外部传入的值,又能在没传参时主动要用户输入,最清晰的方式是在函数体内部判断并调用 input()。示例如下:
def greet(name=None):
if name is None:
name = input("请输入名字:")
return "你好," + name
print(greet())
print(greet("李四"))
这种结构把输入动作推迟到函数运行时,且只有调用者没给 name 时才触发 input(),既灵活又不会在导入时阻塞。单元测试时也可以直接传参,完全绕开标准输入,方便用断言验证返回内容。
如果你确实想在调用处用 input() 提供参数,也可以先把值存到变量里再传,这样逻辑更明显,也方便做校验:
def calc_square(x):
return x * x
raw = input("请输入一个数字:")
num = float(raw)
print(calc_square(num))
把输入和类型转换放在调用之前,函数本身保持纯计算职责,不依赖交互环境,可维护性更好。总结来说,Python 函数当然能用 input() 的输入当参数,但别把它塞进默认参数,老老实实放在调用处或函数体内,才是符合直觉且不易出错的写法。