파이썬 & 오픈소스 개발 Tip과 강좌

이곳은 파이썬과 여러 오픈소스 기반 프레임워크 관련 Tip과 강좌 게시판 입니다. 관련 개발을 진행하면서 알아내신 Tip이나 강좌와 새로운 소식을 적어 주시면 다른 공부하는 분들에게 큰 도움이 됩니다. 감사합니다. SQLER.com은 개발자와 IT전문가의 지식 나눔을 실천하기 위해 노력하고 있습니다.

안녕하세요. SQLER의 코난 김대우입니다. 

이번 강좌에서는, Python 초급 강좌 목차 - 14. 함수 파라미터(Parameter)를 진행토록 하겠습니다.

 

SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록

 

코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.

예를 들어, 14_parameter.py를 생성하고 코드를 실행합니다.

 

Python 초급 강좌 목차 - 14. 함수 파라미터(Parameter)

함수를 사용하면 반복되는 코드를 가져와 필요할 때, 호출 할 수 있는 모듈로 재사용할 수 있습니다. 함수는 def 키워드로 정의되며, 코드에서 함수가 호출되기 전에 선언되어야합니다. 함수는 파라미터(parameter-매개 변수)를 사용할 수 있고, 값을 리턴 할 수 있습니다.

 

함수 파라미터(Function parameters)

아래와 같은 패턴으로 함수와 파라미터를 선언합니다.

# 예시 코드입니다
def function_name(parameter):
    # 실행할 코드
    return value

 

함수 파라미터 기본값

매개 변수에 기본값(default value)을 할당하여 함수가 호출 될 때 선택 사항으로 지정할 수 있습니다.

# 예시 코드입니다
def function_name(parameter=default):
    # 실행할 코드
    return value

 

함수 파라미터 위치지정 또는 명명된 표기법 사용

함수를 호출 할 때 위치를 지정해 표기(Positional notation)하거나 명명된 표기법(named notation)을 사용하여 파라미터 값을 지정할 수 있습니다.

# 예시 코드입니다
def function_name(parameter1, parameter2):
    # 실행할 코드
    return value

# 위치 지정 표기법(Positional notation)은 파라미터가 선언 된 것과 같은 순서로 인자값을 전달합니다.
result = function_name(value1,value2)

# 명명된 표기법(Named notation)
result = function_name(parameter1=value1, parameter2=value2)

 

함수 파라미터 전달 코드

지난 함수 강좌에서 이미, 파라미터를 함수에 전달하고 리턴되는 결과를 받아 처리하는 예제를 공부했습니다.

# name을 파라미터로 받고 이름의 첫 글자를 대문자로 리턴하는 함수를 생성합니다.
# 매개 변수 :
#   name : 사람의 이름
# 리턴 값 :
#   파라미터로 전달된 이름의 첫 글자를 대문자로 리턴
def get_initial(name):
    initial = name[0:1].upper()
    return initial

# 이름을 입력받아 이니셜을 리턴합니다.
first_name = input('Enter your first name: ')

# 이름의 이니셜을 가져오기 위해 get_initial 함수를 호출합니다.
first_name_initial = get_initial(first_name)

print('Your initial is: ' + first_name_initial)

 

여러 파라미터를 함수에 전달

함수에 1개 이상의 파라미터를 전달 가능합니다. 아래의 코드처럼 이름과, 강제로 대문자로 변환할지 여부를 파라미터로 전달할 수 있으며, 파라미터 설정 순서에 따라 전달해야 합니다.

# 이름의 첫 이니셜을 리턴하는 함수를 생성합니다.
# 매개 변수 :
#   name : 사람의 이름
#   force_uppercase : 이니셜을 대문자로 표시할지 여부를 설정합니다.
# 리턴 값 :
#   파라미터로 전달된 이름의 첫 글자를 대문자로 리턴
def get_initial(name, force_uppercase):
    if force_uppercase:
        initial = name[0:1].upper()
    else:
        initial = name[0:1]
    return initial

# 이름을 입력받아 이니셜을 리턴합니다.
first_name = input('Enter your first name: ')

# 이름을 입력받아 이니셜을 리턴합니다.
first_name_initial = get_initial(first_name, False)

print('Your initial is: ' + first_name_initial)

이렇게 "force_uppercase" 파라미터를 이용해 조건에 따라 대문자 이니셜을 리턴할지 결정할 수 있습니다.

 

함수 파라미터에 기본값 설정

