Programing

콜백이있는 Python의 any () 함수

crosscheck 2020. 12. 7. 07:50
반응형

콜백이있는 Python의 any () 함수


Python 표준 라이브러리는 다음과 같은 any()함수를 정의 합니다.

이터 러블의 요소가 true이면 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.

이 두 기능은 제대로 사용하면 정말 멋집니다.


"생성자 표현식"을 사용해야합니다. 즉, 반복기를 사용하고 한 줄에 필터 및 표현식을 적용 할 수있는 언어 구조입니다.

예를 들어 (i ** 2 for i in xrange(10))처음 10 개의 자연수 (0 ~ 9)의 제곱에 대한 생성기입니다.

또한 "if"절이 "for"절에서 itens를 필터링 할 수 있도록 허용하므로 예제에서는 다음을 사용할 수 있습니다.

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

Antoine P의 답변에 약간의 개선

>>> any(type(e) is int for e in [1,2,'joe'])
True

에 대한 all()

>>> all(type(e) is int for e in [1,2,'joe'])
False

다른 사람들은 좋은 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 ()와 같은 기존 내장 함수와 더 밀접하게 일치하기 때문에 적어도 먼저 function 매개 변수로 정의한다고 생각합니다.

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

filter can work, plus it returns you the matching elements

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

You can use a combination of any and map if you really want to keep your lambda notation like so :

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

But it is better to use a generator expression because it will not build the whole list twice.


If you really want to inline a lambda in any() you can do this:

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

You just have to wrap up the unnamed lambda and ensure it is invoked on each pass by appending the ()

The advantage here is that you still get to take advantage of short circuiting the evaluation of any when you hit the first int

참고URL : https://stackoverflow.com/questions/2012611/any-function-in-python-with-a-callback

반응형