使用lambda实现斐波那契数列的Python代码中any()作用疑问
Python斐波那契实现中any()函数的作用说明
这段代码是利用Python内置函数特性实现的斐波那契数列生成逻辑,其中any()的核心作用是触发惰性迭代器的执行,完成斐波那契数列的填充,具体逻辑拆解如下:
- 首先看
map(lambda _: fib_list.append(sum(fib_list[-2:])), range(2, count))部分:
Python 3中map()返回的是惰性迭代器,如果不对它进行遍历,里面的lambda函数一次都不会执行,相当于这段代码完全不生效。这里lambda的逻辑是每次取列表最后两个元素求和,追加到列表末尾,也就是生成下一个斐波那契数。 - 然后是
any()的作用:any()会遍历传入的可迭代对象,直到找到第一个布尔值为True的元素就停止,否则遍历完所有元素。而list.append()方法的返回值永远是None,对应的布尔值是False,所以any()会把整个map迭代器遍历完,过程中所有lambda函数都被执行,fib_list就被填充好了。遍历完成后any()返回的False没有被使用,我们要的只是它遍历过程带来的列表修改副作用。
这个写法属于Python的奇技淫巧,实际等价于更易读的普通for循环写法:
def fibonacci(count): fib_list = [0, 1] # 下面这段和原代码的any(map(...))效果完全一致 for _ in range(2, count): fib_list.append(sum(fib_list[-2:])) return fib_list[:count]
类似可以达到同样触发迭代效果的还有list(map(...)),但这种写法会生成一个全是None的无用列表占用额外内存,any()不需要存储中间结果,内存开销更小,但可读性差,不推荐在正式项目中使用。
内容的提问来源于stack exchange,提问作者KRUNALg
相关产品推荐
相关产品推荐

