Skip to content

Instantly share code, notes, and snippets.

@shoark7
Last active September 28, 2019 04:21
Show Gist options
  • Save shoark7/5e08eed12064b0d7cf7d9084f140a8c7 to your computer and use it in GitHub Desktop.
Save shoark7/5e08eed12064b0d7cf7d9084f140a8c7 to your computer and use it in GitHub Desktop.
we briefly look through all and any builtin functions in Python

0. 목적

이 자료에서는 파이썬의 내장 함수인 allany 함수를 살펴볼 생각입니다. 이 함수는 때로 매우 유용한데 이 함수들을 잘 활용하면 Pythonic 한 코드를 짜기 쉽습니다. 특히 이번 스터디에서 다루시는 문제들 중에 이 두 함수를 쓰면 코드가 짧아지고 간결해지는 경우가 몇 개 있더라구요. 그래서 몇몇 분들께 여쭤봤는데 생각보다 되게 간단한 문법이지만 많이 안 써보신 것 같아요. 이 함수는 zip 과 같은 내장 함수처럼 제대로 알고 적재적소에 쓰면 기가 막히게 유용하기 때문에 간단하게 문서를 만들어보게 되었습니다.



1. 들어가기에 앞서

논의를 편하게 하기 위해 개념을 하나 정의하고 가겠습니다. 잘 아시다시피 파이썬에서 str, list, tuple, dict 등은 for 문에서 원소 하나씩 순회 가능하잖아요? 다시 말해 for문에서 사용할 수 있죠. 파이썬에서 이런 자료형들을 통틀어서 Iterable(이하 "이터러블")이라고 합니다. 이는 실제로 공식적으로 쓰는 용어이고, 사실 내부적으로는 관련된 클래스가 만들어져 있습니다. 반대로 int, float 등은 반복문에서 쓸 수가 없죠. 따라서 이 친구들은 이터러블이 아닙니다. allany는 이터러블한 자료형에 사용할 수 있습니다.

이 개념을 공유하고 allany를 살펴보겠습니다.



2. all

all 함수는 이터러블의 배열의 모든 원소가 특정 조건을 만족하는지 판별합니다. 가령 조건을, 이터러블의 모든 원소가 짝수인지 검증하고 싶다고 하겠습니다. 이때 all 함수는 배열의 모든 원소가 조건을 만족하는지 확인해서 모든 원소가 짝수면 True, 하나라도 짝수가 아니면 False를 반환합니다.

이 작업 자체는 꼭 이 함수를 안 쓰고도 할 수 있는데요. 뭐 이렇게 해볼 수도 있겠습니다.

are_all_even = True

for n in arr:
    if n % 2 == 1:
        are_all_even = False

print(are_all_even)

하지만 이 정도 작업에 많은 공간이 할애됐다는 느낌을 지울 수 없습니다. 이때 all을 쓰면 한 줄로 만들 수 있습니다.

all(n % 2 == 0 for n in arr)

오호, 쾌재라! all 내부는 사실상 list comprehension 식과 거의 비슷하죠. 복잡한 문법명은 빼고, 이 comprehension도 Iterable이라고 할 수 있습니다. 따라서 all에 comprehension식을 넣고 각 원소는 짝홀 여부에 따라 True/False를 반환할텐데 이 결과가 모두 True여야 all은 True를 반환합니다.


다른 예제를 만들어볼까요? 문장을 하나 받아서 이 문장의 모든 글자가 영어 알파벳인지 검증할 때도 써볼 수 있겠습니다.

sentence = input("문장을 입력하세요: ")

all(c.isalpha() for c in sentence)

이런 문법에 익숙해지면 for문으로 짤 생각만해도 현기증이 날지 모르겠어요.



3. any

any는 이름에서 눈치채셨겠지만 all과 조금 다르게 동작합니다. all이 이터러블의 모든 원소가 조건을 만족하는지 검증한다면, any는 이터러블의 단 한 원소라도 조건을 만족하면 True, 모두 조건을 만족하지 못할 때 False를 반환합니다.

예를 들어볼까요? 이번엔 기능다운 기능을 만들어보겠습니다.

문제상황을 떠올려야 하는데 당장 떠오르는 게 없어서 다른 인물의 페르소나를 창조해보겠습니다.

지금 나는 지독한 백인 우월주의자로, 신성한 개척자 정신이 살아숨쉬는 땅 미국에 아시아인이 침투하는 꼴을 보고 싶지 않다. 그중에서도 한국인들이 자신들의 세력권을 만들어가는데, 너무 꼴보기가 싫다.
또 나는 웹서비스를 운영하는데 당연히 유저의 ID를 입력받는다. 난 영어 이외의 글자는 다 싫지만 그중에서도 ID에 한글이 있는 것만큼은 목에 칼이 들어와도 허용할 수 없다.

  • 이때 유저의 ID를 입력받아 ID에 한글이 포함되어 있는지 검증하는 함수를 만들어보라.

any를 써서 이렇게 만들어 볼 수 있겠습니다.


def has_korean(id):
    UNICODE_가 = ord('가')
    UNICODE_힣 = ord('힣')

    return any(UNICODE_가 <= ord(c) <= UNICODE_힣 for c in id)

아시다시피 파이썬의 ord 내장 함수는 글자 하나의 유니코드 숫자를 반환합니다. 한글의 시작은 , 끝은 이기 때문에 글자의 유니코드가 이 사이에 있으면 한글이라는 것을 알 수 있습니다.

올바르게 작동하는지 보겠습니다.

print(has_korean("가나다"))
print(has_korean("ARe you ready, 김군?"))
print(has_korean("abcdee"))
print(has_korean("No Koreans allowed here, 가시라구요, Oh, my god..."))
print(has_korean('日本人は大丈夫です?'))

True
True
False
True
False



여기서 마치겠습니다. 고맙습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment