在最近的 arts 项目中,由于要自动生成目录用到了 map 函数,因此就发现了这个问题(至于为什么要自己写代码来生成目录,当然是没找到合适的插件了!
部分 toc.py 代码如下,主要就是调用了自己写的一个 toc 函数,想法也很明显,若是有多个文件,则依次为其生成目录,否则就是一个默认的文件。
1 | if __name__ == '__main__': |
然后问题来了,预期效果并没有出现,打了 [toc] 标记的位置并没有出现目录,因为印象中 map 函数就是对传入的数组/可迭代对象,作用于传入的函数。
查了一下才知道,在 Python3 中,map 返回的是一个 <map object at 0xXXXXXXXX>
的对象,并没有执行。
最简单的方法是直接套一个 list 函数,即 list(map(toc, filename))
,好像到这里就解决了问题。
然后今天又看到一对 Python3 的内置函数:any & all,其定义如下:
1 | all(iterable) |
1 | any(iterable) |
- 对于 all 函数,当 iterable 中所有元素都为 True 时(或者 iterable 为空),返回 True。
- 对于 any 函数,当 iterable 中有元素为 True 时,则返回 True。如果当 iterable 为空时,返回 False。
而在 Python3 中,函数没有返回值的时就是 False,而我的 toc 函数正是没有返回值的,相当于可以一直循环完,因此就可以使用 any(map(toc, filename))
解决问题。
另外如果传入的函数具有返回值,而且只要有一个函数执行的返回值为 True 的时候,any 就返回了,也就执行不完整了。