Python使用range迭代时,传入函数为何未按指定次数执行?
问题原因分析
核心问题1:函数传递时直接执行,而非传入函数对象
你调用do_n({print_n('hello')}, 5)的时候,print_n('hello')是立即执行的——这行代码会先运行print_n('hello'),所以先打印了一次hello,然后把这个函数的返回值(print_n没有写return,默认返回None)传给了do_n的func参数。这里的大括号完全多余,只是把None包装成了集合,不影响核心问题。
核心问题2:循环内未调用传入的函数
在do_n的循环里,你写的func只是引用了参数值(也就是None),没有加括号()调用它,所以循环过程中根本不会触发打印hello的操作。而print('why?')每次循环都正常执行,所以会打印5次。
修正后的代码示例
可以用lambda包装带参数的函数,转换成无参函数传入:
def do_n(func, n): for i in range(n): # 补上缺失的冒号 func() # 调用函数 print('why?') def print_n(word): # 补上缺失的冒号 print(word) do_n(lambda: print_n('hello'), 5)
或者把函数和参数分开传递,逻辑更清晰:
def do_n(func, arg, n): for i in range(n): func(arg) print('why?') def print_n(word): print(word) do_n(print_n, 'hello', 5)
内容的提问来源于stack exchange,提问作者ciska v d merwe
相关产品推荐
相关产品推荐

