Лямбда-функция - неизвестное количество аргументов - PullRequest
0 голосов
/ 25 октября 2018

В настоящее время я разрешаю функцию «и» с помощью лямбды с двумя аргументами:

custom_function = lambda a, b: a and b

Но как я могу разрешить неизвестное количество аргументов, например:

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

Кто-нибудь имел эту проблему раньше?

Спасибо и привет!

Ответы [ 4 ]

0 голосов
/ 27 октября 2018

Сначала используйте *args, чтобы сохранить неизвестное количество аргументов в качестве кортежа.

Во-вторых, all(args) возвращает только Ture или False, но операция and может возвращать значение ( Здесь почему).Поэтому нам нужно использовать reduce.

Вот решение:

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

Тест 1: аргументы Ture или False

>>> 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: аргументы представляют собой комбинацию bool и значений

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

Обратите внимание, что три теста верны в соответствии с определением логического И (и):

Возвращает первое значение Falsey, если оно есть, иначе возвращает последнее значение в выражении.

0 голосов
/ 25 октября 2018

Вы можете использовать распаковку аргумента с помощью оператора * для обработки любого количества аргументов.Вам нужно будет прибегнуть к reduce (Python2) или functools.reduce (Python3), чтобы объединить их все с and в одном выражении (как того требуетлямбда):

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
0 голосов
/ 25 октября 2018

Почему бы просто не использовать все функции?

a = 1
b = 2
c = None
args = [a, b, c]
print (all(args))
# False
0 голосов
/ 25 октября 2018

Вы можете использовать "* 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 параметров "с любым количеством параметров (если их порядок не имеет значения):

import operator
import functools

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

(те же результаты, что и раньше)

...