소수 판별 함수를 리스트 축약표현을 사용하여 표현하고 싶습니다.

조회수 1074회

안녕하세요, 배우고 있는 학생입니다.

소수 판별 함수를 아래와 같이 공부했습니다.

10부터 50 사이의 소수를 출력하도록 하였는데요,

def is_prime(n): # 소수 판별 함수
    if n == 2 or n == 3: return True  # 수가 2나 3이면 소수
    for i in range(3, n, 2):  # range는 3부터 n까지의 홀수
        if n % i == 0:  
            return False  # 홀수로 나누어지면 소수가 아니다
    return True 

prime_list = [x for x in range(10, 51) if is_prime(x)]
print(prime_list)

밑에서 두번째 줄인 리스트 축약표현 부분에서 조건식 if에 들어가 있는 is_prime(x) 대신에 함수를 불러오지 않고 풀어서 써 보고 싶습니다. 그런데 쉽지 않네요.

prime_list = [x for x in range(10, 51) if x == 2 or x == 3 or (x for y in range(3, x, 2) if x % y != 0)]

위와 같은 식으로 해야 하나 고민했어요. 더 이상 어떤 방법을 써야 할지 생각이 나지 않네요 ㅠ.ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 함수라는 것이, 어떤 복잡한 알고리즘을 숨기는 기능이 있어요.

    소수인지 판단하는 알고리즘은 꽤 복잡해요. 어떤 수가 주어지면, 그 수보다 작은 수들이 주어진 수와 나누어 떨어지는지를 확인해야 합니다. 이 복잡한 걸 해주는 함수를 is_prime 이라는 이름으로 압축해 놓은 거에요. 우리가 소수라고 부르는 개념이 "약수가 1과 자기자신인 수"라는 개념을 담고 있지만, 그 개념을 아는 사람끼리 소수라는 단어 하나로 간단히 소통하는 것과 비슷합니다. 이 수학적 개념에는 소수의 다른 성질들까지 담겨서, 소수는 어떠어떠하니까 이럴꺼야 저럴꺼야 란 생각까지 함께 전달되죠. 이런 간편한 "이름"을 사용하지 않는다면, 이 개념을 기반으로 한 좀 더 복잡한 이론 전개가 어렵고 복잡해질 거에요. 매번 "약수가 1과 자기자신인 수"라는 장황한 설명을 해야 하니까요.

    음. 그래서, 결론은 굳이 함수로 잘 정의한 is_prime 을 함수를 사용하지 않고 풀어서 하지 않는 것이 더 좋아요. 그리고 리스트컴프리헨션은 한줄로 for 루프를 줄이는 파이썬 특유의 신택틱 슈가 이지만, 한줄로 써야 하기 때문에 (사실 꼭 그렇지만은 않지만, 그렇다고 합시다.), 줄바꿈과 인덴테이션으로 코드 블록을 구분하는 파이썬에서는 모든 코드를 리스트 컴프리헨션 안으로 넣기에는 무리가 있어요.

    질문자가 써주신 코드의 현재 상태가 상당히 좋은 코드입니다. is_prime 을 풀어서 집어넣으려면 코드가 지져분해집니다. 하지 마세요.

    • 감사해요. 막연히 풀어 쓰는 것이 좋지 않다고 생각하고 있었는데, 자세하고 친절히 설명해 주셔서 많은 도움이 됐어요. 그저 리스트 축약에 익숙해지고 싶은 욕심이 컸다고 생각해요. 다시 한번 감사드립니다. 알 수 없는 사용자 2020.12.21 19:55

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)