Python嵌套函数调用异常求助:函数执行次数不符预期
问题根源与解决
你的所有异常现象,本质都是没搞清楚函数对象和函数调用的区别——没有通过()触发函数执行,要么提前执行了函数,要么只是引用函数对象却不调用。
逐个问题拆解
forloop(INPUT())仅输入两次
当你写forloop(INPUT())时,Python会先执行INPUT()(触发一次输入),然后把INPUT()的返回值(因为INPUT没写return,所以是None)传给forloop。而forloop里的循环只是反复引用fun(也就是None),根本不会再次调用INPUT。你觉得有两次输入,大概率是测试时的误操作,实际只有传参时的那一次有效输入。whileloop(INPUT())一次输入后无限循环
逻辑和上面一致:INPUT()在传参时就执行了一次输入,之后whileloop的循环只是反复拿None做无用循环,不会再触发输入,所以看起来是无限循环但没有输入提示。is_correct(hello_world)仅打印一次hello worldis_correct里的output = function只是把hello_world这个函数对象赋值给变量,没有加()就不会执行函数里的print语句。你看到的一次打印,要么是测试时不小心单独执行了hello_world(),要么是代码其他地方的误触发——按当前代码,is_correct(hello_world)根本不会打印任何内容。
修正后的代码
要让函数按预期工作,需要做两处修改:
- 传参时传入函数对象(比如
INPUT、hello_world),而不是执行后的结果(INPUT()、hello_world()) - 在循环内部通过
fun()或function()的方式调用函数
import time from IPython.display import clear_output # 若用非IPython环境,需替换此函数 def is_correct(function, wait_sec=0.5): while True: output = function() # 加()调用传入的函数 is_correct_input = input('Is the input correct(y(Enter)/n)?') time.sleep(1) if is_correct_input.lower() in ['', 'y', 'yes']: clear_output() time.sleep(wait_sec) return output clear_output() time.sleep(wait_sec) def whileloop(fun): while True: fun() # 调用函数 def INPUT(): result = input('...') return result # 可选,返回输入结果以便后续使用 def hello_world(): print('hello world') def forloop(fun): for i in range(3): fun() # 调用函数
正确调用方式
forloop(INPUT):循环3次,每次触发输入whileloop(INPUT):无限触发输入(需手动中断)is_correct(hello_world):每次循环打印hello world,直到输入y或回车确认
内容的提问来源于stack exchange,提问作者彭俊文
相关产品推荐
相关产品推荐

