[Python] 파이썬 any 와 all 언제 어떻게?

hukim·2022년 4월 30일
0

Python

목록 보기
12/12
post-thumbnail
post-custom-banner

all 함수란?

all 함수는 인자로 받은 모든 요소가 참(True)이면 참(True)을 반환하고
하나라도 거짓(False)이면 거짓(False)을 반환한다.

단, all 이라는 함수는 인자로 반복 가능한 (iterable) 자료형을 받는다.

  • itreable 자료형은 리스트, 튜플, 딕셔너리 등과 같이 for문에서 사용 가능한 자료형들이다.

또한 인자로 받은 요소가 비어있는 경우 True를 반환한다.

def all(iterable):
	for element in iterable:
    	if not element:
        	return False
    return True

파이썬의 공식 홈페이지에 있는 all 함수의 구현 코드이다.

각 요소(element)들을 반복문으로 돌면서 요소가 참인지 거짓인지 검사하고 해당 요소가 거짓일 경우 즉시 거짓을 반환한다.

all 함수 예시

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

>>> all([1, 2, 3, 0])
False

>>> all([])
True

any 함수란?

any 함수는 인자로 받은 요소 중 하나라도 참(True)이 있으면 True를 돌려주고, 모든 요소가 거짓(False)일 경우에만 False를 돌려준다.

any 함수도 마찬가지로 반복 가능한 (iterable) 자료형을 인자로 받는다.
all과는 반대되는 or 개념으로 생각하면 편하다.

또한 인자로 받은 요소가 비어있는 경우 False를 반환한다.

def any(iterable):
	for element in iterable:
    	if element:
        	return True
    return False

파이썬의 공식 홈페이지에 있는 any 함수의 구현 코드이다.

마찬가지로 각 요소(element)들을 반복문으로 돌면서 요소가 참인지 거짓인지 검사하고 해당 요소가 참인경우 즉시 참을 반환한다.

any 함수 예시

>>> any([1, 2, 3, 0])
True

>>> any([0, ""])
False

>>> any([])
False

그렇다면 언제 사용할까?

특정 조건을 어떤 리스트에서 체크 해야할 경우 위의 any와 all을 활용하여 간결한 코드를 작성할 수 있다.

def any_or_all(p_list, value, type):
    if type == "any":
        if any(value == i for i in p_list):
            print(f"{value}이(가) 리스트에 존재함")
        else:
            print(f"{value}이(가) 리스트에 존재하지 않음")
    elif type == "all":
        if all(value == i for i in p_list):
            print(f"모든 리스트가 {value}")
        else:
            print(f"{value}이(가) 아닌 값이 존재")


temp_list = [1, 2, 3, 4, 5]
value = 3
any_or_all(temp_list, value, "any")
>>> 3() 리스트에 존재함

temp_list = [1, 2, 3, 4, 5]
value = 6
any_or_all(temp_list, value, "any")
>>> 6() 리스트에 존재하지 않음

temp_list = [3, 3, 3, 3, 3]
value = 3
any_or_all(temp_list, value, "all")
>>> 모든 리스트가 3

temp_list = [5, 5, 5, 5, 6]
value = 5
any_or_all(temp_list, value, "all")
>>> 5() 아닌 값이 존재

Enum 클래스 안에서 사용해본 예시

Enum 클래스안에서 특정 value가 Enum클래스 안에 존재하는 값인지 체크할 수 있는
클래스메소드를 만들어서 활용할수도 있을 것 같다.

from enum import Enum


class TestEnum(Enum):
    test1 = 1
    test2 = 2
    test3 = 3

    @classmethod
    def has_value(cls, value):
        return any(value == test.value for test in TestEnum)

print(TestEnum.has_value(2))
>>> True
print(TestEnum.has_value(4))
>>> False

물론 python에서 제공하는 value in cls.value2member_map 를 이용하여도 된다.

이 함수들의 성능 궁금증

any 함수를 직접 만들어 사용하였으나 any 함수 사용했을 때와 비교하여 성능차이가 난 경우
-> 링크

any 함수에 각각 자료형을 list, set, generator로 대입했을 때의 성능비교
-> 링크

post-custom-banner

0개의 댓글