Python 从map()向函数传递多个参数

Python 从map()向函数传递多个参数,python,Python,例如,如果我想检测数组中的所有奇数并将其设置为零,我可以使用: 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

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

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()
中传递该
除数
参数?

尝试使用lambda函数

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

而不是
pass
您的意思是
返回n

尝试使用lambda函数

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

而不是
pass
你的意思是
return n

你做了一个返回函数的函数:

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

    return callback

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

顺便说一句,您可以完全省略空分支,如
else:pass
;它没有任何作用。因为它会导致一个
,我认为这也不是你想要的。您可能希望返回n。

您创建了一个返回函数的函数:

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

    return callback

numbers = map(setToZeroIfDivisibleBy(3), numbers)
from itertools import repeat
numbers = map(setToZeroIfDivisibleBy, numbers, repeat(3))
顺便说一句,您可以完全省略空分支,如
else:pass
;它没有任何作用。因为它会导致一个
,我认为这也不是你想要的。您可能希望在那里返回n。

您可以使用来生成部分函数

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)
可以使用来生成部分函数

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)

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

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

    return callback

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

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

from itertools import imap, repeat
numbers = list(imap(setToZeroIfDivisibleBy, numbers, repeat(3)))
或者将
数字的长度
作为第二个参数传递给
repeat
,使两个序列的长度相同

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

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

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

    return callback

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

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

from itertools import imap, repeat
numbers = list(imap(setToZeroIfDivisibleBy, numbers, repeat(3)))
或者将
数字的长度
作为第二个参数传递给
repeat
,使两个序列的长度相同

from itertools import repeat
numbers = map(setToZeroIfDivisibleBy, numbers, repeat(3, len(numbers)))
“这很有魅力。”当然不是
pass
在此处隐式返回
None
。相关:或“像符咒一样工作”。当然不是
pass
在此处隐式返回
None
。相关:或