파이썬 독학/입문 강의

[파이썬독학강의] 14. 파이썬 함수(function)

데니 by danny 2023. 4. 14. 00:52
반응형

파이썬 함수(function)
파이썬 함수(function)

 

님들 안녕하세요. 14년 차 IT 개발자 데니예요. 이번 시간에는 파이썬 함수(function)에 대해서 학습해 볼게요. 함수라는 용어는 수학시간에 많이 접해보셨을 거예요. 저는 님들께 파이썬 함수 설명을 위해서 수학 시간에 배운 함수의 개념을 되짚어 드리고 싶지는 않아요.  학교에서 배우셨던 수학적 함수는 잠시 잊어주시고 파이썬 함수 학습에 들어가시는 게 큰 도움이 될 거라 생각해요. 자 이번 시간 함수에 대한 강의 시작해 볼게요.

 

 

14. 파이썬 함수(function)

 

  ▶ 함수란 무엇인가?

프로그래밍 언어에서 함수0~n개의 입력 값을 받아서 어떤 일을 수행한 다음 그 결과인 리턴 값을 반환하는 기능을 해요. 쉽게 말씀드리면 프로그램 속에서 작은 역할을 하는 프로그램이라고 생각하시면 돼요.  함수 사용의 장점은 반복 사용하는 코드를 하나의 함수로 정의하여 필요할 때마다 호출하여 재사용할 수 있어요.  단 1번 사용되는 소스 코드를 함수로 만들 필요는 없어요. 적어도 2번 이상 사용되는 소스 코드인 경우 함수로 만들어 사용한다면 프로그램이 좀 더 체계적이고 효율적으로 관리될 수 있어요. 프로그램은 한 번 만들면 끝이 아니라 계속해서 유지 보수를 해야 하므로 최초 개발자가 아닌 다른 개발자가 해당 소스 코드를 봤을 때 가독성 높고 수정하기 쉽게 관리하기 위해서라도 동일 소스 코드를 반복적으로 사용하시는 건 지양하시고 함수를 만들어 사용하셔야 해요.

 

함수 동작 방법
함수 동작 방법

 

위 그림은 함수의 동작 방법에 대한 쉬운 이해를 위하여 나무와 철을 사용하여 삽을 만드는 방법을 함수로 추상화시켜 표현해 봤어요.  해당 함수는 삽을 만들기 위한 재료로 나무와 철만을 입력받아요. 두 가지 재료 중 하나라도 입력이 되지 않으면 오류가 발생하는 함수예요. 삽 제조 공장에서 일어나는 일을 가상하여 위 함수의 작동 방법을 설명해 드릴게요. 건설 장비 제조 공장에서 사장이 삽을 만드는 직원을 불러서 철과 나무인 두 재료를 모두 직원에게 전달하면 직원은 철로 삽 머리와 손잡이를 만들고, 나무로 삽자루를 만들 거예요. 그리고 그것들을 최종 조립하여 완성된 삽을 사장에게 리턴해줄 거예요.

여기서 [건설 장비 제조 공장]은 프로그램, [사장]은 함수를 호출한 곳, [직원]은 함수, [철과 나무]는 입력 값, [삽]은 리턴 값이라고 할 수 있어요.

 

*함수 동작 방법 요약*

1. 함수 작동이 필요한 곳에서 함수 이름과 괄호 안에 입력 값을 넣고 호출한다.

2. 함수가 호출되어 작동한다.

3. 작동이 완료되면 호출한 곳으로  결과 값을 리턴한다.

 

 

  ▶ 파이썬 함수의 구조

 

파이썬 함수 구조
파이썬 함수 구조

 

