当我运行下面的代码时,我看到它们按预期工作。你知道吗
def modify_string(n):
str1 = ", ".join([f"arg{i}" for i in range(n)])
str2 = f"func{len(str1.split(', ')) - 1}"\
f"({', '.join(str1.split(', ')[:-1])})"
return f"lambda {str1}: list(map(lambda i: list({str2})," \
f" range({str1.split(', ')[-1]})))"
def create_globals(n):
global func1
func1 = lambda x: list(map(lambda j: 0, range(x)))
for i in range(2, n + 1):
globals()[f"func{i}"] = eval(modify_string(i))
create_globals(3)
print(func3(3, 2, 4))
输出:
[[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]
调用create_globals(n)
函数时,会定义n
个不同的函数。函数的名称根据i
编号而变化。每个创建的函数都成为下一步中要创建的函数的参数:
在for循环的第一步,定义了以下函数:
func2 = lambda arg0, arg1: list(map(lambda i: list(func1(arg0)), range(arg1)))
在for循环的第二步,定义了以下函数:
func3 = lambda arg0, arg1, arg2: list(map(lambda i: list(func2(arg0, arg1)), range(arg2)))
这是一个函数,它创建了n维矩阵。你知道吗
我想做的是,通过在每个步骤中使用相同的全局函数名来定义新函数。最后我想使用最后创建的函数。这就是为什么我改变了代码如下:
def modify_string(n):
str1 = ", ".join([f"arg{i}" for i in range(n)])
str2 = f"func({', '.join(str1.split(', ')[:-1])})"
return f"lambda {str1}: list(map(lambda i: list({str2})," \
f" range({str1.split(', ')[-1]})))"
def create_globals(n):
global func
func = lambda x: list(map(lambda j: 0, range(x)))
for i in range(2, n + 1):
globals()["func"] = eval(modify_string(i))
print("func =", modify_string(i))
create_globals(3)
输出:
func = lambda arg0, arg1: list(map(lambda i: list(func(arg0)), range(arg1)))
func = lambda arg0, arg1, arg2: list(map(lambda i: list(func(arg0, arg1)), range(arg2)))
产出似乎如预期。
但是,当我调用func(3, 2, 4)
这样的函数时,得到的是TypeError
。你知道吗
func = lambda arg0, arg1: list(map(lambda i: list(func(arg0)), range(arg1)))
func = lambda arg0, arg1, arg2: list(map(lambda i: list(func(arg0, arg1)), range(arg2)))
Traceback (most recent call last):
File "./a.py", line 21, in <module>
func(2, 3, 4)
File "<string>", line 1, in <lambda>
File "<string>", line 1, in <lambda>
TypeError: <lambda>() missing 1 required positional argument: 'arg2'
即使我已经写了arg2
,解释器的反应就像arg2
丢失了一样。你能解释一下为什么会这样吗?你知道吗
先谢谢你。你知道吗
函数通过在每个访问中查询它们的
globals()
-来查找非局部变量的非限定名称。(当然,这就是def current(): return counter
的工作原理。)因此,您在单个名称下创建的每个函数(在调用时)都指的是所创建的最终的函数,而不是任何以前的化身。你知道吗构造和执行之间的这种脱节是不生成代码和
eval
它的许多原因之一。在这种情况下,为什么不使用一个带有变量的函数来调用带有前缀的参数数呢?你知道吗相关问题 更多 >
编程相关推荐