【问题标题】:Using map() function with keyword arguments使用带有关键字参数的 map() 函数
【发布时间】:2012-11-10 02:11:50
【问题描述】:

这是我尝试使用 map 函数的循环:

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
for volume_id in volume_ids:
    my_function(volume_id, ip=ip)

有什么办法可以做到这一点吗?如果不是ip 参数,这将是微不足道的,但我不确定如何处理。

【问题讨论】:

    标签: python arguments map-function


    【解决方案1】:

    使用functools.partial():

    from functools import partial
    
    mapfunc = partial(my_function, ip=ip)
    map(mapfunc, volume_ids)
    

    partial() 创建一个新的可调用对象,它会将任何参数(包括关键字参数)应用于包装函数,以及传递给该新可调用对象的任何参数。

    【讨论】:

      【解决方案2】:

      这是一种 lambda 方法(不是更好,只是不同)

      volume_ids = [1,2,3,4,5]
      ip = '172.12.13.122'
      map(lambda ids: my_function(ids, ip), volume_ids);
      

      【讨论】:

      • partials 更快,lambdas 支持乱序参数
      【解决方案3】:

      这可以通过列表理解轻松完成。

      volume_ids = [1,2,3,4,5]
      ip = '172.12.13.122'
      results = [my_function(i,ip=ip) for i in volume_ids]
      

      【讨论】:

      • 这有副作用。您正在分配一堆可能不需要的内存(并且不是由 OP 指定的)。
      【解决方案4】:

      通常,可以使用 map 将关键字传递给函数,方法是将函数包装在解包字典的东西中,然后将字典的可迭代对象传递给 map。示例:

      from itertools import product
      
      volume_ids = [1,2,3,4,5]
      volume_ids = (("volume_id", volume_id) for volume_id in volume_ids)
      ips = [("ip", '172.12.13.122')]
      kwargs_iterable = map(dict, product(volume_ids, ips))
      
      result = map(lambda kwargs: my_function(**kwargs), kwargs_iterable)
      

      但是,对于您的特殊情况,更简单的解决方案是:

      map(my_function, volume_ids, [ip]*len(volume_ids))
      

      这是简洁的,不依赖于任何导入。另一种可能性是结合 itertools 中的产品和星图:

      from itertools import product, starmap
      
      ips = [ip]
      starmap(my_function, product(volume_ids, ips))
      

      这很好地概括了具有多个 IP 地址或两个以上变量的设置。

      【讨论】:

        【解决方案5】:

        这个怎么样?

        results = []
        for volume_id in volume_ids:
            results.append(my_function(volume_id, ip=ip))
        

        这是三行代码而不是一行 --- 这是三行清晰明了的代码,而不是从某某模块导入一些特殊情况的帮助程序。这个论点可能是一个品味问题,但它的分量很大,具体取决于您与谁交谈。

        【讨论】:

        • 问题是我们要避免for循环
        • 为什么?因为更清楚?还是因为一些误解,比如“for 循环在 Python 中很慢”?
        • 是的,我会说确实更清晰,更 Pythonish,并且 map 函数旨在执行最懒惰的迭代。此外,我们需要返回一个列表,因此 map 比编写更多的代码行编码 for 循环对我们来说会更好
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 2019-08-21
        • 1970-01-01
        相关资源
        最近更新 更多