본문 바로가기
Programming/Python

12. 함수 만들기

by IT learning 2021. 3. 18.
728x90

식별자 뒤에 괄호가 붙어있으면[ex. input()] 해당 식별자는 '함수'라고 했었다.

오늘은 이러한 함수들은 어떻게 만들어지는지에 대해 알아보겠다.

 

함수의 기본

함수는 한마디로 '코드의 집합'이다.

함수의 기본 형태는 다음과 같다.

def 함수 이름() :
	문장

이 형태로 간단한 함수를 만들어보았다.

# 기본적인 함수
def print_3_times() :
    for i in range(3) :
        print("안녕하세요")
        
print_3_times()

위 함수는 아무런 매개변수없이 실행하는 함수이고, 함수를 실행하면 for 반복문이 돌면서 안녕하세요를 3번 출력하게 된다.

위 코드의 실행결과이다.

함수에 매개변수 만들기

일단 매개변수라는게 뭔지는 알아야 만들든가 말든가 하지 않겠는가?

매개변수는 함수가 실행될때 필요한 조건들을 삽입한다.라는 개념으로 생각하면 된다.

우리가 가장 많이 사용하는 함수 중 print()함수를 보자.

print() 함수의 괄호 안에 우리가 무엇을 넣는가?

string 형식, int 형식 등등 많이 넣지 않는가?

물론 print() 함수는 매개변수를 굳이 넣지 않아도 실행이 가능하다. 하지만 넣으면 내가 넣었던 것들이 출력이 되는 함수다.

이렇게 함수를 실행하기 위해 넣어주는 것이 매개변수이다.

def 함수 이름(매개변수, 매개변수 ...) :
	문장

다음과 같이 함수를 생성할 때 괄호 내부에 식별자를 입력해서 만든다.

# 매개변수의 기본
def print_n_times(value, n) :
    for i in range(n) :
        print(value)

print_n_times("안녕하세요", 5)

위 코드를 살펴보자면, 함수의 괄호 내부에 value와 n이라는 식별자를 입력했다.

이렇게 입력하면 이는 매개변수가 된다. 이렇게 매개변수를 만들면, 함수를 호출할 때 값을 입력해서 함수쪽으로 전달할 수 있다.

 

위 함수는 함수를 선언할 때의 매개변수와 함수를 호출할 때의 매개변수가 같아야 한다.

그렇지 않으면 함수의 개수나 타입이 다르다고 에러가 난다.

 

위 코드에 value와 n에 "안녕하세요"와 5를 넣었다.

그러면 함수는 받은 매개변수로 지정해놓은 식별자를 호출해 안녕하세요를 5번 실행하는 함수로 구동이 된다.

위와 같은 형식의 코드라 따로 출력결과는 게시하지 않겠다.

 

가변 매개변수

앞에서 살펴본 함수는 함수를 선언할 때의 매개변수와 함수를 호출할 때의 매개변수가 같아야 했다.

적어도 안되고 많아도 안된다.

그러나 우리가 많이 사용하는 print() 함수를 보면 얘는 개수 제한이 없다. 무한대다 무한대.

print() 함수와 같이 원하는 만큼 받을 수 있는 함수를 가변 매개변수라고 부른다.

def 함수이름(매개변수, 매개변수 ... ,*가변 매개변수) :
	문장

가변 매개변수 함수는 위와 같은 구조로 만들어진다.

 

가변 매개변수를 사용하기 위해서는 제약이 존재한다.

  • 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다.
  • 가변 매개변수는 하나만 사용이 가능하다.

위 제약이 빡세다고 느껴질수도 있는데, 이런 제약이 없으면 어디서부터 어디까지

가변 매개변수인지 알수가 없기 때문에 필요한 제약이다.

def print_n_times(n, *values) :
    for i in range(n) :
        for value in values :
            print(value)
        print() # 단순 줄바꿈
    
print_n_times(3, "안녕하세요", "반갑습니다", "즐겁습니다")

# value는 리스트처럼 활용이 된다. 따라서 for 문을 중첩하여 하나씩 출력되게 한다. 

위 코드를 보며 설명하겠다.

아까 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다고 했다. 따라서 함수를 선언할때도 일반 매개변수 식별자를 선언해주고,

그 다음에 가변 매개변수 식별자를 선언해주었다.

가변 매개변수는 리스트처럼 활용이 된다. 따라서 for 문을 중첩해서 출력해주어야 하나씩 출력이 된다.

 

혹시 리스트를 모른다면,

2021.03.12 - [Programming/Python] - 8. 리스트와 반복문

위 글을 보고 오자.

 

다시 코드로 돌아가겠다. 따라서 함수를 실행하면 '안녕하세요' , '반갑습니다', '즐겁습니다' 요 세 문장이 3번씩 차례차례 출력이 된다.

위 코드의 실행결과이다.

 

기본 매개변수

아까 print() 함수 얘기로 돌아가보자.

보통 한줄을 넘길때 print() 함수를 아무런 매개변수 없이 사용한다고 했다.

