파이썬 함수 정의 - 사용자 함수 만들기
- 2020. 12. 7. 17:35
파이썬 함수
파이썬 사용자 함수
프로그래밍에서 함수란 코드 작성 시 반복적인 코드의 사용을 방지하고 좀 더 효율적인 구조로 작성하기 위해 사용됩니다. 다른 언어에서 함수를 정의하기 위해서 함수 특성까지 고려해야 하지만 파이썬은 전혀 그럴 필요가 없습니다. 그냥 파이썬은 사용자 함수를 만들기 위해서 단 하나의 키워드 def 만 사용하면 됩니다.
파이썬 사용자 함수 기본 형태
함수의 기본 형태로 아무런 인자도 없이 함수만 생성하여 함수를 호출하고 있습니다. print구문에 인사 메시지를 반복적으로 사용하는 형태라면 유용하게 사용할 수 있습니다. 뭐 그럴 경우는 거의 없지만 말이죠.
def user_func():
print("Hi~! CaptainBIN.")
user_func()
#결과
Hi~! CaptainBIN.
참고로 파이썬에서 사용자 함수만 정의하고 하위에 코드가 있지 않으면 이런 에러가 발생합니다.
def user_func():
user_func()
# 에러 출력
user_func()
^
IndentationError: expected an indented block
필자의 경우 프로그램 개발 초기 단계에서 머릿속에 떠오르는 로직을 프로그래밍하다가 반복적으로 사용할 것 같은 부분을 먼저 함수로 선언해 놓는 경우가 많습니다. 대략적인 프로그래밍이 끝났을 때 문법적인 오류나 중간중간 확인하기 위해 개발 중인 모듈을 수행하는데 그럴 때 정의만 해놓은 함수가 있다면 위와 같은 오류가 발생합니다. 이 오류를 방지하기 위해 아주 유용한 파이썬 키워드가 있습니다. 바로 "pass"입니다.
def user_func():
pass
user_func()
위 코드를 실행해 보면 실행은 되었지만 아무것도 출력되지 않는 것을 확인할 수 있습니다. 단, 주의해야 할 점은 실행이 잘 된다고 머릿속에 있는 함수 로직을 실제로 구현하지 않았으면서 구현했다고 착각하게 되면 그 프로그램은 치명적인 휴먼 오류에 빠지게 됨을 주의해야 합니다.
파이썬 사용자 함수 파라미터 사용
파이썬 사용자 함수에서 일반 변수 파라미터 사용
위에 함수의 기본 형태에 대해 알아보았습니다. 함수를 출력할 때마다 인사 메시지를 출력하는 아주 간단한 코드이지만 인사 메시지 출력 시 사용자 이름을 바꾸어 가며 메시지를 출력하고 싶다고 할 때 이 사용자의 이름을 파라미터 즉, 함수의 인자 값으로 받아 주면 됩니다.
def user_func(user_name):
print ("Hi~! " + user_name)
user_func("Captain")
user_func("BIN")
#결과
Hi~! Captain
Hi~! BIN
물론 이름이 없을 경우 Default값을 지정해 줄 수도 있습니다. 바로 이렇게 말이죠.
def user_func(user_name="Anonymous"):
print ("Hi~! " + user_name)
user_func("Captain BIN")
user_func()
#결과
Hi~! Captain BIN
Hi~! Anonymous
파이썬 사용자 함수에서 리스트 변수 파라미터 사용
사용자 별로 일일이 함수 호출을 하니 좀 답답한 감이 없지 않아 있습니다. 그냥 사용자 이름을 통째로 넘겨 메시지를 출력하고 싶을 때는 어떻게 해야 할까요?
tot_user_name=["Captain","BIN"]
def user_func(*user_name):
for un in user_name:
print ("Hi~! " + un)
user_func(*tot_user_name)
# 결과
Hi~! Captain
Hi~! BIN
또는 리스트 변수를 사용하지 않고 함수 호출 시 리스트 데이터를 바로 넘겨줄 수도 있습니다.
def user_func(*user_name):
for un in user_name:
print ("Hi~! " + un)
user_func("Captain","BIN","철수","영희")
#결과
Hi~! Captain
Hi~! BIN
Hi~! 철수
Hi~! 영희
파이썬 사용자 함수에서 딕셔너리 파라미터 사용
사용자 함수에서 리스트를 파라미터로 사용했는데 그럼 딕셔너리 자료형은? 물론 가능합니다. 바로 아래 예시와 같이 말이죠.
user_info={'name':'CaptainBIN','addr':'안드로메다'}
def user_func(name, addr):
print('name='+ name + ' addr=' + addr)
user_func(**user_info)
#결과
name=CaptainBIN addr=안드로메다
하지만 딕셔너리 자료형을 사용하는 데 있어서 리스트 자료형과 혼합한 형태를 많이 사용할 것입니다. 즉, 리스트 자료 형안에 딕셔너리 자료형을 사용하여 동일한 키값에 다른 데이터를 저장하는 방식으로 말이죠. 그렇다면 이런 자료형을 함수의 인자로 넘기려면 어떻게 해야 할까요? 사실 위에서 해봤습니다. 단지 자료형이 혼합이라는 것이 다른 점이죠.
user_info=[{'name':'CaptainBIN','addr':'안드로메다'}
,{'name':'철수','addr':'서울'}
,{'name':'영희','addr':'대전'}]
def user_func(*user_arr):
for ui in user_arr:
print(ui.get('name') + '|' + ui.get('addr'))
user_func(*user_info)
#결과
CaptainBIN|안드로메다
철수|서울
영희|대전
위의 예제 코드를 보면 파라미터 넘기는 것이 리스트 자료형 하고 크게 다를 것이 없습니다.
파이썬 사용자 함수 인자 혼합 사용
지금까지 파이썬 사용자 함수에서 인자로 사용하는 방법을 알려 드렸지만 각각 하나씩 알려 드렸습니다. 하지만 이 모든 것을 한 번에 사용할 수도 있다는 사실 알고 계셨나요? 바로 이렇게 말이죠. 단 파라미터 변수에 *와 **가 존재할 경우 반드시 **앞에 *가 위치해야 합니다.
def blog_func(blog_category, *blog_name, **blog_info):
print(blog_category)
print('='*10)
for nm in blog_name:
print(nm, end='')
print('')
print('='*10)
print("address=" + blog_info.get('addr'))
print("job=" + blog_info.get('job'))
blog_func('python', "Captain", "BIN", addr="안드로메다", job="programmer")
#결과
python
==========
CaptainBIN
==========
address=안드로메다
job=programmer
파이썬 사용자 함수 반환 값
지금까지 파이썬 사용자 함수에 대해 알아보았습니다. 예제의 대부분이 단순 print로 메시지를 출력하는 예제로만 구성되었습니다. 사실 함수는 전달받은 인자 값으로 정의된 코드를 수행하여 그에 적절한 결괏값을 반환해 주는 것이 함수입니다. 물론 함수의 결괏값이 없을 수도 있습니다. 그건 프로그래머의 재량이죠. 하지만 일단 함수를 정의해서 사용했다면 그 함수가 제대로 수행되었는지를 판별할 수 있도록 'True'/'False'라도 반환을 하도록 구현하는 것이 좋습니다. 아래 코드 예제는 함수에서 반환할 수 있는 여러 가지 자료형에 대해 예시를 들었습니다. 사실 별거 없습니다.
그리고 위에 함수 파라미터에서 살펴본 것처럼 혼합된 자료형도 리턴해 줄 수 있습니다.
def ret_func_1():
return "리턴"
def ret_func2():
return 1+1
def ret_func3():
return ['Captain', 'BIN']
def ret_func4():
return {'key1':"value1", 'key2':'value2'}
def ret_func5():
return False
print(ret_func_1())
print(str(ret_func2()))
for i in ret_func3():
print(i)
ret_val=ret_func4()
print(ret_val.get('key1') + '|' + ret_val.get('key2'))
if ret_func5():
print("True return")
else:
print("False return")
#결과
리턴
2
Captain
BIN
value1|value2
False return
파이썬 사용자 함수 독스트링과 어노테이션
사용자 함수를 선언하고 구현하는 데 있어서는 그 기능만 잘 수행된다면 문제 될 것이 없습니다. 하지만 문제는 이렇게 생성한 함수가 시간이 지나면서 어떤 함수인지 까먹을 수도 있고 파라미터를 어떻게 넘겨주어야 하는지 기억이 가물가물 할 때가 발생합니다. 물론 함수를 선언한 형태를 보면 알 수 있겠지만 변수명만 보고 int형을 넘겨줘야 하는지 string 형태로 넘겨주어야 하는지 결국 함수 로직을 살펴보아야 합니다. 이러한 번거로움을 해결하기 위해 정말 정말 중요하게 생각하는 독스트링과 어노테이션 개념이 있습니다.
독스트링과 어노테이션은 이전에 제가 생성한 포스팅 글이 있어 파이썬 사용자 함수 주제와 연관되어 아래 링크를 달아 놓겠습니다.
captainbin.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Docstring-Annotation