서울에서 김서방 찾다가 파이썬 함수 print, return 차이 이해!

히제오·2020년 10월 3일
0

파이썬 til

목록 보기
1/9
post-thumbnail

서울에서 김서방 찾기는 역시 어려웠다.
프로그래머스가 내게 서울에서 김서방을 찾아보라며 준 문제는 다음과 같았다.

String형 배열 seoul의 element중 Kim의 위치 x를 찾아, 김서방은 x에 있다는 String을 반환하는 함수, solution을 완성하세요. seoul에 Kim은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

  • 제한 사항
    - seoul은 길이 1 이상, 1000 이하인 배열입니다.
    - seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
    - Kim은 반드시 seoul 안에 포함되어 있습니다.

  • 입출력 예
seoul	        return
[Jane, Kim]	김서방은 1에 있다

물론 나는 파이썬을 막 배우기 시작했고! 삽질이 당연하다!
그러다 정답 직전, 정답과 오답 사이를 갈랐던 삽질은 파이썬 함수의'print'와 'return'의 차이를 이해 못해서 발생한 삽질이었다.

<오답>
def solution(seoul):
    a = seoul.index("Kim")
    print("김서방은 {}에 있다".format(a))
<정답>
def solution(seoul):
    a = seoul.index("Kim")
    return "김서방은 {}에 있다".format(a)

REPL환경에서는 어떤 것들은 return해주기만 해도 print해주기도 하는데, 그로 인해 값을 반환하라는 주문은 print하라는 것과 같다고 오해한 것이다. 그렇지만 print는 화면에 '인쇄'하는 작업일 뿐이고, 함수의 결과로서 값을 '전달', '반환'하지는 않는다.

이해를 도와주시기 위해 조교님께서 친히 코드 하나를 짜 주셨고, 이를 통해 print와 return의 차이를 어느 정도 이해한 것 같다. 잊기 전에 정리해본다.

def count_people(seoul):
    cnt = 0
    for elem in seoul:
        if elem == 'money':
            return -1
        if elem == 'people':
            cnt += 1
    print(f'{cnt}명의 people이 있습니다'.format(cnt))
    
p = count_people(seoul)
if p == -1:
    print('리스트에 잘못된 값이 있습니다.')

이 함수는 seoul이라는 리스트 속에 people이 있다면 people의 수를 세어서 프린트해주기 위한 함수다. 다만, 리스트에 money와 같은 '잘못된 값'이 있을 경우 걸러볼 수 있기를 기대하시며 return -1부분을 만들어두셨다. (아마도?)

이 코드는 다음과 같이 동작한다 이해했다.

  1. 함수를 정의하는 코드는 아무것도 출력하지 않는다. '함수를 정의하는 코드'일 뿐, 함수의 결과값을 보기 위해서는 정의된 함수를 사용하는 코드가 따로 있어야 한다.
  2. seoul 안에 'money'가 있다면, count_people(seoul)은 -1을 리턴할 뿐, print를 출력하지 않는다. return 명령어를 만나면 함수가 종료되기 때문이다. 'money'가 없다면 return없이 마지막 print 'n명의 people이 있습니다'가 출력된다.
  3. if p == -1: print('리스트에 잘못된 값이 있습니다.') 부분에서는 count_people함수에 'money'가 있어 count_people(seoul) -1을 리턴한다면, '리스트에 잘못된 값이 있습니다'를 출력한다. -1이 출력되지 않고 count_people(seoul)이 그저 print만을 지시하게 되는 경우, 즉 'money'가 리스트에 없는 경우에는 'n명의 people이 있습니다' 가 출력된다. 이 때 이 프린트 값이 p에 할당되는 것은 아니다.

seoul의 리스트를 조금씩 변경해가며 테스트해보면

  • seoul에 'money'가 없고 'people'이 두 번 들어가있는 경우
  • seoul에 'money'가 있는 경우

질문 폭탄을 던졌는데도 친절히 답변해주신 조교님께 무한 감사를 🥺

profile
삽질 전문가. 모든 일에 진심인 편.

0개의 댓글