위 그림은 파이썬 함수 구조예요. 함수를 정의하기 위해서는 위 구조에 따라 작성해야 해요. def는 파이썬 예약어로 함수를 만들 때 반드시 def를 써야 파이썬이 함수에 대한 정의로 인식할 수 있어요. 함수 이름은 함수의 기능과 역할에 맞게 잘 지어줘야 해요. (매개변수)는 함수에 전달되는 입력 값이에요. 입력 값을 전달받아 함수를 작동시키려면 꼭 매개변수를 정의해야 해요. 입력 값이 필요하지 않은 함수인 경우 매개 변수를 정의하지 않고 () 괄호만 코딩하시면 돼요. if문, while문, for문을 정의할 때와 마찬가지로 마지막에 : 콜론을 반드시 입력해줘야 해요. 다음 줄에는 함수가 호출되고 나서 수행할 문장을 정의해 주시면 돼요. 마지막으로 수행할 문장이 종료되고 호출되었던 곳으로 전달할 결과 값을 return 결괏값으로 코딩하여 마무리해 주시면 함수에 대한 정의가 끝나요.

 

처음 파이썬 함수에 대해서 설명드릴 때 건설 장비 제조 공장에서 삽을 만드는 과정을 추상화하여 설명드렸어요. 아래처럼 함수 소스코드로 직접 작성해 봤어요. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def make_shovel(steel, wood):
...     print(f'{steel}로 삽머리와 손잡이를 만들었어요.')
...     print(f'{wood}로 삽자루를 만들었어요.')
...     print('삽머리, 손잡이, 삽자루를 조집해서 삽을 완성했어요.')
...     return '삽'
...
>>> shovel = make_shovel('철''나무')
철로 삽머리와 손잡이를 만들었어요.
나무로 삽자루를 만들었어요.
삽머리, 손잡이, 삽자루를 조립해서 삽을 완성했어요.
>>> print(shovel)
>>>
cs

 

라인[1] 함수이름은 make_shovel이고, 매개 변수는 2개 steel과 wood로 함수를 정의했어요.

라인[2]~[4] 함수 내부에서 수행할 내용이에요. 삽을 만드는 과정을 print함수를 사용해서 출력해 주도록 만들었어요.

라인[5] 함수 정의 마지막 부분이에요. 함수 내부에서 수행할 문장이 모두 수행되고 나서 함수를 호출했던 곳에 결과 값을 반환하기 위해서 return을 사용했어요. 여기선 완성된 '삽'을 리턴해요.

라인[7] make_shovel 함수에 인수로 '철'과 '나무'를 전달하여 함수를 호출했어요.

라인[8]~[10] 함수 내부에서 수행해야 할 문장이 수행되었어요.

라인[11] 라인[7]에서 함수 결과 값을 리턴 받아 shovel에 대입해 두었어요. shovel 변수를 출력하니 삽이 출력되었어요. 함수가 정상적으로 작동되었다는 걸 확인할 수 있어요.

 

조금 더 파이썬 프로그래밍에 적합하게  함수를 정의하여 사용해 볼게요. 인수로 2개의 숫자를 입력받아서 더한 결과 값을 리턴하는 함수예요.

 

1
2
3
4
5
6
7
8
9
10
11
>>> def add(a, b):
...     result = a + b
...     return result
...
>>> c = add(1020)
>>> print(c)
30
>>> d = add(1121)
>>> print(d)
32
>>>
cs

 

라인[1] 함수명은 add로 매개변수는 2개 a, b로 정의했어요.

라인[2] 매개 변수 a와 b를 더해서 함수 내에서만 사용 가능한 지역 변수 result에 대입했어요. result는 함수 호출이 종료되면 사라지는 변수이므로 함수 밖에서는 사용할 수 없어요.

라인[3] result 변수 값을 return을 이용하여 함수를 호출한 곳으로 반환했어요.

라인[5] add함수를 호출했어요. 인수로 10과 20을 전달했어요. 따라서 add 함수가 작동하고 그 결과 값을  호출한 곳인 라인[8]로 리턴할 거예요. 리턴한 값은 라인[8]에서 선언한 c 변수에 저장될 거예요.

라인[6]~[7] 변수 c를 출력했더니 숫자 30이 출력되었어요. 함수 호출 시 인수로 전달한 10과 20이 함수 내부에서 더해져 결과 값 30이 되었고, 그 결과 값을 리턴 받아서 c에 대입했으므로 30이 출력되는 건 당연한 결과예요.

