코린이의 소소한 공부노트

함수를 이해하고 활용해보기 본문

Python

함수를 이해하고 활용해보기

무지맘 2021. 5. 27. 15:10

수학에서 말하는 함수란 두 집합 X, Y가 있을 때, X의 한 원소가 Y의 한 원소에 대응될 때 그 관계를 말한다.

이와 비슷하게 프로그래밍에서의 함수란 주어진 입력(input)을 미리 지정해둔 방법으로 계산해서 출력(output)을 전달하는 것을 말한다. 우리가 지금까지 봤던 함수들을 몇 가지만 살펴본다면 다음과 같다.

함수 입력 출력   함수 입력 출력
sum 숫자 컬렉션 모든 수의 합   len iterable 객체 객체의 길이
range 정수 정수 리스트   get key value
list iterable 객체 리스트 등등..      

이렇게 이미 파이썬 내부에 구현되어있는 함수들을 내장함수(built-in function)라고 한다.

a = [1, 2, 3, 4]
print(len(a))
>> 4

print(sum(a))
>> 10

그럼 내장함수만 사용이 가능하냐? 그건 아니다. 내가 직접 함수를 만들 수 있다.

이번 글에서는

1. 무엇을 가지고 어떻게 함수를 만드는지

2. 함수를 어떻게 사용하는지

3. 함수의 인자에는 무엇이 있는지

4. 변수들은 어느 범위에서 자기 값이 의미가 있는지 알아보려고 한다.


1. 함수의 구성요소와 정의


앞서 말했듯이 함수는 input을 받아 처리를 해서 output을 넘겨주는 도구이다. 그렇다면 함수를 만들 때 필요한 것은 크게 4가지이다.

1) 함수 이름 function name

 - 값을 처리하려면 일단 함수를 불러와야 하니까 이름이 필요하다.

 - 이름은 a, b, c, ... 이런 것보다 함수의 기능을 잘 나타내 줄 수 있는 이름을 지어주는 게 좋다.

    예시) get_a (X), get_id (O)

2) 입력값 input

 - 함수가 처리할 인자(파라미터 parameter 또는 아규먼트 argument)다.

 - 입력값을 받아서 body 부분에서 값을 가지고 원하는 계산을 한다.

3) 함수 본체 function body

 - 함수의 코드 블록으로, 우리가 함수를 통해 하고 싶은 작업을 body부분에 구현한다.

 - 들여쓰기로 함수의 body가 어디까지인지 구분한다.

4) 출력값 output

 - body에서 계산한 후 함수를 호출한 코드(콜러 caller)로 돌려주는 값이다.

 - output은 코드 블록 가장 마지막에 명시한다.

이 구성요소들을 가지고 함수를 정의할 때는 def(데프, definition)라는 키워드를 사용하여 함수의 시작을 알려주고, return(리턴)이라는 키워드를 이용해서 함수의 끝을 알려준다.

def 함수이름(입력값):          # 콜론 :을 빼먹지 말자!
    함수의 body
    어떤 기능을 할지
    여기에 코드를 짜준 다음
    return 출력값             # 출력값이 필요하다면 이렇게 마지막에 명시

2. 함수의 사용


1) caller에서 함수를 사용할 때는 def 뒷부분에서 콜론을 떼고 함수이름(인자1, 인자2, ...)을 써서 호출하면 된다.

2) 타입 명시 없이 인자가 전달되는 것이기 때문에 함수가 어떤 입력을 받는지 알고 있어야 한다.

3) 인자를 함수로 전달할 때 함수에 정의된 순서에 따라 값을 전달하므로 인자를 전달하는 순서도 중요하다.

4) 함수를 호출하면 caller의 실행이 중단되고 호출된 함수(콜리 callee)가 실행된다.

예를 들어 세 숫자 a, b, c를 받아서 a*b+c를 계산한 값을 반환하는 함수 muladd를 만들고 싶다면 이렇게 하면 된다.

def muladd(a, b, c):    # 1. 함수 정의
    result = a * b + c
    return result       # 3. 계산을 마치고 result를 콜러에서 반환
    
# 또는
# def muladd(a, b, c):
#     return a * b + c

print(muladd(10, 3, 4)) # 2. 콜러가 함수를 호출하면 콜러는 멈추고 1번으로 돌아감
>> 34                   # 4. 2번으로 돌아와 print문 실행

