Python函数参数传递机制与返回值调用原理解答
Python函数参数传递与返回值逻辑说明
以下是问题涉及的示例代码:
def main(): x = int(input("what's x?")) if is_even(x): print('EVEN NUMBER') else: print('ODD NUMBER') def is_even(n): if n % 2 == 0: return True else: return False main()
问题1:为什么定义is_even时形参写为n,不能直接替换成is_even(x)?
- 首先要区分**形参(函数定义时括号里的参数)和实参(函数调用时括号里的参数)**的作用:
- 形参是函数内部用来接收传入值的临时占位变量,作用域仅限当前函数内部,和函数外的变量没有任何绑定关系。你在定义
is_even时,括号里的参数叫n、num、a都完全可以,只要函数内部统一用这个名字做计算就行,没有强制命名要求。 - 就算你把定义改成
def is_even(x):,语法上也不会报错,但这个x是is_even函数的局部变量,和main函数里定义的x完全是两个独立变量——Python不同函数内部的变量默认是互相隔离的,哪怕名字完全相同,存储的位置、生效的范围也互不干扰。
- 形参是函数内部用来接收传入值的临时占位变量,作用域仅限当前函数内部,和函数外的变量没有任何绑定关系。你在定义
- 你可以把形参理解成餐厅前台留的取餐号空位,实参是你实际取餐报的号码:不管空位上印的是“取餐码”“编号”还是“号码”,你报自己的取餐号,前台都能对应到你的餐,没必要让空位上的文字和你手里小票上的抬头文字完全一致。你在
main里调用is_even(x)时,Python会自动把main里x存储的整数值,传给is_even定义时留的形参位,和形参本身叫什么名字没有关系。
问题2:is_even生成的布尔值是怎么返回给main函数的?
整个跨函数的数据流转完全靠return关键字实现,拆成逐步骤逻辑就是:
- 程序启动后先运行最后一行的
main(),进入main函数内部执行,等待用户输入数值,转换为整数后存入main的局部变量x中。 - 运行到
if is_even(x):这一行时,Python会暂停main函数的后续执行,把x存储的整数值作为实参传入is_even,跳转去执行is_even内部的代码。 - 进入
is_even后,传入的整数值会被赋值给is_even的局部变量n,接着执行取余判断:如果n是偶数,就触发return True。return的作用有两个:一是立刻终止当前is_even函数的运行,二是把return后面跟着的值(这里就是True/False布尔值),作为is_even(x)这个调用表达式的最终结果,传回刚才暂停的main函数中。 - 回到
main的判断逻辑时,is_even(x)这个表达式会被直接替换成刚才传回的布尔值:如果是True就打印偶数提示,是False就打印奇数提示。 - 注意:
return传回的是计算后的结果值,不是is_even内部的变量n。is_even运行结束后,它内部的局部变量n会被Python自动回收,不会泄露到main函数里,main只能拿到return抛出的结果。
小提示:示例里的
is_even函数可以简化为一行return n % 2 == 0,因为相等判断表达式本身的运行结果就是布尔值,不需要额外写if/else分支判断返回,运行效果和原代码完全一致。
内容的提问来源于stack exchange,提问作者Jenny Cha
相关产品推荐
相关产品推荐

