Python嵌套咖喱
我试图这里解决codewars问题,但我遇到了一点困难。我相信我应该在 Python 中使用嵌套柯里化。
我们就以add为例。让我们进一步限制问题,然后在右侧进行嵌套添加,即编写一个
print((add)(3)(add)(5)(4))
打印 12 的
添加函数。应该可以根据需要将其嵌套得尽可能深,例如我想要
print((add)(add)(3)(4)(add)(5)(6))
应该给我 18到目前为止
我所做的 -
我最初的尝试是使用以下嵌套函数 -
def add_helper():
current_sum = 0
def inner(inp):
if isinstance(inp, int):
nonlocal current_sum
current_sum += inp
print(f"current_sum = {current_sum}")
return inner
return inner
add = add_helper()
但是,这并不能解决问题。相反,我得到以下输出,因为当我执行类似 print((add)(add)(3)(4)(add)(5)(6))
current_sum = 3
current_sum = 7
current_sum = 12
current_sum = 18
<function add_helper.<locals>.inner at 0x...>
有谁知道我如何必须更改我的函数以便我只返回 18,因为该函数会知道它已“完成”?
任何帮助将不胜感激!
更新
查看Bharel的评论后,到目前为止,我有以下内容 -
def add_helper():
val = 0
ops_so_far = []
def inner(inp):
if isinstance(inp, int):
nonlocal val
val += inp
return inner
else:
ops_so_far.append(("+", val))
inp.set_ops_so_far(ops_so_far)
return inp
def set_ops_so_far(inp_list):
nonlocal ops_so_far
ops_so_far = inp_list
def get_val():
nonlocal val
return val
def get_ops_so_far():
nonlocal ops_so_far
return ops_so_far
inner.get_ops_so_far = get_ops_so_far
inner.set_ops_so_far = set_ops_so_far
inner.get_val = get_val
return inner
def mul_helper():
val = 1
ops_so_far = []
def inner(inp):
if isinstance(inp, int):
nonlocal val
val *= inp
return inner
else:
ops_so_far.append(("*", val))
inp.set_ops_so_far(ops_so_far)
return inp
def get_ops_so_far():
nonlocal ops_so_far
return ops_so_far
def set_ops_so_far(inp_list):
nonlocal ops_so_far
ops_so_far = inp_list
def get_val():
nonlocal val
return val
inner.get_ops_so_far = get_ops_so_far
inner.get_val = get_val
inner.set_ops_so_far = set_ops_so_far
return inner
add = add_helper()
mul = mul_helper()
现在当我这样做时,
res = (add)(add)(3)(4)(mul)(5)(6)
print(res.get_ops_so_far())
print(res.get_val())
我
[('+', 0), ('+', 7)]
30
仍然不确定这是否是正确的方向?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这就是我为那些仍在寻找未来的人解决这个问题的方法 -
通过所有测试用例
This is how I solved it for anyone still looking in the future -
Passes all testcases