abc = muladd(6, 5, 4)   # 5. 또 호출하면 멈추고 1번으로 돌아감
abc                     # 계산값을 반환해서 abc에 할당
>> 34

 

 

5) return은 함수의 종료를 알리는 키워드로,

 - return 옆에 값이나 수식이 있다면 해당 값을 콜러에게 반환하고 함수를 종료한다.

 - return 옆에 아무것도 쓰여있지 않다면 None을 반환하고 함수를 종료한다.

 - return이 없는 경우, 함수 코드 블록이 종료되면 None을 반환하고 함수를 종료한다.

 - tuple을 이용해서 여러 개의 값을 반환할 수도 있다.

def test1(a, b):
    if a*b > 10:
        return ('1번')
    print('@@')
    if a*b == 10:
        return
    print('**')
    return a, b

x = test1(10,2) # 첫 번째 return
print(x)
>> 1번

y = test1(2, 5) # 두 번째 return
print(y)
>> @@
>> None

z = test1(1, 3) # 세 번째 return
type(z)
>> @@
>> **
>> tuple

3. 함수의 인자(parameter, argument)와 종류


함수의 인자란 함수로 전달되는 입력값을 말한다.

1) 입력값은 0개 이상이기 때문에 원하는 값이 있다면 양껏 전달하면 된다.

  예시) pop함수는 입력값이 있으면 해당 인덱스의 값을, 입력값이 없으면 마지막 값을 제거 후 반환한다.

2) 함수의 입출력으로 int, string, list 등 모든 객체가 가능하고, 함수도 함수의 입출력으로 사용 가능하다.

 

인자는 크게 3종류가 있다.

1) 기본 인자 default parameter: 함수를 정의할 때 기본 값을 지정할 수 있는 인자. 파라미터 명시가 없을 경우 지정된 기본값을 사용한다.

def add(x, y=2, z=5):
    a = x + y + z
    return a

print(add(10, 20, 30)) # x, y, z 명시
>> 60

print(add(10, 20))     # x, y 명시, z=5
>> 35

print(add(10))         # x 명시, y=2, z=5
>> 17

 기본 인자의 경우 print함수에서도 봤었다.

print(1, 2, 3)   # 기본 인자 사용 - sep=' ', end='\n'
>> 1 2 3
                 # 기본 인자 명시
print(4, 5, 6, sep='--', end='끝')
>> 4--5--6끝

기본 인자를 사용할 때, 기본 인자 뒤에 일반 인자가 올 수 없음을 유의해야 한다.

가능 def f(a, b, c) def f(a, b, c=2) def f(a, b=3, c=2) def f(a=1, b=3, c=2)
불가능 def f(a=1, b, c) def f(a=1, b=3, c) def f(a, b=3, c) def f(a=1, b, c=2)

2) 키워드 파라미터 keyword parameter: 콜러가 함수를 호출할 때 인자의 이름을 명시해서 전달할 수 있다. 이것을 키워드 파라미터라고 한다. 이름을 명시할 경우 순서는 바뀌어도 상관없지만, 이름을 사용하지 않을 경우 순서대로 인자 값이 함수에게 전달된다.

def muladd(x, y, z):
    return x * y + z

print(muladd(1, 2, 3))  # 이름 명시X
>> 5                    # 1 * 2 + 3

print(muladd(2, z=5, y=4)) # 이름 명시O
>> 13                      # 2 * 4 + 5

3) 가변 길이 인자 variable length argument: 전달되는 인자의 개수가 고정적이지 않을 때 쓰는 인자.

 - *args: 인자들을 튜플의 형태로 전달한다. 몇 개인지 모르는 여러 인자를 받아 순회할 때 *을 붙이면 편하게 이용할 수 있다. arguments

def test2(*args):             # 2. 입력 받음 : ('ㄱ', 'ㄴ', 'ㄷ', 'ㄹ')
    print(type(args))         # 3. 튜플이겠죠?
    for n in args:            # 4. 튜플 앞에서부터 하나씩 꺼내서
        print(n, end=' ')     # 5. 출력하기

