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

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

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

이번 강좌에서는, Python 초급 강좌 목차 - 13. 함수(Function)를 진행토록 하겠습니다.

 

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

 

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

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

 

Python 초급 강좌 목차 - 13. 함수(Function)

코드를 복붙 하는것은 개발자에게 일반적인 일입니다. 물론, 이렇게 복붙 하는것도 한 방법이지만, 반복되는 코드를 함수로 생성하는것이 더 효율적인 방법이죠. 그럼 함수, 시작합니다.

 

함수(Functions)

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

 

코드를 복붙할 경우의 코드 패턴

아래 코드와 같이, "task completed" 출력과 현재 일시 출력 코드 부분이 반복됩니다. 

import datetime

# 각 코드 섹션 다음에 timestamp를 인쇄하여 코드 실행에 걸리는 시간을 확인합니다.
first_name = 'Susan'
print('task completed')
print(datetime.datetime.now())
print()

for x in range(0,10):
    print(x)

print('task completed')
print(datetime.datetime.now())
print()

이런 반복되는 코드를 함수를 이용해 구현 가능합니다.

 

반복되는 코드를 함수로 변환

아래 코드와 같이 print_time()이라는 함수를 만들고, 이 함수를 호출해 재활용합니다.

import datetime

# 메시지와 현재 시간을 출력하는 print_time이라는 함수를 생성합니다.
def print_time():
    print('task completed')
    print(datetime.datetime.now())
    print() 

first_name = 'Susan'
# print_time() 함수를 호출해 메세지와 현재 시간을 표시합니다.
print_time()

for x in range(0,10):
    print(x)

# print_time() 함수를 호출해 메세지와 현재 시간을 표시합니다.
print_time()

 

함수를 사용할 경우의 장점

코드의 재사용성을 높이는 장점은 기본입니다. 추가적으로,

  • 로직 변경시 코드 변경 최소화
  • 버그 발생 가능성을 낮춤

이런 장점들도 함수를 통해 얻을 수 있습니다.

 

하지만, 함수를 호출할때 다른 메세지를 출력하고 싶다면 어떻게 해야 할까요? 예를 들어, 아래의 코드와 같은 상황입니다.

from datetime import datetime

# 다른 메시지를 표시하려면, 여전히 함수를 사용할 수 있을까요?
first_name = 'Susan'
print('first name assigned')
print(datetime.now())
print() 

for x in range(0,10):
    print(x)

print('loop completed')
print(datetime.now())
print()

이런 경우에는 함수에 파라미터를 전달해 해결 가능합니다.

 

함수에 파라미터 전달

함수에 인자로 다른 파라미터를 전달하도록 구현할 수 있습니다.

from datetime import datetime

# 현재 시간과 작업 이름을 인쇄하는 함수를 생성합니다.
# 다음 매개 변수 기능 :
#   task_name : 출력시 표시 할 작업의 이름
def print_time(task_name):
    print(task_name)
    print(datetime.now())
    print()

first_name = 'Susan'
# print_time() 함수를 호출해 메세지와 현재 시간을 표시합니다.
# 완료된 task_name을 파라미터로 전달합니다.
print_time('first name assigned')

for x in range(0,10):
    print(x)

# print_time() 함수를 호출해 메세지와 현재 시간을 표시합니다.
# 완료된 작업 이름을 전달합니다.
print_time('loop completed')

이렇게, def print_time(task_name) 형식의 task_name을 파라미터로 받아서 처리하고, 함수를 호출하는 부분에서 해당 파라미터에 인자를 넘깁니다. 그럼, 함수의 파라미터를 통해 넘어온 작업 이름이 출력됩니다.

 

반복되는 로직을 함수로 구현

같은 로직이 계속 반복되는 경우 역시 함수로 구현하는 좋은 패턴입니다.

# 이름을 요청하고 이니셜을 리턴합니다.
first_name = input('Enter your first name: ')
first_name_initial = first_name[0:1]

middle_name = input('Enter your middle name: ')
middle_name_initial = middle_name[0:1]

last_name = input('Enter your last name: ')
last_name_initial = last_name[0:1]

print('Your initials are: ' + first_name_initial \
    + middle_name_initial + last_name_initial)

이 코드는 계속해서 이름의 이름을 가져와 첫 글자(이니셜)만 출력하는 로직이 반복됩니다. 이러한 패턴 역시 아래처럼 함수로 변경 가능합니다.

 

이름을 받아 이니셜을 리턴하는 함수

# name을 파라미터로 받고 이름의 첫 글자를 대문자로 리턴하는 get_initial 함수를 생성합니다.
# 매개 변수 :
#   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)

