<개인공부>/[Python]

[python] 파이썬 함수 정리와 예제 (def)

BlockDMask 2020. 11. 8. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 파이썬에서 함수에 대해서 알아보려 합니다.
함수라는거에 대해서 어디서 부터 설명해야할지 고민이 많았습니다.
최선을 다해서 차근차근 설명해 보겠습니다.

<목차>
1. 함수란?
2. 다양한 함수의 모양 (입력값, 반환값이 있고 없고)
3. 함수를 사용하는 이유 (간단한 예제)
4. 함수 응용편 (디폴트 매개변수, 매개변수 N개)


1. 파이썬 함수란 무엇인가.


  입력값에 따라 결과가 다를수는 있지만 로직 자체는 같은 경우에 하나의 포장지 안에 넣어서 계속 재사용할 수 있게 만들어 놓은것을 함수라 합니다

  그렇기 때문에 하나의 로직을 비효율적으로(?) 복붙하여 계속 쓰지 않고, 함수로 묶어서 관리하게 되면 좀더 편리하게 사용할 수 있습니다. 그렇기 때문에 함수를 사용하는 것 입니다.

자동차도 그래요. 자동차를 만든다고할때 공장에서 바퀴 담당하는 부분이 있는데 그 바퀴를 일일히 하나하나 앞바퀴 왼쪽 오른쪽, 뒷바퀴 왼쪽 오른쪽을 하나씩 각자 만든다고 할때 얼마나 비효율적일까요?

이걸 공장에서 자동화해서 하나의 기계에서 똑같은 바퀴를 4개 뽑아내잖아요. 그게 함수와 동일한것 입니다. 자동화한 기계. 즉 똑같은 결과물을 내는 기계가 함수라 할수 있고, 바퀴는 그 반환값이라 할 수 있습니다. 만약에 그 기계에서 바퀴의 크기 (몇인치)를 입력해서 하나의 기계에서 다른 사이즈의 바퀴도 만들 수 있다면 그건 매개변수가 있는 함수라고도 할 수 있습니다.

파이썬에서 함수를 알려주기 위해서는 def 라는 키워드를 사용합니다. def를 사용하면 파이썬이 "아 이제 함수를 정의하겠구나"하고 인식하게 됩니다.
그리고 함수에는 입력값이 있고 출력값이 있는데요.
이거는 위에서 말했듯이 자동차 바퀴 몇인치를 원하는가? 이게 입력값이 되고, 그 입력값에 따라서 딱 맞게 바퀴가 나오는걸 출력값이라 합니다.
함수에 따라서 입력값이 있는 함수도 있고, 출력값이 있는 함수도 있으며, 둘다 있거나 둘다 없는 함수도 있습니다.


2. 파이썬에서 다양한 함수의 모양에 대해서


입력도 없고 반환값도 없는 함수

def 함수명() :
   수행문장
   ...

이런식으로 def뒤에 함수명이 오고, 소괄호 ()를 붙인 다음 콜론(:)을 붙여줍니다.
그 다음에 원하는 문장을 함수 아래에 들여쓰기 하여서 사용하면 됩니다.
예제로 한번 볼까요?

1
2
def func1():
    print('BlockDMask')
cs

이런식으로 func1이라는 함수를 정의 하였습니다. 함수를 정의만 한다고 사용되지 않습니다.
함수를 한번 사용해볼까요? 아, 코드에서 함수를 사용한다는 것은 함수를 호출한다고 합니다. 그럼 함수를 한번 호출해볼까요?
함수를 호출하는 방법은 함수의 이름과 () 소괄호까지 입력을 하면 호출이 됩니다.
이왕 함수를 만들어본거 한 세번정도 호출해 보겠습니다.

1
2
3
4
5
6
7
def func1():
    print('BlockDMask')
 
# 함수 호출
func1()
func1()
func1()
cs

이런식으로 작성을 하면 함수가 호출되면서 함수 내부의 로직이 작동하게 됩니다.
우리는 func1이라는 함수 내부에 print("BlockDMask")라는 명령을 집어 넣음으로써 함수가 호출될때 마다 "BlockDMask"라는 문자열이 출력되도록 하였습니다. 어디 결과값을 한번 볼까요?


이렇게 해서 결과값을 볼 수 있습니다.
만약에 함수가 아니고 비효율적(?)으로 똑같은걸 반복한다 한다면 print(" ")를 3번 반복해서 작성해야합니다.
지금정도야 한줄이니 괜찮지만 함수 내부 로직이 여러줄이고 복잡하게 된다면, 그걸 일일히 N번 반복해서 작성한다 한다면 가독성은 물론이고 코드가 정말 난잡해 질것 입니다.


입력만 있는 함수

입력이라는게 아까 예시를 들은 바퀴의 몇인치? 인거라 생각하면됩니다.
파이썬에서 함수의 입력값을 매개변수 혹은 인수라고 부릅니다. 면밀히 말하면 다른 용어이지만, 뜻이 거의 통하므로 동일하다고 봐도 무방합니다. 하지만 면접같은데서 물어본다면 구분해서 답변할 수 있으면 좋겠죠?

