【问题标题】:Pass several arguments to function from map()从 map() 向函数传递几个参数
【发布时间】:2018-03-15 14:18:19
【问题描述】:

例如,如果我想检测数组中的所有奇数并将它们设置为零,我可以使用:

def setToZeroIfOdd(n):
   if n % 2 == 0:
      pass
   else:
      return 0

numbers = range(1,1000)

numbers = map(setToZeroIfOdd, numbers)

这就像一个魅力。

但是当我尝试类似的东西时

def setToZeroIfDivisibleBy(n, divisor):
  if n % divisor == 0:
     return 0
  else:
     pass

numbers = map(setToZeroIfDivisibleBy(divisor=3), numbers)

它需要两个参数。同样,

numbers = map(setToZeroIfDivisibleBy, numbers, divisor=3)

不起作用。如何从 map() 中传递 divisor 参数?

【问题讨论】:

标签: python


【解决方案1】:

尝试使用 lambda 函数

numbers = map(lambda n: setToZeroIfDivisibleBy(n, divisor=3), numbers)

你的意思不是pass,而是return n

【讨论】:

    【解决方案2】:

    你可以使用functools.partial来做偏函数

    from functools import partial
    
    def setToZeroIfDivisibleBy(n, divisor):
      if n % divisor == 0:
         return 0
      else:
         pass
    
    numbers = range(1,1000)
    
    numbers = map(partial(setToZeroIfDivisibleBy, divisor=3), numbers)
    

    【讨论】:

      【解决方案3】:

      你创建一个返回函数的函数:

      def setToZeroIfDivisibleBy(divisor):
          def callback(n):
              if n % divisor == 0:
                  return 0
              else:
                  pass
      
          return callback
      
      numbers = map(setToZeroIfDivisibleBy(3), numbers)
      

      顺便说一句,您可以完全省略空分支,例如 else: pass;它什么也没做。由于它导致None,我认为这也不是您想要的。你可能想要return n 代替。

      【讨论】:

        【解决方案4】:

        另一种方法不是使用partial,而是为双参数函数提供一个无限(或至少足够长)的第二个参数序列:

        from itertools import repeat
        numbers = map(setToZeroIfDivisibleBy, numbers, repeat(3))
        

        在 Python 2 中,map 将根据需要将None 附加到两个序列中较短的一个,以使它们具有相同的长度。假设这会导致问题(因为您的函数无法将 None 作为输入值处理,或者您最终会出现无限循环),您可以使用 itertools.imap,它会在用完较短的序列后停止:

        from itertools import imap, repeat
        numbers = list(imap(setToZeroIfDivisibleBy, numbers, repeat(3)))
        

        或将numbers 的长度作为第二个参数传递给repeat,这样两个序列的长度相同。

        from itertools import repeat
        numbers = map(setToZeroIfDivisibleBy, numbers, repeat(3, len(numbers)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-08
          • 2018-06-03
          • 2011-09-27
          相关资源
          最近更新 更多