아래 코드와 같이, 함수의 파라미터에 기본값을 함께 전달할 수 있습니다.

# name을 파라미터로 받고 이름의 첫 글자를 대문자로 리턴하는 함수를 생성합니다.
# 매개 변수 :
#   name : 사람의 이름
#   force_uppercase : 이니셜을 대문자로 표시할지 여부를 설정하고, 기본값은 True입니다.
# 리턴 값 :
#   파라미터로 전달된 이름의 첫 글자를 대문자로 리턴
def get_initial(name, force_uppercase=True):  # 파라미터 기본값 전달
    if force_uppercase:
        initial = name[0:1].upper()
    else:
        initial = name[0:1]
    return initial

# 이름을 입력받고 이니셜을 리턴합니다.
first_name = input('Enter your first name: ')

# get_initial 함수를 호출하지만, force_uppercase 값을 전달하지 않아 기본값이 사용됩니다.
first_name_initial = get_initial(first_name) 

print('Your initial is: ' + first_name_initial)

force_uppercase=True으로 기본값을 적용해 함수를 처리하면, 코드 부분에서 함수에 파라미터를 전달하지 않아도, 기본값이 설정되어 함수가 실행됩니다.

 

명시적으로 함수 인자값을 지정

함수를 호출할때, 인자를 이름과 함께 전달하면, 좀더 명확하게 함수의 파라미터를 전달 가능합니다.

# 이름의 이니셜을 리턴하는 함수를 생성합니다.
# 매개 변수 :
#   name : 사람의 이름
#   force_uppercase : 이니셜을 항상 대문자로 표시할지 여부를 설정합니다.
# 리턴 값 :
#   파라미터로 전달된 이름의 첫 글자를 대문자로 리턴
def get_initial(name, force_uppercase):
    if force_uppercase:
        initial = name[0:1].upper()
    else:
        initial = name[0:1]
    return initial

 # 이름을 입력받아 이니셜을 리턴합니다.
first_name = input('Enter your first name: ')

# get_initial을 호출해 이름의 첫 이니셜을 가져옵니다.
# 명시적으로 파라미터를 전달해 사용하면 순서에 관계없이 파라미터를 지정할 수 있습니다.
first_name_initial = get_initial(force_uppercase=True, \
                                name=first_name)

print('Your initial is: ' + first_name_initial)

이렇게, 명시적으로 파라미터를 전달하면, 순서와 무관하게 파라미터를 지정할 수 있습니다.

 

더 읽기 쉬운 코드를 위한 함수와 파라미터, 그리고, 인자값 전달

예를 들어, 다음과 같이 여러 파라미터를 받는 error_logger라는 함수가 있다면, 함수를 호출하는 것도 쉽지 않고, 에러가 발생할 확률이 높아집니다.

# 코드 실행 중에 발생하는 오류를 처리하는 함수를 생성하면, 
# 사용자에게 메시지가 표시되고 오류를 기록해 디버깅에 도움이 될 수 있습니다.

# 파라미터 :
#   error_code : 각각의 오류 유형에 할당 된, 고유한 오류 코드. 예시) "45"는 데이터형 변환 오류입니다.
#   error_severity :    0 - 치명적인(fatal) 오류가 발생하지 않아야합니다.
#                       1 - 심각한(severe) 오류 코드로 인해 계속 진행할 수 없습니다.
#                       2 - 경고(warning) 코드는 계속 진행 될 수 있지만, 정보가 누락 될 수 있습니다
#   log_to_db : 이 오류가 데이터베이스에 기록되어야 하는지를 여부를 설정합니다.
#   error_message : 사용자에게 표시하고 데이터베이스에 입력할, 오류 메시지
#   source_module : 오류를 생성 한 Python 모듈의 이름

def error_logger(error_code, error_severity, log_to_db, error_message, source_module):
    print('oh no error: ' + error_message)
    # 오류를 데이터베이스 또는 파일에 기록하는 코드가 있다고 가정합니다.

first_number = 10
second_number = 5

if first_number > second_number:
    # 이 함수 호출 패턴을 즉각적으로 이해하기 어렵습니다. 
    # 이해하려면 error_logger 함수의 정의를 찾아서 살펴 봐야합니다.
    error_logger(45,1,True,'Second number greater than first','adding_method')


if first_number > second_number:
    # 이 함수 호출은 전달하는 값이 함수의 파라미터에 매핑되는 방식으로 볼 수 있으므로, 
    # 이해하기 더 쉽습니다.
    error_logger(error_code=45, 
                 error_severity=1,
                 log_to_db=True,
                 error_message='Second number greater than first',
                 source_module='adding_method')