그런데, 우리가 방금 배운 함수 만들기에서는 매개변수에 무조건 뭔가를 넣어야 돌아가는게 맞다 라는 식으로 배웠는데, 

그럼 우리가 배운게 모두 다 틀린것인가?...는 아니고.

 

매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본값을 설정할 수 있는 것을 기본 매개변수라고 한다.

print() 함수는 아무것도 입력하지 않았을때 한 줄을 넘기는 것을 기본값으로 설정이 되어있는걸 확인할 수 있게 되었다.

 

기본 매개변수에도 사용할 때 제약이 존재한다.

  • 기본 매개변수 뒤에는 일반 매개변수가 올 수 없습니다.
def print_n_times(value, n = 2) :
    for i in range(n) :
        print(value)

print_n_times("안녕하세요") 
# 기본 매개변수에 의해서 매개변수를 입력하지 않았음에도 기본 2가 들어가게 된다. 
# C++ 에서 클래스 생성자에서 사용했던 기본 매개변수 설정과 동일하다.

위 코드를 살펴보자.

코드에 선언한 함수의 식별자를 보면 value와 n 두가지의 식별자가 존재하는데, 함수를 실행할때엔 value의 매개변수만 할당해줬다.

하지만, 함수를 선언할때 n = 2와 같이 기본 매개변수선언해주었기 때문에 n에 대한 매개변수를 넣어주지 않아도 알아서 2를 할당하여 함수를 돌리게 된다.

 

키워드 매개변수

지금까지의 설명을 보면서 가변 매개변수기본 매개변수 둘을 같이 써도 되는것 아냐? 라는 생각을 가질수도 있다.

그럼 한번 같이사용해보자.

 

기본 매개변수가 가변 매개변수보다 앞에 올때

기본 매개변수가 가변 매개변수보다 앞에 올때는 기본 매개변수의 의미가 사라진다.

def print_n_times(n=2, *values) :
	for i in range(n) :
    	for value in values :
        	print(value)
        print()
        
print_n_times("안녕하세요", "반갑습니다", "프로그래밍")

위 코드를 보자.

매개변수가 순서대로 입력되므로 n에는 '안녕하세요', 나머지 가변 매개변수에는 '반갑습니다'와 '프로그래밍'이라는 단어가 들어가게 된다.

그런데 range() 함수의 매개변수는 숫자만 들어갈 수 있으므로 이 코드는 에러를 뿜게된다.

따라서, 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다, 라는 것을 알아두자.

 

가변 매개변수가 기본 매개변수보다 앞에 올 때

그렇다면 반대로 가변 매개변수가 기본 매개변수보다 앞에 올 때는 어떨까?

def print_n_times(*values, n=2) :
	for i in range(n) :
    	for value in values :
        	print(value)
        print()
        
print_n_times("안녕하세요", "반갑습니다", "프로그래밍", 3)

이 또한 가변 매개변수가 우선시 되기 때문에, "안녕하세요", "반갑습니다", "프로그래밍", 3 이 두번 출력되는 참사가 발생한다.

그렇다면 같이 사용하는 방법은 없는 것일까?

그 의문점을 해결하기위해 키워드 매개변수 라는것을 배워보겠다.

 

# 키워드 매개변수
# value를 여러 개 입력할 수 있으므로 가변 매개변수를 앞에 두고, 뒤에 기본 매개변수들이 들어가 있는 형태이다.

def print_n_times(*values, n = 2) :
    for i in range(n) :
        for value in values :
            print(value)
        print()

print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍", n=3)
# 이처럼 매개변수 이름을 지정해서 입력하는 매개변수를 키워드 매개변수라고 부른다.

위 코드를 보면, 만들어진 함수의 매개변수가 총 2개 이다.

그중 앞쪽에는 가변 매개변수이므로 여러개 입력할 수 있기 때문에 가변 매개변수를 앞에 두고, 뒤에 기본 매개변수들이 들어가 있는 형태다.

 

그리고 함수를 실행할때 사용하는 매개변수들에 가변 매개변수말고 기본 매개변수의 이름을 직접 지정해서 값을 입력한다.

위 코드의 실행결과이다.

그렇게 하면, 아까 "안녕하세요", "반갑습니다", "프로그래밍", 3이 두번 출력되던 참사를 막을 수 있게 된다.

이처럼 매개변수 이름을 지정해서 입력하는 매개변수를 키워드 매개변수라고 한다.

 

기본 매개변수 중에서 필요한 값만 입력하기

키워드 매개변수는 기본 매개변수들로 구성된 함수에서도 많이 사용한다.

# 기본 매개변수 중에서 필요한 값만 입력하기
# 여러 함수 호출 형태

def test(a, b=10, c=100) :
    print(a+b+c)
    
    
# 기본형태
test(10,20,30)

# 키워드 매개변수로 모든 매개변수를 지정한 형태
test(a=10, b=100, c=200)

# 키워드 매개변수로 모든 매개변수를 마구잡이로 지정한 형태
test(c=20,a=200,b=200)

# 키워드 매개변수로 일부 매개변수만 지정한 형태
test(10, c=200)

