1 2 3 4 5 6 |
def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) map(func, *iterables) --> map object Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted. |
在使用map的时候,如果func只有一个参数,那么iterables直接传递一个list是可行的,但是如果func默认不止一个参数,那么这里传给map的参数需要额外关注,不能直接使用list或者tuple的组合,我们先通过一张图,来直观的看一下map参数的格式:
假设func1是我们定义的参数,有4个固定参数。正常调用func1直接使用func(1,2,3,4)即可,但是如果通过map(func1, *args)的方式来循环调用,这里的args参数要按照图里面参数矩阵橙色框的模式来组合(按列组合),例如:
map(func1, [arg1,arg1],[arg2,arg2],[arg3,arg3],[arg4,arg4])
通过一个简单的示例,我们可以看一下结果:
1 2 3 4 5 6 7 8 9 |
def fun1(arg1, arg2, arg3, arg4, *args, **kw): return("fun1",arg1,arg2,arg3,arg4,str(args), str(kw)) print("map: {}".format(str(map(fun1, ["arg1","arg1"],["arg2","arg2"],["arg3","arg3"],["arg4","arg4"])))) #输出结果 map: [('fun1', 'arg1', 'arg2', 'arg3', 'arg4', '()', '{}'), ('fun1', 'arg1', 'arg2', 'arg3', 'arg4', '()', '{}')] |
map成功执行了,但是一般生成多组参数的时候,通常都会使用[[arg1,arg2,arg3,arg4],[arg1,arg2,arg3,arg4]]的方式来存储,所以应对这种多参函数的map调用时,需要将这种普通的参数对列表,合理的转化为按列组合的参数对,组合后的list的长度等于func的参数个数。此处可以用zip函数来实现这一需求
1 2 3 4 5 6 7 8 |
def zip(iter1: Iterable[_T1]) zip(*iterables) --> A zip object yielding tuples until an input is exhausted. list(zip('abcdefg', range(3), range(4))) [('a', 0, 0), ('b', 1, 1), ('c', 2, 2)] The zip object yields n-length tuples, where n is the number of iterables passed as positional arguments to zip(). The i-th element in every tuple comes from the i-th iterable argument to zip(). This continues until the shortest argument is exhausted. |
zip函数说明中的示例,也应征了这一目的。添加几组参数,重新使用上面的示例进行演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def fun1(arg1, arg2, arg3, arg4, *args, **kw): return("fun1",arg1,arg2,arg3,arg4,str(args), str(kw)) t=[["1","2","3","4"],["5","6","7","8"]] print("fun1: {}".format(str(fun1(*[1,2,3,4])))) print("map: {}".format(str(map(fun1, ["arg1","arg1"],["arg2","arg2"],["arg3","arg3"],["arg4","arg4"])))) print("map: {}".format(str(map(fun1, *list(zip([1,2,3,4],[5,6,7,8])))))) print("list(map): {}".format(str(list(map(fun1, *list(zip([1,2,3,4],[5,6,7,8]))))))) print("list(map): {}".format(str(list(map(fun1, *list(zip(*t))))))) #python3运行结果 fun1: ('fun1', 1, 2, 3, 4, '()', '{}') map: <map object at 0x7f31063e6c40> map: <map object at 0x7f31063e6df0> list(map): [('fun1', 1, 2, 3, 4, '()', '{}'), ('fun1', 5, 6, 7, 8, '()', '{}')] list(map): [('fun1', '1', '2', '3', '4', '()', '{}'), ('fun1', '5', '6', '7', '8', '()', '{}')] #python2运行结果 fun1: ('fun1', 1, 2, 3, 4, '()', '{}') map: [('fun1', 'arg1', 'arg2', 'arg3', 'arg4', '()', '{}'), ('fun1', 'arg1', 'arg2', 'arg3', 'arg4', '()', '{}')] map: [('fun1', 1, 2, 3, 4, '()', '{}'), ('fun1', 5, 6, 7, 8, '()', '{}')] list(map): [('fun1', 1, 2, 3, 4, '()', '{}'), ('fun1', 5, 6, 7, 8, '()', '{}')] list(map): [('fun1', '1', '2', '3', '4', '()', '{}'), ('fun1', '5', '6', '7', '8', '()', '{}')] |
python3对map函数有一些改进,map返回的不再是一个list,而是一个可迭代对象,所以需要通过list()获取迭代内容的时候,func才会被执行
你好,方便加微信咨询你一个问题吗? 我微信号 matrixana
NIce。学习了。。。。