본문 바로가기
게임 제작 관련/개발환경(프로그램)

Python def 함수정의, return 반환문

by 김바보 2022. 10. 13.

파이썬에서 기본적으로 주어지는 함수 이외에 자신이 직접 함수를 만들어 사용해야 할 일이 생긴다.

복잡한 구문을 반복하려면 코드도 길어지지만, 함수를 이용하면 축약할 수 있다.

 

def info(name, age):
    print('이름: ', name)
    print('나이: ', age)

info('김바보', 21)
info('이바보', 20)
-----------------------------
이름:  김바보
나이:  21
이름:  이바보
나이:  20

가장 간단한 함수 구문이다. def를 이용해 함수를 정의하고

def 구문 안에, 실행될 문장을 적는다.

나중에 함수를 다시 호출하면 def 내에 적었던 내용이 실행된다.

 

 

1. Return 개념

함수에는 return이 있다.

def doSum(start, end):
    sum = 0
    for i in range(start, end + 1):
        sum += i
    return;    #return값 없음(null을 반환한다, 라고 표현한다네요)

print(doSum(1,10))
-----------------------------
None


def doSum(start, end):
    sum = 0
    for i in range(start, end + 1):
        sum += i
    return sum   #sum을 반환

print(doSum(1,10))
------------------------------
55

이게 상당히 헷갈리는데, return = 반환값이다.

return; or return을 쓰지 않음 = 반환 X = None

return <반환값>: 반환값을 정의한 함수에 할당한다. 정도로 이해하면 될 것 같다.

 

return의 정의가 아직 헷갈린다면, 우선 doSum()과 print(doSum())의 차이부터 이해해보자.

print와 return의 차이를 확실하게 알 수 있다.

def doSum(start, end):
    sum = 0
    for i in range(start, end + 1):
        sum += i
    print('\t',sum)
    
doSum(1,10)            #1
print(doSum(1,10))     #2
----------------------------------------
	 55         #1 출력값
	 55         #2 함수출력값
None               #2 함수반환값

이 코드를 보면 이해가 간다. start, end 값을 받아 그 사이에 있는 수들을 모두 더해서 출력하는 코드다.

 

#1 구문은 함수만 호출한 것: doSum안에 print(sum)이 1번 출력해서 55

#2 구문은 함수 + 함수반환값: doSum안에 print(sum)이 1번 출력해서 55

                                                doSum이라는 함숫값 1번 출력해서 None

 

None이 뜬 이유는 return된 함숫값이 없어서 그렇다.

저 구문에 return sum을 해주면 55가 3번 출력된다.

 

그니까, return은 반환값을 함수에 '할당'한다 라고 보면 될 것 같다.

함수 안에 print구문이 없는데, 함수를 호출할때 무엇인가를 출력하고 싶다면 return을 설정해주면 된다.

 

 

2. return 응용

이런 return의 성질머리 덕분에 여러 기능으로 응용할 수 있다.

2-1. 특정값 입력시 함수 빠져나오기

def nickName(name):
    if name == '커피':
        return
    print(name,'(으)로 설정하시겠습니까?')
    
nickName('커퓌')
--------------------------------------------
커퓌 으로 설정하시겠습니까?


def nickName(name):
    if name == '커피':
        return
    print(name,'(으)로 설정하시겠습니까?')
    
nickName('커피')
-------------------------------------------

받으려는 닉네임이 '커피'이면 return에 의해 함수를 바로 빠져나오게 된다.

반복문의 break와 성질이 비슷하다.

 

 

2-2. return True, return False

def prime(n):
    for i in range(2, n):
        if(n % i == 0):
            return False
        return True
    
n = int(input("소수를 판별할 정수를 입력하세요:"))
print(prime(n))
-----------------------------------------------------
소수를 판별할 정수를 입력하세요:20
False

return 값에 소수이면 TRUE, 소수가 아니면 FALSE를 반환하는 예제다. (R 하다보니 다 대문자로 쓰는게 습관이 되서 안 고쳐진다...)

 

소수란 1과 자기 자신(n)으로만 나눴을때 나눠 떨어지는 수다.

n값을 range를 이용해 2부터 입력받은 n-1까지 나눴을때 나눠 떨어지면 return False를 반환한다.

소수면 return TRUE를 반환한다.

 

 

2-3. return값 여러개 반환

사실 여러개 반환하는거야 쉽고(그냥 쉼표로 연결해주면 된다)

연습 겸... 두 점의 좌표값을 받아서, 두 점을 잇는 직선의 기울기(slope)와 y절편을 구하는 예제다.

def drawLine(x1, y1, x2, y2):
    if (x1 == x2):                        #받은 두개의 점의 x값이 같을 경우
        return 0, None                    #기울기 0, y절편 None
    else: 
        slope = (y2 - y1)/(x2 - x1)
        yJul =  y1 - slope * x1           #slope * x1 + yJul = y1
        return slope, yJul

x1 = int(input('x1 = '))
y1 = int(input('y1 = '))
x2 = int(input('x2 = '))
y2 = int(input('y2 = '))

slope, yJul = drawLine(x1, y1, x2, y2)     #1
print('기울기 = ',slope, 'y절편 = ',yJul)
-----------------------------------------------------------
x1 = 2
y1 = 1
x2 = 3
y2 = 5
기울기 =  4.0 y절편 =  -7.0

#1 구문의 경우 왜 있는지 모르겠어서 삭제해 봤더니 slope와 yJul값이 input값에 따라 변하질 않는다.

반환된 slope, yJul값이 새로 받은 drawLine()에 동기화를 하는 구문인 것 같다.

이해가 잘 안되면 외워야지 별 수 있나.

 

바로 앞 소수 판별하는 예제에서는 n(입력받은)값을 prime과 동기화 시켜주는 구문을 쓰지 않아도 된 이유는

아마 반환되는 값이 n이 아니라서 굳이 쓰지 않은 것으로 보인다.

 

 

3. 재귀함수

영어 문법 중에 재귀대명사(myself, yourself... 그거)를 떠올리면 된다.

자기 함수 내에서 자기 함수를 호출하는 것을 뜻 한다.

def countdown(n):
    if n == 0:
        print("Blastoff!")
    else:
        print(n)
        countdown(n-1)

countdown(3)
------------------------------
3
2
1
Blastoff!

A.1 함수의 재귀(recursion) - 왕초보를 위한 Python: 쉽게 풀어 쓴 기초 문법과 실습 (wikidocs.net)

에서 너무 잘 설명해주셔서 예제를 따왔다.

countdown()내에 countdown(n-1)을 호출되어 있다.

countdown(3)이니까 else로가서 print(n), countdown(2)가 차례로 실행된다.

countdown(2)가 호출되어있으니 다시 else로 가서 print(n), countdown(1)이 실행된다.

만약 종료되는 지점(n == 0)을 설정해주지 않는다면 이 예제는 무한 반복이 될 것이다.

댓글