【问题标题】:Python: calling method in the map functionPython:在地图函数中调用方法
【发布时间】:2014-02-16 16:46:31
【问题描述】:

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 执行这种操作?

【问题讨论】:

    标签: python methods list-comprehension map-function


    【解决方案1】:

    你会使用operator.methodcaller():

    from operator import methodcaller
    
    map(methodcaller('function'), list1)
    

    methodcaller() 接受附加参数,然后将这些参数传递给被调用的方法; methodcaller('foo', 'bar', spam='eggs')(object) 相当于 object.foo('bar', spam='eggs')

    如果list1中的所有对象都是同一类型或该类型的子类,并且你要调用的方法不带任何参数,你可以将未绑定的方法传入@ 987654328@ 作为要调用的函数。例如,要将列表中的所有字符串小写,您可以使用:

    map(str.lower, list_of_strings)
    

    其中str.lowerstr 类型上的未绑定方法。

    请注意,这里的列表推导式实际上并不等同于 map()map() 只能做 一个 循环,完全在 C 中。map()zip() 多个可迭代参数,而 Python 3 中的 map() 本身就是一个迭代器。

    另一方面,列表推导可以执行多个(嵌套)循环并添加过滤,左侧表达式可以是任何有效的 Python 表达式,包括嵌套列表推导。

    【讨论】:

      【解决方案2】:

      您可以使用对象的类型直接调用该方法。

      map(lambda x: type(x).function(), list1)
      

      这并不比更直接的更令人兴奋

      map(lambda x: x.function(), list1)
      

      但是,它确实指出如果 Python 有一个函数组合运算符会很好,比如f**g(x) == f(g(x))。然后你可以写

      map(type**function, list1)
      

      【讨论】:

      • 您实际上并没有调用该函数;并且在 lambda 中使用 type() 调用是毫无意义的,因为它只是意味着您正在将对象映射到取消引用 just 方法。仅当列表中的所有对象都是相同类型并且您使用对 中未绑定方法的直接引用时,它才会变得有趣
      猜你喜欢
      • 2019-07-27
      • 2016-01-31
      • 2021-06-29
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多