Lambda函数-参数数量未知

时间:2018-10-25 13:42:46

标签: python function lambda expression operands

当前,这是我如何使用带有两个参数的lambda解析“ and”函数的方法:

custom_function = lambda a, b: a and b

但是如何解决未知数量的参数,如:

custom_function = lambda a, b, c, d, ...: what now?

以前有人遇到过这个问题吗?

感谢和问候!

4 个答案:

答案 0 :(得分:2)

您可以使用“ * args”:

>>> custom_function = lambda *args: all(args)
>>> custom_function(1, 2, 3)
True
>>> custom_function(1, 2, 3, 0)
False

实际上与仅使用“ all”相同:

>>> all(1, 2, 3)
True
>>> all(1, 2, 3, 0)
False

一般来说,您可以使用“ functools.reduce”将带有任何数量参数(如果顺序无关紧要)的任何“ 2-parameters”函数使用:

import operator
import functools

c = lambda *args: functools.reduce(operator.and_, args)

(结果与以前相同)

答案 1 :(得分:1)

您可以使用argument unpacking via the * operator处理任意数量的参数。您必须使用reduce(Python2)或functools.reduce(Python3)才能将它们与and组合成一个表达式(根据lambda的需要):

from functools import reduce  # only Py3

custom_function = lambda *args: reduce(lambda x, y: x and y, args, True)

注意:这与all不同,这里有很多建议:

>>> all([1,2,3])
True
>>> 1 and 2 and 3
3
>>> custom_function(1,2,3)
3

答案 2 :(得分:0)

为什么不仅仅使用all功能?

a = 1
b = 2
c = None
args = [a, b, c]
print (all(args))
# False

答案 3 :(得分:0)

First, use *args to store an unknown number of arguments as a tuple.

Second, all(args) only return Ture or False but and operation may return value ( Here的原因)。因此,我们需要使用reduce

这是解决方案:

custom_function = lambda *args: reduce(lambda x,y: x and y, args)

测试1:参数是正确的还是错误的

>>> custom_function(True,False,True,False)
False
>>> custom_function(True,True,True)
True

测试2:参数是值

>>> custom_function(1,2,3,4,3,2)
2
>>> custom_function('a','b','d','s')
's'

测试3:参数是布尔值和值的组合

>>> custom_function(1,2,True,4,3,2)
2
>>> custom_function(1,2,False,4,3,2)
False

请注意,根据逻辑 AND (和)的定义,这三个测试是正确的:

  

返回第一个Falsey值(如果有),否则返回最后一个   表达式中的值。