我想使用"exec";压缩许多行代码。但由于我正在进行的项目有些复杂,我将简化我的代码。
假设我想做一个函数,给我加3个数字,可以很容易地写:
def sum3(a,b,c):
return a+b+c
但由于我正在进行的项目涉及更多的变量和更动态的代码,所以我们希望该函数使用";exec";。我尝试使用它如下:
def suma_eval(a,b,c):
suma=0
for item in ("a","b","c"):
exec(f'''suma+={item}''')
print(f"""suma+={item}""")
return suma
屏幕截图#1
它不起作用。我做错了什么?
更新#1:
正如你所指出的,我已经把它放在一行中,错误停止了,但结果是0,而它应该是73。也就是说,该功能没有按预期工作。
屏幕截图#2
更新#2:
我的问题a已经解决了,非常感谢,这就是答案:
def suma_eval(a,b,c):
suma=0
ldict={}
for item in ("a","b","c"):
exec(f'''suma+={item}''',locals(),ldict)
suma=ldict["suma"]
return suma
因为这一行之后的代码:for item in ("a","b","c"):
没有缩进。
正如评论中所指出的,如果您只需要对元素求和,则可以使用sum
:
values = [1, 2, 3, 4, 5]
sum(values)
如果您需要更复杂的行为,可以查看map
、reduce
和filter
。Reduce允许您将任何函数累积应用于迭代中的所有项,并生成单个最终值。
import functools
def customfunc(a, b):
partial_result = a ** 2 - b
print(f"{a} {b} -> {partial_result}")
return partial_result
functools.reduce(customfunc, values)
# prints:
# 1 2 -> -1
# -1 3 -> -2
# -2 4 -> 0
# 0 5 -> -5