0%

Python3 中的 map 问题

柴犬

在最近的 arts 项目中,由于要自动生成目录用到了 map 函数,因此就发现了这个问题(至于为什么要自己写代码来生成目录,当然是没找到合适的插件了!

部分 toc.py 代码如下,主要就是调用了自己写的一个 toc 函数,想法也很明显,若是有多个文件,则依次为其生成目录,否则就是一个默认的文件。

1
2
3
4
5
6
if __name__ == '__main__':
if len(sys.argv) > 1:
filename = sys.argv[1:]
else:
filename = ['201903W4.md']
map(toc, filename)

然后问题来了,预期效果并没有出现,打了 [toc] 标记的位置并没有出现目录,因为印象中 map 函数就是对传入的数组/可迭代对象,作用于传入的函数。
查了一下才知道,在 Python3 中,map 返回的是一个 <map object at 0xXXXXXXXX> 的对象,并没有执行。

最简单的方法是直接套一个 list 函数,即 list(map(toc, filename)),好像到这里就解决了问题。

然后今天又看到一对 Python3 的内置函数:any & all,其定义如下:

1
2
3
4
5
6
7
8
9
all(iterable)

Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:

def all(iterable):
for element in iterable:
if not element:
return False
return True
1
2
3
4
5
6
7
8
9
any(iterable)

Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

def any(iterable):
for element in iterable:
if element:
return True
return False
  • 对于 all 函数,当 iterable 中所有元素都为 True 时(或者 iterable 为空),返回 True。
  • 对于 any 函数,当 iterable 中有元素为 True 时,则返回 True。如果当 iterable 为空时,返回 False。

而在 Python3 中,函数没有返回值的时就是 False,而我的 toc 函数正是没有返回值的,相当于可以一直循环完,因此就可以使用 any(map(toc, filename)) 解决问题。

另外如果传入的函数具有返回值,而且只要有一个函数执行的返回值为 True 的时候,any 就返回了,也就执行不完整了。

Welcome to my other publishing channels