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
呢?
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
类型上的未绑定方法在哪里str
。
请注意,列表推导实际上并不等同于map()
此处。map()
只能做一个循环,完全在 C 中。map()
将有zip()
多个可迭代参数,并且map()
在 Python 3 中本身就是一个迭代器。
另一方面,列表推导可以执行多个(嵌套)循环并添加过滤,左侧表达式可以是任何有效的 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)