매개변수와 인수가 무엇인가를 설명하기 전에 입력이 있는 함수의 모양을 먼저 보겠습니다.

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

이런식으로 괄호 안에 매개변수라는게 생겼습니다. 이게 우리가 함수를 호출할때 특정 값을 넣어주기 위해서 통로를 뚫은거라고 생각하면 좋겠습니다.
이렇게 함수를 정의했을때 함수 이름 옆에 있는 변수들을 매개변수라 부릅니다.
일단 예시를 한번 볼까요?

1
2
3
4
5
6
7
def func2(a, b):
    print(f'{a} 곱하기 {b} = {a * b}')
 
func2(12)
func2(13)
func2(24)
 
cs

짠, 이렇게 함수의 이름옆에 매개변수를 두개 정의하였습니다.
이 매개변수를 이용해서 함수 내부에서 자유롭게 로직을 만들 수 있습니다.
그리고 호출부를 보면 func2( ) 괄호 안에 1, 2 이렇게 값들을 집어 넣은것을 볼 수 있습니다.
우리가 정의한 함수 모양에 맞게 변수를 두개 넣어준것인데 이때 이 변수들을 인수라고 부릅니다.

매개변수가 2개인 함수를 정의했고
그 함수를 호출할때는 인수, 인자값 2개를 넣어서 함수를 호출하여 함수가 잘 작동하는 것을 볼 수 있습니다.

매개변수는 1개부터 시작해서 N개 까지 정의해서 본인 입맛에 맞게 함수를 정의하면 됩니다.


반환값만 있는 함수

이번에는 값을 뱉는 함수 즉 반환 값이 있는 함수에 대해서 알아보려합니다.
함수를 호출하면 함수 내부에서 어떤 로직을 돌아서 그 결과값을 함수 밖으로 보내주는걸 반환 값이라 하는데요. 모양은 아래와 같습니다.

def 함수이름():
    수행문장
    return 반환값

이처럼 return 을 작성하고 그 뒤에 함수 밖으로 보낼 반환값을 적습니다. 바로 예제로 이해해볼까요?

1
2
3
4
5
6
7
def func3():
    return "abcdefg"
 
 
= func3()
print(a + "GG")
 
cs

이렇게 return 뒤에 반환하고자 하는 값을 넣으면 함수 밖에서 값을 받아서 사용할 수 있습니다.
func3() 함수를 호출하고 그 앞에 = 을 통해서 변수를 선언하여 그 변수에 반환값을 받는것 입니다. 그러면 우리는 그 변수 a를 통해서 func3()의 반환 값을 이용할 수 있습니다.


입력, 반환값이 둘다 있는 함수

위에서 매개변수, 반환값 둘다 배웠죠? 그 두개가 함께 있는 경우입니다. 제일 흔하게 볼 수 있는 함수의 모양입니다.

def 함수이름(매개변수1, 매개변수2 ...):
    수행문장
    return 반환값

바로 예제로 들어가 보겠습니다.
곱셈을 해주는 함수를 만들어보겠습니다.

1
2
3
4
5
6
7
def func4(a, b):
    return a * b
 
 
= func4(39)
print(c)
 
cs

매개변수를 2개를 받아서 그 매개변수를 곱한 값을 반환해주는 함수 func4를 만들었습니다.
함수를 호출할때 매개변수를 집어넣고 그 반환값을 받을 변수까지 만들어 두면 완벽하게 함수를 사용할 수 있습니다.
그럼 3, 9를 인자로 집어 넣었으니 반환값은 3 * 9인 27을 반환할 것 입니다.


3. 파이썬 함수 예제


구구단. 함수를 사용하지 않았을 때

1
2
3
4
5
6
7
8
9
10
11
12
# 구구단 no 함수 버전
 
# 구구단 출력
for i in range(110):
    print(f'{2} x {i} = {2 * i}')
for i in range(110):
    print(f'{3} x {i} = {3 * i}')
 
# ...
for i in range(110):
    print(f'{9} x {i} = {9 * i}')ㅁ
 
cs

구구단. 함수를 사용할때

1
2
3
4
5
6
7
8
9
10
11
# 구구단 함수 버전
def gugudan(num):
    for i in range(110):
        print(f'{num} x {i} = {num * i}')
 
# 구구단 출력
gugudan(2)
gugudan(3)
# ...
gugudan(9)
 
cs

이처럼 매개변수(인자)만 변경하면 똑같이 행동하는 로직을 함수로 묶어버리면 코드가 훨씬 깔끔해 질 수 있고, 우리는 같은 코드를 작성하지 않아도 됩니다.
비슷한 행위, 같은 행위가 반복된다면 함수로 만들어서 편리하게 사용해 보세요.


4. 파이썬 함수 응용 (디폴트 매개변수, 매개변수 N개, 튜플 반환)


디폴트 매개변수

우리가 함수에서 매개변수를 정의할때 그 매개변수의 디폴트값 즉 기본값을 지정해 줄수 있습니다. 그러면 우리는 그 매개변수를 사용하지 않을때. 그 디폴트 값이 해당 변수에 들어가서 함수 내부에서 사용이 됩니다. 

