Programming/Python

[Python 3.7] 파이썬 함수란? (함수 생성, 호출, 고정인수, 가변인수, 키워드 인수, 딕셔너리 언패킹, 재귀호출)

Nirsa 2020. 2. 6. 13:10
반응형

 

  • 함수란?

들어가는 값만 바뀌고 같은 코드가 계속 반복되는 경우 또는 용도에 따라 특정 코드들을 모아두는 용도 입니다. 한번만 작성 해두면 나중에 해당 코드가 필요할때 불러와서 사용만 하면 되기 때문에 코드 재사용이 가능하고, 코드의 용도를 명확히 구분해둘 수 있다는 장점이 있습니다.

 

  • 함수 생성, 호출과 고정 인수

함수의 생성과 호출은 아래 코드와 같이 할 수 있습니다.

# 함수 생성
def hello():
    print('Hello, World!')
    
# 함수 호출
hello()

# 결과값 : Hello, World!

함수는 호출되기 전까지는 별도의 동작을 하지 않습니다. 밑으로 쭉 내려가다가 hello() 에서 함수를 호출하고나서 hello() 함수가 실행 및 동작 합니다.

또한 반드시 함수를 호출하기 전에 이미 상단에 함수가 선언되어 있는 상태여야 합니다. 만약 함수 호출을 먼저 하고 그 뒤에 함수가 선언되어 있다면 "Name Error: name 'hello' is not defined" 에러가 발생 합니다.


위에선 단순히 Hello, World! 만 출력을 했는데 아래는 간단히 제곱을 구하고 출력하는 코드 이며, 각각의 인수 2는 a로, 10은 b로 들어 갑니다.

def squared(a, b):
    print(a ** b)
    
squared(2, 10)

 

이 코드들은 출력만을 해주게 되는데 함수 안에서 연산된 값을 밖으로 가지고 나오고 싶을 땐 return을 사용 하시면 됩니다.

# 값 한개 가져오기
def squared(a, b):
    return a ** b
    
x = squared(2, 10)
print(x)


# 값 두개 가져오기
def squared(a, b):
    return a ** b, a + b
    
x, y = squared(2, 10)
print(x)
print(y)

여태 했던것과 같이 함수에 인수를 순서대로 넣는 방식을 위치 인수, 함수를 호출할 때 인수가 정해져 있는걸 고정 인수라고 합니다.

 

  • 가변 인수

가변 인수는 인수 개수가 정해지지 않은걸 뜻 합니다. 가변 인수 함수를 만들어주면 이후 매개변수에 몇개의 인수가 들어가도 사용할 수 있습니다.

def print_num(*args):
    for arg in args:
        print(arg)
        
print_num(10)
print_num(20, 30, 40)

 매개변수 앞에 *(에스터리스크)를 넣어주면 가변 인수로 사용하게 되고, 튜플 형식으로 삽입되기 때문에 for문을 이용해 하나씩 꺼내볼 수 있습니다. 만약 위의 코드에서 for문을 삭제하고 print(args)만 납둔다면 튜플 형식으로 (10, )과 (20, 30, 40)이 들어가 있는걸 확인하실 수 있습니다.

마찬가지로 함수로 호출할 때 print_num(20, 30, 40)과 같이 하나하나 입력해주지 않고 리스트를 만든 후 print_num(*x) 와 같이 사용할 수 있습니다.

 

  • 키워드 인수

위에선 값이나 변수를 그대로 넣었는데, 특정 용도를 가르키는 매개변수를 입력하여 사용할 수 있습니다.

def p_info(name, age, address):
    print('이름: ', name)
    print('나이: ', age)
    print('주소: ', address)
    
p_info('nirsa', 80, '인천 광역시')

 

  • 딕셔너리 언패킹

키워드 인수를 이용하여 딕셔너리 언패킹을 할수도 있습니다.

def p_info(name, age, address):
    print('이름: ', name)
    print('나이: ', age)
    print('주소: ', address)
    
x = {'name':'nirsa', 'age':80, 'address':'인천 광역시'}
p_info(**x)

p_info에서 딕셔너리 x를 언패킹하고 p_info 함수의 매개변수에 하나씩 삽입 합니다. 단, 위와같이 딕셔너리 언패킹을 사용할 땐 매개변수와 딕셔너리 키의 개수가 같아야 하고 매개변수 이름과 딕셔너리 키 이름과 같아야 하며 딕셔너리 키는 반드시 문자열 형태를 갖추고 있어야 합니다.

 

만약 함수의 매개 변수를 가변 인수로 만들 시 아래와 같이 응용할 수 있습니다.

# 딕셔너리 언패킹과 가변 인수 함수 사용
def p_info(**kwargs):
    for key, value in kwargs.items():
        print(key, ':', value)
    
x = {'name':'nirsa', 'age':80, 'address':'인천 광역시'}
p_info(**x)

 

  • 재귀호출

재귀 호출은 함수 안에서 함수 자기 자신을 호출하는 방식 입니다. 재귀호출을 사용하게 되면 루프가 발생할 수 있기 때문에 반드시 종료 조건을 만들어서 특정 조건을 만족하면 빠져나올 수 있도록 해주어야 합니다.

# 종료 조건을 주지 않은 재귀호출 (루프 발생)
def recursive_call():
    print('Hello, World!')
    recursive_call()
    
recursive_call()



# 종료 조건을 사용한 재귀호출
def recursive_call(count):
    if count == 0:    # count가 0일 때 재귀호출 종료
        return

    print('Hello, World!', count)
    
    count -= 1    # 한번 반복할 때 마다 count를 1씩 뺌
    recursive_call(count)    # 기존 값에서 1이 빠진 count값으로 다시 재귀호출을 진행
    
recursive_call(10)

 

count를 숫자로 대입하여 보면 아래와 같이 진행 됩니다. 보통 return을 주는 이유는 재귀호출로 특정 연속된 연산값을 함수 밖으로 가져오기 위해 사용 합니다.

 

반응형