라인[8]~[10] 인수로 11과 21을 add함수에 전달하여 함수를 호출했어요. 함수가 작동되었고, 결과 값을 리턴 받아 변수 d에 저장했어요. d 변수를 출력하니 숫자 32가 출력되었어요. 11 + 21 = 32이므로 함수가 잘 작동했다는 걸 확인할 수 있어요.

 

아래 그림은 함수를 사용할 때 혼동될 수 있는 매개 변수와 인수에 대한 설명이에요.

def aaa(val1, val2): 으로 함수를 정의한 경우 val1과 val2는 매개 변수라는 용어를 사용해요. 해당 함수를 호출할 때 aaa(10, 20)을 사용했다면 10과 20은 인수라는 용어를 사용해요. 함수로 인수로 10과 20을 전달했다고 인수라는 용어를 사용해서 표현할 수 있어요. 

 

파이썬 함수 혼동 용어 설명
파이썬 함수 혼동 용어 설명

 

 

  ▶ 파이썬 함수의 형태

 

 파이썬 함수는 다양한 형태로 정의할 수 있지만, 보통 프로그램의 효율성과 소스 코드 가독성을 높이기 위해 사용되는 형태가 정해져 있어요.  여기서는 ①매개 변수(입력 값)가 없는 함수, ②결과 값(리턴 값)이 없는 함수, ③매개 변수와 결과 값이 모두 없는 함수, ④매개 변수 개수가 가변적인 함수로 4가지 파이썬 함수의 형태에 대해서 실습해 볼게요.

 

 

①매개 변수(입력 값)가 없는 함수

 

1
2
3
4
5
6
7
8
9
10
11
>>> def say_hello():
...    return 'Hello~!'
...
>>> say_hello(1)
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: say_hello() takes 0 positional arguments but 1 was given
>>>
>>> print(say_hello())
Hello~!
>>>
cs

 

라인[1]~[2] 매개 변수가 없고, 'Hello~!' 문자열을 반환하는 함수를 정의했어요.

라인[4]~[7] say_hello 함수에 인수로 1을 전달하여 호출했더니 오류가 발생했어요. 매개 변수가 없는 함수이므로 인수로 1을 전달할 수 없다는 오류예요.

라인[9] 전달 인수 없이 say_hello 함수를 호출했어요. 문자열 Hello~! 을 리턴 받았어요.

 

 

②결과 값(리턴 값)이 없는 함수

 

1
2
3
4
5
6
7
>>> def print_add(a, b):
...     print(f'{a} + {b} = {a+b}')
...
>>> c = print_add(1020)
10 + 20 = 30
>>> c
>>>
cs

 

라인[1] 매개 변수 a와 b를 가진 print_add 함수를 정의했어요.

라인[2] 예약어인 return이 없으므로 이 함수는 값을 리턴하지 않아요. 대신 print함수를 사용해서 문자열을 출력해 줘요.

라인[4] print_add함수에 인수 10과 20을 전달하여 함수를 호출했어요. 문자열 10 + 20 = 30이 출력되었어요.

라인[5] 해당 함수는 결과 값이 없으며 결과 값을 반환하지도 않으므로 변수 c에는 아무 값도 들어가 있지 않아요.

 

 

③매개 변수와 결과 값이 모두 없는 함수

 

1
2
3
4
5
6
>>> def print_hello():
...     print('Hello')
...
>>> print_hello()
Hello
>>>
cs

 

라인[1] 매개 변수가 없는 print_hello함수를 정의했어요.

라인[2] return 예약어가 없으므로 이 함수는 결과 값을 리턴하지 않아요. 대신 문자열 Hello를 출력해 줘요.

라인[4]~[5] 인수를 전달하지 않고 print_hello 함수를 호출했어요. 문자열 Hello가 출력되었어요.

 

 

④매개 변수 개수가 가변적인 함수

 

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def loop_add(*arg):
...     result = 0
...     for num in arg:
...         result += num
...     return result
...
>>> val1 = loop_add(123)
>>> val1
6
>>> val2 = loop_add(12345678910)
>>> val2
55
>>>
cs

 

