pass - функции обратного вызова python




Функция any() в Python с обратным вызовом (6)

Yo должен использовать «выражение генератора», то есть конструкцию языка, которая может потреблять итераторы и применять фильтр и выражения затем в одной строке:

Например, (i ** 2 for i in xrange(10)) является генератором квадрата первых 10 натуральных чисел (от 0 до 9)

Они также разрешают предложение «if» фильтровать itens в предложении «for», поэтому для вашего примера вы можете использовать:

any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)

Стандартная библиотека Python определяет функцию any() которая

Вернуть True, если любой элемент итерабельного является истинным. Если итерабельность пуста, верните False.

Он проверяет, только если элементы оценивают значение True . То, что я хочу, чтобы это было возможно, позволяет указать обратный вызов, чтобы определить, соответствует ли элемент счету:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)

Как насчет:

>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True

Он также работает со all() :

>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False

любая функция возвращает True, когда любое условие равно True.

>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.


>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.

На самом деле концепция любой функции выводится из Lisp или вы можете сказать из подхода к программированию функций. Существует еще одна функция, которая прямо противоположна ей.

>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.

>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.

Эти две функции действительно хороши при правильном использовании.


В то время как другие дали хорошие ответы Pythonic (я бы просто использовал принятый ответ в большинстве случаев), я просто хотел указать, насколько легко сделать свою собственную функцию полезности, чтобы сделать это самостоятельно, если вы действительно предпочитаете это:

def any_lambda(iterable, function):
  return any(function(i) for i in iterable)

In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False

Я думаю, что хотя бы сначала определил его с параметром функции, так как это более точно соответствовало бы существующим встроенным функциям, таким как map () и filter ():

def any_lambda(function, iterable):
  return any(function(i) for i in iterable)

Вы можете использовать комбинацию any и map если вы действительно хотите сохранить свою лямбда-нотацию следующим образом:

any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))

Но лучше использовать выражение генератора, потому что он не будет строить весь список дважды.


Если вы действительно хотите встроить лямбда в любой (), вы можете сделать это:

>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False

Вам просто нужно завернуть неназванную лямбду и убедиться, что она вызывается на каждом проходе, добавив ()

Преимущество в том, что вы по-прежнему получаете возможность использовать короткое замыкание оценки любого, когда вы попадаете в первый int





any