Python + inspect 一行实现递归 fib 函数
背景
有个裙友要看看用 lambda
能不能在一行里定义出来 fib
函数,并且不要那个根号五的数学公式,于是就有了这篇文章。
介绍
inspect
库可以帮助我们拿到 Python 上下文的各种信息,自然也包括了当前正在运行的函数。配合 eval
可以达到我们的目的。
实现
原始方法
虽然大家都知道,但还是放上来做一个对比。
1 | def fib(n): |
通过 inspect 获取当前函数
我目前只知道 codeobject
配合 eval
来执行的方法,如下:
1 | import inspect |
注意,此时我们就通过给 eval
的第二个参数指定函数运行时的环境(即globals),这样我们就可以在函数内部直接通过变量名访问了。
用 lambda 写成一行
还用了 __import__
来导包,是真正的一行捏:
1 | result = (lambda number: |
注意不要改我们 lambda number
后边的参数名,如果也改成 n
的话,eval
会报错,下面是报错信息:
1 | Traceback (most recent call last): |
因为此时内层函数用的 n
就类似 Lua 的 upvalue
,或者 nonlocal
,总之就是闭包里面的那个概念,它无法访问到就报错了。
总结
不觉得这很酷吗?很符合我对 Python 的想象,科技并带着趣味。😎
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 喵喵小窝!