라인[1]~[5] 매개 변수에 값을 전달받아서 모든 값을 더하고 그 결과를 리턴하는 함수예요. 이 함수 정의에서 주의 깊게 보셔야 하는 부분은 매개 변수예요. 매개 변수에 *가 붙어 있어요. 매개 변수에 *가 1개 붙어 있다면 여러 개의 값을 인수로 전달할 수 있고 그 값들은 튜플 자료형에 넣어서 전달돼요.

라인[7]~[9] loop_add함수에 숫자 1, 2, 3을 인수로 넣어서 전달했어요. 튜플 자료형으로 묶인 형태인  (1, 2, 3)으로  인수 값이 함수에 전달되고 결과 값으로 6을 리턴 받았어요. 1, 2, 3을 모두 더하면 6이 나오므로 함수가 정상적으로 동작했어요.

라인[10]~[12] loop_add함수에 정수 1부터 10까지 값을 인수로 넣어 전달했어요. 역시 튜플 자료형으로 전달되었을 거예요.  결과 값으로 55를 리턴 받았어요.

 

1
2
3
4
5
6
>>> def kw_args(**kwargs):
...    print(kwargs)
...
>>> kw_args(a=10, b=20)
{'a':10'b':20}
>>>
cs

 

라인[1]~[2] 해당 함수의 매개 변수에 *가 2개 붙어 **kwargs로 표현되어 있어요.  *가 2개인 경우 즉 **인 경우 매개 변수는 딕셔너리가 돼요. 

라인[4]~[5] a=10, b=20 형태로 인수를 전달하여 함수를 호출했어요. key=value 형태의 인자 값이 key:value쌍의 딕셔너리가 되므로 함수 호출로 출력되는 값은 딕셔너리인 {'a':10, 'b':20}가 정상적으로 출력되었어요.

 

 

  ▶ 파이썬 lambda

 

파이썬 람다(lambda) 함수는 일회성으로 사용할 아주 가벼운 함수를 간단하게 만들어 주는 함수예요.  lambda 함수는 이름이 없는 함수이며, 한 줄로 작성할 수 있어요. 람다 함수는 다음과 같은 형식으로 작성돼요. 

lambda 함수 표현식
lambda 함수 표현식

 

1
2
3
4
>>> mul = lambda x, y : x*y
>>> mul(1020)
200
>>>
cs

 

라인[1] mul 변수에 람다(lambda) 함수를 대입했어요. 해당 람다 함수는 매개 변수 x, y를 곱하여 결과를 반환하는 함수예요.

라인[2] ~[3] mul 함수에 인자 10과 20을 전달하여 호출했어요. 결과 값 200을 반환받았어요.

이처럼 람다 함수는 간단하고 빠르게 함수를 작성하고 호출할 수 있으며, 특히 작고 가벼운 함수를 만들 때 유용해요.

 

님들 오늘은 파이썬 함수에 대해서 학습해 보았어요. 함수를 배운 님들은 이제 파이썬 프로그램을 더욱더 효율적으로 개발하 실 수 있고, 가독성 높은 소스 코드를 생산해 낼 수 있으세요. 함수가 없었다면 동일한 로직을 계속 복사 붙여 넣기 해야 했을 거예요. 이렇게 복붙 한 로직을 수정해야 하는 경우에는 일일이 찾아서 하나하나 수정해야 하는 단순 반복적인 작업을 하다가 결국 지쳤을 거예요. 하지만 님들은 함수를 마스터하셨으므로 잘 정의해 놓은 함수를 가지고 필요할 때마다 호출해서 사용하시면 되고, 소스 코드 수정이 필요하다면 함수 정의 부분만 수정한다면 다른 로직은 수정할 필요가 없으시므로 소중한 시간과 노동력을 절약하실 수 있어요. 앞으로 꼭 함수를 사용해서 프로그래밍해 보시길 바랄게요. 오늘도 너무 고생하셨어요. 감사해요~~!

반응형