위 코드를 보면, test() 함수에 a,b,c라는 식별자들이 존재하고 그 합을 출력하는 함수인듯하다.

기본 형태는 모든 식별자에 매개변수들을 삽입한 형태이다.

두번째 형태는 키워드 매개변수로 모든 매개변수를 지정한 형태이다.

세번째 형태는 키워드 매개변수로 모든 매개변수들을 마구잡이로 지정한 형태이다.

이게 얼마나 편한것이나면, 기존 C++에서 사용하는 매개변수들을 보면, 각각 내가 원하는 곳에 삽입을하려면 선언부터 구현까지 모든 매개변수가 딱딱 맞아야 실행이 되고, 제대로 구동이 된다.

하지만 파이썬은 아무런 위치에서 키워드 매개변수를 이용하여 내가 원하는 곳에 원하는 값을 입력할 수 있다.

마지막 형태는 키워드 매개변수로 일부 매개변수만 지정한 형태이다.

위 코드의 출력결과이다.

따라서 이렇게 다양하게 실행이 가능하다. 

 

리턴

함수 내부에서는 return 이라는 키워드를 사용할 수 있다. 

이 키워드는 함수를 실행했던 위치로 돌아가라는 뜻으로, 함수가 끝나는 위치를 의미한다.

def return_test() :
    print("A 위치입니다.")
    return
    print("B 위치입니다.")
    
return_test()

위 코드를 보면, return_test() 라는 함수는 'A 위치입니다.'와 'B 위치입니다'를 출력하는 함수이다.

하지만 중간에 return 이 있기 때문에 이 함수의 결과는 'A 위치입니다'라는 문구만 출력하고 빠져나올 것 이다.

위 코드의 출력결과이다.

이렇듯 어느곳에서 이 함수를 끝내고 싶다라는 의미를 가지게 하려면 return 이라는 키워드를 사용하면 된다.

 

자료와 함께 리턴하기

첫 코드는 자료가 없이 리턴을 한 코드이다.

이번에는 자료가 있는 리턴을 해보겠다.

def return_test() :
    return 100

value = return_test()

print(value)

위 코드를 보면, return 뒤에 100이라는 숫자가 입력된 코드이다.

함수의 실행결과로 100이 출력되는것을 확인할 수 있다.

위 코드의 출력결과이다.

아무것도 리턴하지 않기

아무것도 리턴하지 않으면 어떻게 될까?

# 아무것도 리턴하지 않았을때의 리턴값
def return_test() :
    return

value = return_test()

print(value)

# None을 출력한다.
# None은 파이썬에서 '없다'라는 의미이다.

이렇게 아무것도 출력하지 않는 코드를 작성하면 print()는 None을 리턴하게 된다.

파이썬에서 None은 '없다'라는 의미이기 때문이다.

위 코드의 출력결과이다.

 

기본적인 함수의 활용

자, 기본적인 함수 사용방법을 끝내보았다.

그럼이제 이 함수들을 활용하는 예를 몇가지 보고 끝내보겠다.

# 범위 내부의 정수를 모두 더하는 함수
def sum_all(start, end) :
    output = 0
    for i in range(start,end) :
        output += i
    return output

print("0 to 100", sum_all(0,100))
print("0 to 1000", sum_all(0,1000))
print("50 to 100", sum_all(50,100))
print("500 to 1000", sum_all(500, 1000))

위 코드는 sum_all()이라는 함수이고, 범위 내부의 정수를 모두 더하는 함수이다.

함수의 식별자는 start, end 두개가 존재하고, 순차적으로 더하고 return 값으로 모두 더한값을 리턴하게 된다.

위 코드의 출력결과이다.

따라서 매개변수에 내가 원하는 숫자들을 넣게 되면, 그 숫자들의 합을 구해주게 된다.

 

다른 것도 해보겠다.

# 기본 매개변수와 키워드 매개변수를 활용해 범위의 정수를 더하는 함수
def sum_all(start = 0, end = 100, step = 1) :
    output = 0
    for i in range(start,end + 1, step) :
        output += i
    return output

print("A. ", sum_all(0,100,10))
print("B. ", sum_all(end = 100))
print("C. ", sum_all(end = 100, step = 2))

위 코드는 기본 매개변수와 키워드 매개변수를 활용해 범위의 정수를 더하는 함수이다.

위 코드의 출력결과이다.

A는 0부터 100까지 10씩 띄어서 합하는 출력결과를 원했고,

B는 0부터 100까지 1씩 합하는 출력결과를 원했고,

C는 0부터 100까지 2씩 띄어서 합하는 출력결과를 원했다.

각기 다른 매개변수 사용으로, 기본 매개변수와 키워드 매개변수를 적절히 사용하였다.

 

정리
호출
은 함수를 실행하는 행위를 말한다.
매개변수는 함수의 괄호 내부에 넣는 것을 의미한다.
리턴값은 함수의 최종적인 결과를 의미한다.
가변 매개변수 함수는 매개변수를 원하는 만큼 받을 수 있는 함수이다.
기본 매개변수는 매개변수에 아무것도 넣지 않아도 들어가는 값이다.
728x90

댓글

IT_learning's Commit