从map()传递几个参数来起作用

use*_*532 1 python

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

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

numbers = range(1,1000)

numbers = map(setToZeroIfOdd, numbers)
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力.

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

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

numbers = map(setToZeroIfDivisibleBy(divisor=3), numbers)
Run Code Online (Sandbox Code Playgroud)

它期待两个论点.同样,

numbers = map(setToZeroIfDivisibleBy, numbers, divisor=3)
Run Code Online (Sandbox Code Playgroud)

不起作用.我怎样才能divisor从内部传递这个论点map()

Pat*_*ugh 9

您可以使用它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)
Run Code Online (Sandbox Code Playgroud)


dec*_*eze 7

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

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

    return callback

numbers = map(setToZeroIfDivisibleBy(3), numbers)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以完全省略空分支else: pass; 它没有做任何事情.既然它导致了None,我不认为这也是你想要的.你可能想要return n那里.


dam*_*san 6

尝试使用lambda函数

numbers = map(lambda n: setToZeroIfDivisibleBy(n, divisor=3), numbers)
Run Code Online (Sandbox Code Playgroud)

而不是pass你的意思return n