def 함수이름 (매개변수1, 매개변수2 = A, 매개변수3 = B):
    수행문장
    return 반환값 

당연한 이야기지만 return 반환값은 없어도 무방합니다. 매개변수의 개수도 상관없는거 이제는 이해하시겠죠?
위 매개변수를 보면 매개변수를 선언하는곳에 " = A " 이렇게 값이 지정되어있습니다. 이거는 매개변수 2가 들어오지 않으면 함수자체 내부에서 A라는 값으로 지정해서 사용하겠다는 뜻입니다. 매개변수 3번도 마찬가지 입니다.

주의할점은 제가 일부로 저 함수의 모양을 매개변수2, 3에만 디폴트 매개변수를 선언했는데요. 그 이유는 디폴트 매개변수는 뒤에서부터 선언해야 가능하기 때문입니다. 그게 무슨말인가 하면
def 함수이름 (매개변수1 = C, 매개변수2, 매개변수3) 이렇게 뒤에있는 매개변수 2,3번을 디폴트 매개변수로 지정해주지 않고 건너뛰어서 매개변수1만 디폴트로 지정해주는것은 불가능 하다는 것 입니다.

이게 왜 불가능한지는 함수 예제를 통해서 보여드리겠습니다.
아마 보시면 "아~ 컴퓨터도 무슨 매개변수를 말하는건지 헷갈리겠구나 "

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 디폴트 파라미터 예제 1
def func1(a, b=5, c=10):
    return a + b + c
 
 
func1(123)  # 1 + 2 + 3
func1(12)  # 1 + 2 + 10
func1(1)  # 1 + 5 + 10
# func1() error
 
 
# 디폴트 파라미터 예제 2
def func2(a=10, b=20):
    return a + b
 
 
func2(12)  # 1 + 2
func2(1)  # 1 + 20
func2()  # 10 + 20
 
 
# 아래는 잘못된 디폴트 파라미터
# 디폴트 파라미터는 뒤에서 부터 해야한다.
# 그래야 인수가 비었을때 판단이 가능.
def func3(a = 10, b, c): # error
    return a + b + c
 
func3(12)    # 1이 a이고 2가 b에 들어가는거겠지? 
               # 뭘 원하는거야? error
func3( , 12# 뭐 이렇게 호출해야하나? error
 
cs

예제 1이랑 2를 보면 디폴트 파라미터가 있으면 인수를 생략해도 함수가 잘 작동하는것을 볼 수 있습니다.

하지만 예제 3번을 보면 디폴트 파라미터를 뒤에서부터 설정하지 않고 뒤에 비어있고, 앞에 존재한다면. 이는 오류 입니다. 우리가 함수를 호출할때는 ( ) 괄호안에 인자를 순서대로 넣게 되는데, 디폴트 파라미터로 선언했다 해서 비어서 넣는다는것은 불가능합니다. 그렇기 때문에 디폴트 파라미터는 뒤에서부터 선언해야합니다.


매개변수 N개

매개변수라는게 함수를 정의할때 ( ) 괄호 안에 들어갈 변수들인데, 두개면 두개 세개면 세개 이렇게 매개변수의 개수를 딱 알면 좋은데, 이 입력하는 매개변수가 몇개가 될지 모르는 경우에는 어떻게 해야할지 감이 오시나요?

파이썬에서는 이런 경우를 대비해서 몇개가 오든 상관없으니 매개변수로 넘길 수 있는 방법을 만들어놓았습니다.

이런걸 다른언어에서는 인자의 개수가 변한다 하여, 가변인자라고도 하는데. 파이썬에서는 따로 명칭이 없는거같으니 여러개의 입력값 즉 N개의 입력값을 받는 함수라 하겠습니다. 모양은 아래와 같습니다.

def 함수이름 (*매개변수):
    수행문장
    return 반환값

당연하게도 본인이 만들 함수 의도에 따라서 "return 반환값"이 없어도 상관없습니다.
중요하게 볼것은 *매개변수 이것입니다.
예제로 한번 보겠습니다.
아래 예제는 매개변수로 넘어온 값들을 모두 더한 값을 반환하는 함수 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def func6(*args):
    a = 0
    for i in args:
        a = a + i
    return a
 
 
= func6(12)
print(b)
 
= func6(2345)
print(c)
 
= func6(123454321)
print(d)
 
= func6()
print(e)
 
cs

이렇게 매개변수에 *args를 선언하면 함수를 호출할때 인자의 개수가 0개여도, 2개여도 4개여도 N개여도 상관없이 함수에서 다 받을 수 있습니다.
이게 어떻게 가능하냐면 *매개변수로 넘어온걸 파이썬은 그걸 튜플 타입으로 변환하여서 함수 내부에 전달해줍니다. 그럼 튜플 타입을 이용하는 방법을 통해서 우리는 내부 로직을 구현할 수 있는 것 입니다.
args는 아규먼트(arguments)의 축약어 이며, 보통 이렇게 N개의 매개변수를 표현할때 args를 사용합니다.


이상으로 오늘은 파이썬 함수 def에 대해서 포스팅 완료하였습니다. 감사합니다.

반응형