test2('ㄱ', 'ㄴ', 'ㄷ', 'ㄹ')  # 1. 'ㄱ', 'ㄴ', 'ㄷ', 'ㄹ'을 인자로 넘김
>> <class 'tuple'>
>> ㄱ ㄴ ㄷ ㄹ 

 - **kwargs: 인자들을 dict의 형태로 전달한다. 인자의 이름과 값을 함께 전달하고 싶을 때 **을 붙이면 된다. key word arguments

def test3(**what):                          # 2. 입력 받음: {'a':'ㄱ', 'b':'ㄴ', 'c':'ㄷ', 'myname':'무지맘'}
    print(type(what))                       # 3. dict겠죠?
    for k, v in what.items():               # 4. what에 있는 키와 값을 하나씩 꺼내서
        print('key:', k, ', value:', v)     # 5. 출력하기
        
test3(a='ㄱ', b='ㄴ', c='ㄷ', myname='무지맘') # 1. 4쌍이 인자로 넘겨짐
>> <class 'dict'>
>> key: a , value: ㄱ
>> key: b , value: ㄴ
>> key: c , value: ㄷ
>> key: myname , value: 무지맘

가변길이 인자를 이용하는 대표적인 함수에는 앞서 봤던 format이 있다. 플레이스 홀더 placeholder {}를 문자열 내에 만들어 둔 후, 문자열 이용 시 format을 이용해서 값을 넣는다.

a = '오늘의 코인 날씨! 시가 {}, 고가 {}, 저가 {}, 현재 {}'
b = '내일의 코인 날씨! {}때문에 {} 예상!'

print(a)
print(b)                           
>> 오늘의 코인 날씨! 시가 {}, 고가 {}, 저가 {}, 현재 {}
>> 내일의 코인 날씨! {}때문에 {} 예상!  # 그냥 print하면 {}가 그대로 출력되지만
                                      # 인자들을 홀더의 개수에 맞게 넘겨주면 
print(a.format(100, 200, 50, 150))    # 홀더에 순서대로 인자가 들어가서 출력됨
print(b.format('트윗 하나', '급락'))
>> 오늘의 코인 날씨! 시가 100, 고가 200, 저가 50, 현재 150
>> 내일의 코인 날씨! 트윗 하나때문에 급락 예상!

4. 변수의 범위(배리어블 스코프 variable scope)


변수가 어디에서 선언되냐에 따라서 해당 변수의 값이 유지되는 범위가 다르다. 이 범위에 따라 변수를 크게 2가지로 구분할 수 있다.

1) 지역변수(로컬 배리어블 local variable): 특정 코드 블록에서 선언된 변수. 그 코드 블록이 종료되면 지역변수도 사라진다.

2) 전역변수(글로벌 배리어블 global variable): 프로그램 메인에서 정의되어 프로그램 종료 전까지 살아있는 변수. 보통 프로그램의 최상단에 위치하고 있다.

x, y = 10, 20 # 전역변수 범위 시작

def test4(x, y):       # 지역변수 범위 시작
    print(x, y)     # 같은 변수이름이 있다면 지역변수 우선적용
    return x+y        # 지역변수 범위 끝

test4(30, 40) # 지역변수
>> 30 40
>> 70         # 함수 호출 후 반환된 값

print(x, y) # 전역변수
>> 10 20      # 전역변수 범위 끝

<요약>

 

1. 함수 정의하기

def 함수이름(인자1, 인자2, ...):

    함수 body

    return은 선택사항

2. 함수를 사용할 땐 함수이름(인자1, 인자2, ...)

3. 함수의 입출력은 파이썬의 모든 객체

4. 함수의 인자

 - 기본 인자: 함수 정의 시 변수에 값 지정

 - 키워드 인자: 함수 호출 시 변수에 값 지정

 - 가변 길이 인자: 인자의 개수를 모를 때

   ㄱ. *변수이름: 입력을 튜플로 바꿈

   ㄴ. **변수이름: 입력을 dict로 바꿈

5. 변수의 유효 범위

 - 지역변수: 해당 코드 블록 내에서만 값 유효

 - 전역변수: 프로그램 전체에서 값 유효

'Python' 카테고리의 다른 글

모듈의 이해 및 사용 - import  (0) 2021.06.18
람다(Lambda)함수 이해 및 사용하기  (0) 2021.06.11
공부하면서 만난 연습문제들 - 파이썬편  (0) 2021.05.21
반복문 - while, for  (0) 2021.05.21
조건문 - if  (0) 2021.05.18