立即执行 codemap/code 函数
前言
自从 Python 3 把 map 函数变为惰性的之后,那些没有返回值的函数,怎样立即执行,把函数式爱好者,不喜欢写 for 的我难住了,因为直接写 map(f, lst) 返回的是一个 <map at 0x17c249c50>, 一个 generator. 函数 f 并没有被执行呢。
研究
起初,我是用 list.
我为了执行这些,总是在外面套一层 list 函数,变为 list(map(f, lst)) 。可想而知,这样是不好的,如果那个 lst 很大,里面的元素数量很多,最后生成一个 list 不但会拖慢速度,还会占很多内存(大概)。
用 for 循环来替代 map.
我最早想到的,就是这个,就之前那个来说,很显然,可这样来替代 map:
不过,一开始我就说了,不想用 for (好像是有点任性呢)。
于是,这个方法不行🙅。
最后,有了 all 和 any.
想要判断一个 list 中是否有 True ,就可以在标准库中发现了这两个函数 all 和 any. 这两个函数一个是当 list 中全为 True 的时候,返回 True ,否则返回 False ,一个是当 list 中含有 True 的时候,返回 True ,否则 False.
当我们的 f 没有返回值的时候,在 Python 3 中就是 False ,因此,此时只需要简单的 any(map(f, lst)) 就可以立即执行这个没有返回值的 map 了。不过要注意的是, 当函数 f 具有返回值,而且 bool 值为 True 的时候, any 就失效了,或者说,运行的不完整。 毕竟,有了返回值,为什么还要这样执行它呢?快把那些命令提出来,单独作为一个函数啊喂!
几条关于 map 的事项
(非新手请直接略过,不过,大佬们大概也不会来看我的..)我在想之后或许会有一篇 Python 函数式感想出现呢w
map速度是比for循环要快的,当然,列表推导式除外(只适用于目前的Python 3)- 列表推导式其实可以很简单的用
map+filter的组合替代,虽然效率不怎么高:
- 当然,用上
itertools库中的函数,比如takewhile,会更棒哟!