如何用for循环在Python中批量定义add1至add10函数?
如何快速创建add1到add10这10个函数?
这个问题我之前踩过同款坑!你的代码有两个关键问题:
- 循环里反复定义同一个
addi函数,根本没生成add1、add2...这些你需要的函数名; - 就算你改了命名方式,直接绑定循环变量还会碰到闭包延迟绑定的坑——循环结束后所有函数都会引用最后一次循环的i值,结果所有add函数返回的都是
x+10。
下面给你几种实用的解决方法:
方法1:动态绑定全局变量+默认参数捕获值
直接用globals()把生成的函数绑定到全局命名空间的对应名字上,同时用默认参数把当前循环的i值固定下来:
for i in range(1, 11): def add_func(x, num=i): return x + num # 把函数绑定到add1、add2...add10这些名字 globals()[f"add{i}"] = add_func
现在调用add2(10)就会返回12,完全符合预期。默认参数num=i会在定义函数时就把当前的i值存下来,避免后续循环改变i值影响函数结果。
方法2:用函数工厂生成(更优雅)
写一个专门的工厂函数来生成加法函数,这样能更清晰地避免闭包问题:
def create_add_func(num): # 内部函数会捕获工厂函数的num参数,每个函数的num都是独立的 def add(x): return x + num return add for i in range(1, 11): globals()[f"add{i}"] = create_add_func(i)
这种方式把函数创建的逻辑封装起来,可读性更好,也不容易出错。
方法3:把函数存到字典里(避免污染全局命名空间)
如果不需要把这些函数放到全局变量里,存在字典里管理会更整洁:
add_functions = {} for i in range(1, 11): def add_func(x, num=i): return x + num add_functions[f"add{i}"] = add_func # 调用方式:add_functions['add2'](10)
再回头说下你原代码的问题:循环结束后,只有一个addi函数存在,而且它引用的i是循环最后一次的值9,所以addi(x)会返回x+10;而你要的add2这个名字从来没被定义过,自然会报NameError啦。
内容的提问来源于stack exchange,提问作者jessica
相关产品推荐
相关产品推荐

