map()
和列表推导式大致相当:
map(function, list1)
[function(i) for i in list1]
如果我们想要使用的函数是一个方法怎么办?
[i.function() for i in list1]
map(.function, list1) # error!
map(run_method(function), list1) # error!
我该如何使用
map
进行这种操作?map()
和列表推导式大致相当:
map(function, list1)
[function(i) for i in list1]
如果我们想要使用的函数是一个方法怎么办?
[i.function() for i in list1]
map(.function, list1) # error!
map(run_method(function), list1) # error!
map
进行这种操作?operator.methodcaller()
:from operator import methodcaller
map(methodcaller('function'), list1)
methodcaller()
接受额外的参数,然后将它们传递给被调用的方法;methodcaller('foo', 'bar', spam='eggs')(object)
相当于 object.foo('bar', spam='eggs')
。list1
中所有对象都是相同类型或该类型的子类,并且您想要调用的方法不需要任何参数,则可以将未绑定的方法作为要调用的函数传递给 map
。例如,要将列表中的所有字符串转换为小写,您可以使用:map(str.lower, list_of_strings)
str.lower
是字符串类型上的未绑定方法。
请注意,列表推导式并不真正等同于 map()
。 map()
只能执行一个完全在 C 语言层面完成的循环操作。 map()
会将多个可迭代对象使用 zip()
进行配对,并且Python 3中的 map()
本身也是一个迭代器。
另一方面,列表推导式可以执行多个(嵌套的)循环和过滤操作,而左侧表达式可以是任何有效的 Python 表达式,包括嵌套的列表推导式。
map(lambda x: type(x).function(), list1)
这并没有比更加直接的方式更加令人兴奋。
map(lambda x: x.function(), list1)
然而,它指出如果Python有一个函数组合运算符会很好,类似于f ** g(x) == f(g(x))
。那么你就可以这样写
map(type**function, list1)
type()
调用是相当无意义的,因为它只是将对象映射到解除引用仅仅方法。只有当列表中的所有对象都是相同类型,并且您使用未绑定方法的直接引用时,它才变得有趣。 - Martijn Pieters