이런 패턴으로, 함수 파라미터 호출시 인자값과 파라미터 이름을 명시적으로 사용해 코드를 읽기 쉽게 구성할 수 있으며, 아래처럼 인덴트(들여쓰기)를 구성하면 더 읽기 쉬운 코드로 함수를 호출할 수 있습니다.

두세개 이상의 파라미터를 전달하는 함수라면, 꼭 이렇게 명시적으로 파라미터를 전달할 것을 권장해 드립니다.

 

연습문제

아래의 comment를 살펴보고, 이를 코드로 구현하세요. 해결방안은 c9-python-getting-started/code_challenge_solution.py at master · CloudBreadPaPa/c9-python-getting-started (github.com)에서 보실 수 있습니다.

 

# calculator 함수 생성
# 함수는 세개의 파라미터를 받습니다.
# first_number : 수치 연산을 위한 숫자 값
# second_number : 수치 연산을 위한 숫자 값
# operator : 'add' 또는 'subtract'라는 단어를 입력 받고, 기본 값은 'add' 입니다.
# 함수는 operator로 전달된 파라미터에 따라 더하거나 뺀 두 숫자의 결과를 리턴해야합니다.
# 6, 4 값으로 함수를 테스트하고, 결과로 10을 출력해야 합니다.
# 6, 4, subtract 값으로 함수를 테스트하고, 결과로 2을 출력해야 합니다.
# 6, 4, divide 값으로 함수를 테스트하고, 실행 결과는 'invalid values are received' 에러 메세지를 출력해야 합니다.

 

수고하셨습니다. 

 

참조링크

개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝

c9-python-getting-started/python-for-beginners/14 - Function parameters at master · CloudBreadPaPa/c9-python-getting-started (github.com)

No. Subject Author Date Views
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 368
103 [C# 동영상 강좌] 00.프롤로그 – C# 4.0 SuYoung Kim(김수영) 2011.07.10 57932
102 [C#강좌] 00.프롤로그 – C# 4.0 [3] SuYoung Kim(김수영) 2011.05.05 43052
101 [C# 동영상 강좌] 17.델리게이트, 이벤트 SuYoung Kim(김수영) 2011.07.12 41524
100 [C#강좌] 03.C# 기본 구문 SuYoung Kim(김수영) 2011.06.16 41265
99 [C# 동영상 강좌] 01.C#의 발전 SuYoung Kim(김수영) 2011.07.12 39580
98 [C#강좌] 04.Data Type 1 - 값 형식 SuYoung Kim(김수영) 2011.06.16 37863
97 [C# 동영상 강좌] 03.C# 기본 구문 SuYoung Kim(김수영) 2011.07.12 37772
96 [C#강좌] 05.Data Type 2 - 참조 형식, 변수, 상수 SuYoung Kim(김수영) 2011.06.16 37485
95 [C#강좌] 01.C#의 발전 SuYoung Kim(김수영) 2011.06.16 36615
94 [C#강좌] 10.문자열 다루기 SuYoung Kim(김수영) 2011.06.16 36427
93 [C# 동영상 강좌] 13.프로퍼티 SuYoung Kim(김수영) 2011.07.12 33552
92 [C# 동영상 강좌] 04.Data Type 1 - 값 형식 SuYoung Kim(김수영) 2011.07.12 33163
91 [C# 동영상 강좌] 02.Hello World C# - 기본 개념의 이해 SuYoung Kim(김수영) 2011.07.12 32536
90 [C#강좌] 02.Hello World C# - 기본 개념의 이해 SuYoung Kim(김수영) 2011.06.16 32430
89 [C#강좌] 11.클래스 1 - 선언하기 SuYoung Kim(김수영) 2011.06.16 31626
88 [C# 동영상 강좌] 20.컬랙션 SuYoung Kim(김수영) 2011.07.12 31380
87 [C# 동영상 강좌] 09.배열 SuYoung Kim(김수영) 2011.07.12 30869
86 [C#강좌] 09.배열 SuYoung Kim(김수영) 2011.06.16 30684
85 [C#강좌] 17.델리게이트, 이벤트 SuYoung Kim(김수영) 2011.06.16 30358
84 쓰레드 풀(Thread Pool) 함써보자!! [2] Jerry 2012.03.23 30288





XE Login