如何对range内元素执行函数?及count()返回函数列表的其他执行方法
问题解答
我来帮你拆解这两个问题哈~
一、如何对range中的每个元素执行函数?
有两种实用的方式,操作起来都很简单:
- 普通for循环遍历处理:直接遍历range里的每个元素,逐个传入函数执行
def square(x): return x*x # 遍历range(1,4)的每个元素,逐个调用square函数 for num in range(1,4): print(square(num)) # 会依次输出 1、4、9 - 用map函数批量处理:map能帮你把函数自动应用到range的每个元素上,最后转成列表就能拿到所有结果
def square(x): return x*x result_list = list(map(square, range(1,4))) print(result_list) # 输出 [1, 4, 9]
二、关于count()返回的函数列表的执行问题
先提个小细节:你原代码运行后会发现输出全是9,这是因为闭包的延迟绑定特性——内部的f()函数并没有在循环时就“记住”当时的i值,而是等到你调用f()的时候才去取i的最终值,循环结束后i已经变成3了,所以每个f()返回的都是3*3=9。如果想让每个函数对应循环时的i值,只要给内部函数加个默认参数固化i值就行:
def count(): fs = [] for i in range(1, 4): def f(i=i): # 把当前循环的i作为默认参数传入,固定住值 return i*i fs.append(f) return fs
至于除了你代码里的执行方式,还有这些方法可以运行这些函数:
- 循环遍历逐个调用:先把函数列表存下来,再循环执行每个函数
func_list = count() for func in func_list: print(func()) # 依次输出对应结果 - 列表推导式批量获取结果:一行代码就能拿到所有函数执行后的结果列表
func_list = count() results = [func() for func in func_list] print(results) - 用map函数批量执行:借助lambda表达式来调用每个函数,快速得到结果
func_list = count() results = list(map(lambda f: f(), func_list)) print(results)
内容的提问来源于stack exchange,提问作者William




