慕少森
map与笛卡儿积一点关系都没有,尽管我想一个精通函数式编程的人可能会想出一些不可能理解的方法来生成一个用map.map在Python 3中,这相当于:def map(func, iterable):
for i in iterable:
yield func(i)Python 2的唯一不同之处在于它将构建一个完整的结果列表,以便立即返回所有结果,而不是yield英。虽然Python惯例通常倾向于列表理解(或生成器表达式)来实现与调用map,尤其是当您使用lambda表达式作为第一个参数时:[func(i) for i in iterable]作为您在问题注释中要求的一个例子-“将字符串转换为数组”,通过“数组”,您可能需要元组或列表(它们的行为都有点像来自其他语言的数组)- >>> a = "hello, world"
>>> list(a)['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']>>> tuple(a)('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')使用.map如果您以列单而不是单一的字符串-map可以单独地对所有这些人进行语言化:>>> a = ["foo", "bar", "baz"]>>> list(map(list, a))[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]请注意map(list, a)在Python 2中等效,但在Python 3中需要list如果您想做任何其他事情,而不是将它提供给for循环(或处理函数,如sum它只需要一个可迭代的,而不需要一个序列)。但也要再次注意,通常倾向于使用列表理解:>>> [list(b) for b in a][['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
慕码人8056858
map通过将函数应用于源的每个元素创建一个新列表:xs = [1, 2, 3]# all of those are equivalent — the output is [2, 4, 6]# 1. mapys = map(lambda x: x * 2, xs)# 2. list comprehensionys = [x * 2 for x in xs]# 3. explicit loopys = []for x in xs: ys.append(x * 2)正元map等效于将可迭代的输入压缩到一起,然后对中间压缩列表的每个元素应用转换函数。它是不笛卡尔产品:xs = [1, 2, 3]ys = [2, 4, 6]def f(x, y): return (x * 2, y // 2)# output: [(2, 1), (4, 2), (6, 3)]# 1. mapzs = map(f, xs, ys)# 2. list compzs = [f(x, y) for x, y in zip(xs, ys)]# 3. explicit loopzs = []for x, y in zip(xs, ys): zs.append(f(x, y))我用过zip在这里,但是map实际上,当可迭代性大小不同时,行为实际上略有不同-正如其文档中所指出的,它扩展了可访问性以包含None.