Python-python返回值为函数的一个题
def double(f):
print(f)
return (lambda x: (f(f(x))))
def inc(x):
return x+1
print(double(inc)(0))
print((double(double))(inc)(0))
print((double(double(double)))(inc)(0))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有个IDE名字叫spider可以类似于C的IDE那样跟踪变量,查看环境变量,打断点等
分清楚double了什么就能明白了。
下面用 . 表示函数组合,即 f (g (x)) = (f . g) x, 函数组合组合是满足结合律的,即 f . g . h = f . (g . h)。
double f = f . f
double (double f)
= double (f . f)
= (f . f . f . f)
(double double) f
= (double . double) f --> 多的一次double展开,下面和double (double f)相同的。
= double (double f)
= double (f . f)
= f . f . f . f
(double (double double)) f
= ((double double) . (double double)) f
= (double . double . double . double) f
= double . double . double (double f)
= double . double . doubel . (f . f)
= ...
= f . f . f . f . f . f . f . f . f . f . f . f . f . f . f . f
这就像是 2 * 2 * ... * 2 和 2 ^ 2 ^ ... ^ 2的差别。
如果你用三次的就很明显了:
def trice(f):
return (lambda x: (f(f(f(x)))))
做题什么的最讨厌了,谁特么这么闲。。这个考的是函数式编程,所以你用数学的思维想就好了
对2, double(double) = lambda x: double(double(x))
so (double(double))(inc) => lambda x: double(inc(inc(x)))
=> lambda x: inc(inc(inc(inc(x))))
对3, 同理,
(double(double(double))) => lambda x: double( lambda x: double(double(x)) )
=> lambda x: double(double(double(double(x))))
so (double(double(double)))(inc) => (double(double(double(inc))))
把上面展开,你看是不是lambda x: inc(inc(...(inc(x)))) 一共16个inc...
认为3是8的关键错误在于,认为表达式3等价于double(表达式2)。而实际上3需要先把前面的3个double展开后再带入inc
在python设断点:
x = 10
import pdb; pdb.set_trace()
程序在运行到pdb那行的时候会停下并进入interactive shell, 你可以查看栈里变量等等:
>>> x
10