middle_name = input('Enter your middle name: ')
# 이름의 이니셜을 가져오기 위해 get_initial 함수를 호출
middle_name_initial = get_initial(middle_name)

last_name = input('Enter your last name: ')
# 이름의 이니셜을 가져오기 위해 get_initial 함수를 호출
last_name_initial = get_initial(last_name)

print('Your initials are: ' + first_name_initial \
    + middle_name_initial + last_name_initial)

이렇게 get_initial 함수를 생성하고, 코드에서 호출하면, 코드를 더 효율적으로 작성 가능합니다.

만약, 이니셜을 가져올때, 이니셜을 소문자로 리턴하고 싶다면, 모든 코드를 변경하지 않고, 위의 get_initial 코드의 upper()만 lower() 변경하면 대문자가 아니라 소문자로 리턴되겠죠.

 

함수를 사용 추가 팁

정리해보면, 다음과 같습니다.

  • 코드를 더 읽기 쉽고, 관리하기 쉽도록 함수를 항상 염두에 두고 개발하세요.
  • 함수의 목적과 파라미터를 설명하는 주석을 항상 추가하세요.
  • 함수는 코드에서 사용되기 전에 선언되어야 합니다.

 

연습문제

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

 

# calculator function 생성
# 함수는 세개의 파리미터를 입력받습니다.
# first_number : 수치 연산을 위한 숫자 값
# second_number : 수치 연산을 위한 숫자 값
# operator : 'add' 또는 'minus'라는 단어
# 함수의 operator 파리미터로 전달된 값에 따라, 더하거나 뺀 두 숫자의 결과를 출력해야 합니다.

# 6, 4, add 값으로 함수를 테스트하고, 결과로 10을 출력해야 합니다.
# 6, 4, subtract 값으로 함수를 테스트하고, 결과로 2를 출력해야 합니다.
# 6, 4, divide 값으로 함수를 테스트하고, 실행 결과는 'invalid values are received' 에러 메세지를 출력해야 합니다.

 

수고하셨습니다.

 

참조링크

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

c9-python-getting-started/python-for-beginners/13 - Functions at master · CloudBreadPaPa/c9-python-getting-started (github.com)

No. Subject Author Date Views
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 543
» Python 초급 강좌 목차 - 13. 함수(Function) 코난(김대우) 2021.01.02 56
87 Python 초급 강좌 목차 - 12. 반복문(Loop): for, while 코난(김대우) 2021.01.02 52
86 Python 초급 강좌 목차 - 11. 컬렉션(Collection): list, array, dictionary file 코난(김대우) 2021.01.02 73
85 Python 초급 강좌 목차 - 10. 조건문(Condition):3 복잡한 조건 처리 코난(김대우) 2021.01.01 54
84 Python 초급 강좌 목차 - 9. 조건문(Condition):2 다중 조건 처리 코난(김대우) 2021.01.01 79
83 Python 초급 강좌 목차 - 8. 조건문(Condition):1 (IF-ELSE) 코난(김대우) 2021.01.01 57
82 Python 초급 강좌 목차 - 7. 에러 핸들링(Error Handling) file 코난(김대우) 2021.01.01 66
81 Python 초급 강좌 목차 - 6. 날짜와 시간 데이터 처리 코난(김대우) 2021.01.01 65
80 Python 초급 강좌 목차 - 5. 숫자(Numeric) 데이터 처리 코난(김대우) 2021.01.01 47
79 Python 초급 강좌 목차 - 4. 문자열(String) 데이터 처리 코난(김대우) 2021.01.01 64
78 Python 초급 강좌 목차 - 3. 주석(Comments) 코난(김대우) 2021.01.01 57
77 Python 초급 강좌 목차 - 2. Print 구문 file 코난(김대우) 2021.01.01 98
76 Python 초급 강좌 목차 - 1. Python 개발 환경 구성 file 코난(김대우) 2021.01.01 249
75 Python 초급 강좌 목차 - 0. Python 소개 file 코난(김대우) 2021.01.01 203
74 오픈소스 개발도구 - vscode 설치 (WSL 설치 포함) file 코난(김대우) 2020.12.20 95
73 지금 시작하는 개발자를 위한, 무료 Python 강좌 Top 5! file 코난(김대우) 2020.12.19 84
72 installshield 와 entityframwork 우와앙 2014.03.28 10672
71 Visual Studio Video 비디오 컨퍼런스 규니규니 2013.03.08 12795
70 Visual Studio 2012 신제품 발표회.(09/25 - 롯데호텔 잠실 3층) 쓸만한게없네(윤선식) 2012.09.24 12754
69 SqlBulkCopy 성능비교 지현명 2012.09.13 19242





XE Login