不使用赋值改变函数定义的含义

4

我被分配了这个任务:

Write a one-line expression that transforms an f(x) function into f(x) +1. Hint: think about how a local frame binding for saved value of f, can be created without an assignment.

Example:

>>> f = lambda x: x*x
>>> f(5) 25
>>> ---your one line expression---
>>> f(5) 26
>>> f, g = None, f
>>> g(5) 26
我尝试做了这个:

我尝试做了这个:

k,f=f, lambda x: k(x)+1

这段代码可以运行,但是它使用了赋值操作 f=f。有没有不用赋值操作的方法实现同样的功能呢?

我的老师告诉我在Python中有一个类似Scheme语言中的 let 函数,但她并没有告诉我们需要使用哪个函数。


5
@g = ...不是一种赋值吗? - Reut Sharabani
1
@BhargavRao 这不是编辑吗?它一直在那里。 - Sterling Archer
2
@BhargavRao 我认为问题不在于想出一个计算 f(x)+1 的表达式,而是修改现有的函数 f 使其返回 f(x)+1。坦白地说,我对此感到困惑。 - Jon Kiparsky
2
@BhargavRao 我觉得作者表述已经很清楚:"编写一个一行代码的表达式,将 f(x) 函数转化为 f(x)+1"。 - Jon Kiparsky
3
如何避免在Python中分配任务 - Reut Sharabani
显示剩余8条评论
2个回答

10

这不是通常应该使用的东西,但我想你可以这样做:

def f(x, f=f): return f(x) + 1

由于我们只是定义了一个与原始函数名称相同的新函数名称,因此“没有(显式)分配”,即没有实际的赋值操作。


啊,是的,我认为这就是他在寻找的东西。 - Claudiu
2
@Claudiu,你删除了你的回答,我有点难过。虽然这是作弊,但它确实回答了问题。 - Jon Kiparsky
1
@JonKiparsky:我之前把它删掉了,因为在f, g = None, f这一行后它不能正常工作,但是我改了一下让它可以在这种情况下工作,并撤销了删除操作。 - Claudiu
这不是一个赋值语句吗?(顺便说一下,回答得很好) - Reut Sharabani
@ReutSharabani:从技术上讲,不是,我们将一个值绑定到参数作为默认值。它们并不完全相同。 - Jeff Mercado

9

这个方法是可行的,但可能有点作弊:

>>> f = lambda x: x*x
>>> f(5)
25
>>> globals().update({'f': (lambda g: lambda x: g(x)+1)(f)})
>>> f(5)
26
>>> f, g = None, f
>>> g(5)
26

3
不错的解决方案 :-) 您也可以使用双重嵌套的 lambda 函数来避免更新全局/局部变量,而无需使用多个名称:locals().update({"f": (lambda g: lambda x: g(x)+1)(f)}) - Kevin
@Kevin:啊,好的!这样就和另一个答案等价了。我会更新它来做到这一点,谢谢。 - Claudiu
7
@Kevin:“Yo dawg,我听说你讨厌赋值操作符,所以我在你的lambda中放了一个lambda,这样你就可以进行赋值而不用赋值。” - Air
有趣的是,如果我执行 globals().update({'f': lambda x, g=f: g(x)+1}),它将完全等同于 def f(x, g=f): return g(x)+1 的解决方案。 - Claudiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接