파이썬 함수 생성하기


  • edwith 강좌를 바탕으로 정리한 내용입니다.

1. 함수란?

함수란 무엇일까요? 수학에서 말하는 함수는 값 x를 계산하여 y를 출력하는 식 f(x)를 함수라고 합니다.

파이썬에서 함수는 숫자식을 말하는 것이 아닙니다. 영어 function 그대로 특정 기능을 하는 코드들의 모음입니다.

2. 왜 함수를 사용할까요?

특정 기능을 하는 코드들의 모음을 함수라고 했습니다. 그렇다면 왜 굳이 기능들을 나눠서 관리해야할까요? 그냥 코드로 쭉 작성하면 되지 않을까요?

함수를 사용해야하는 이유에 대해 알아보도록 하겠습니다. 예를 들어 회원가입 페이지를 만드는 코드를 작성한다고 가정해봅시다.

스크린샷 2018-05-13 오후 8.00.31

이름, 주소, 전화번호 등등 필수 항목에 입력이 되지 않을 경우 필수 정보입니다.라는 warning 메시지를 표시하고자 합니다.

표시할 수 있는 방법은 아이디, 비밀번호, 비밀번호재확인 부분에 값이 없을 경우 메시지가 뜨도록 작성하면 됩니다.

#아이디 입력코드 부분
print("필수 정보입니다.")


#비밀번호 입력코드 부분
print("필수 정보입니다.")


#비밀번호재확인 입력코드 부분
print("필수 정보입니다.")

필수 정보입니다필수 정보를 입력해주세요.로 바꾼다고 했을때 어떤 문제가 발생할까요? warning메시지를 띄우는 곳이 3군데가 아니고 20군데라면 어떨까요?

20군데의 코드를 수정해야하는 반복작업을 해야합니다. 그러다 수정할 곳이 너무 많아 어떤 곳은 수정이 안되어 있어 코딩의 신뢰성이 낮아질 수 있습니 .(제가 자주 그러지요 :) )

이처럼 반복적인 코딩이 많고, 코딩의 신뢰성을 높이고자 우리는 함수를 생성하여 코딩합니다.

3. 함수의 종류

파이썬에서는 2가지의 함수 종류가 존재합니다.

  1. 내장함수 : 파이썬 인터프리터에서 제공하는 함수입니다.
    ** 인터프리터란 ? 사람의 언어를 컴퓨터의 언어로 바꿔주는 역할을 하는 파이썬 기능입니다.
  2. 사용자 정의 함수 : 우리가 따로 정의하는 함수입니다.

우선, 파이썬에서 제공하는 내장함수에 어떤 것들이 있는지 살펴보고 다음 절에서 사용자 정의 함수를 만드는 방법에 대해 알아 보도록 하겠습니다.

문자열 관련 함수

1. 문자 개수 세기 : count()

문자열 안에서 특정문자가 몇 개나 있는지 세립니다.

'hello'.count('l')

스크린샷 2018-05-13 오후 8.20.06

2. 특정 문자열 위치 알려주기 : find(), index()

두 함수 모두 문자열에서 처음 나타나는 위치를 반환합니다.

'hello'.find('l')
'hello'.index('l')

스크린샷 2018-05-13 오후 8.22.41

두 함수의 차이는 찾는 문자열이 없을 경우 find()함수는 -1을 반환하지만, index()함수는 에러를 반환합니다. 스크린샷 2018-05-13 오후 8.23.34

3. 문자열 삽입 : join()

문자들 사이사이 마다 특정문자열을 삽입합니다.

'='.join('hello')

스크린샷 2018-05-13 오후 8.26.44

4. 문자열 나누기 : split()

특정문자열을 기준으로 대상문자열을 나눕니다. 나뉜 문자들은 리스트 원소로 담깁니다.

str = 'h=e=l=l=o'.split('=')
print(str)

스크린샷 2018-05-13 오후 8.29.02

특정문자열이 없는 경우에는 공백을 기준으로 나뉩니다.

5. 문자열 검사 : 숫자, 알파벳, 문자확인 함수

함수기능
isdigit()문자열이 숫자로만 되어있을 경우 true
isalpha()문자열이 알파벳이나, 한글문자로만 되어 있을 때 true
isalnum()문자열이 숫자와 영문자, 한글문자만 섞여있을 때 true
isupper()문자열이 대문자로 되어 있을때 ture
islower()문자열이 소문자로 되어 있을때 true

6. 문자열 변환

문자열 변환 함수는 다음과 같습니다.

함수기능
uppper()문자열 모두 대문자로 변환
lower()문자열 모두 소문자로 변환
replace(old, new[,count])old문자열을 new 문자열로 변환한다. count옵션이 설정되어 있으면 count번째까지 발견한 old문자열이 변환된다.

수학관련 함수

수치계산을 위한 내장함수

수치 계산을 위한 내장함수는 다음과 같습니다.

함수기능
max(a,b,c,..)두개 이상의 인수를 주면 그 중에서 최댓값을 반환
min(a,b,c,..)두 개 이상의 인수를 주면 최소값을 반환
abs(x)x의 절대값을 반환
sum(x[,start=0])x은 리스트 등의 반복되는 데이터이며 총합을 반환, start값이 지정되면 start수치도 더해서 반환
pow(x,y[,z])z가 없으면 xy를 반환하고, x가 있으면xy%z를 반환
round(x)반올림하여 정수를 반환

수치계산을 위한 math모뉼 내 수학함수

함수를 사용하기 전 모듈을 import하는 코드를 입력해야합니다.함수이름 앞에 math를 붙여줘야합니다.

import math
math.sqrt(x)

math모듈의 수학함수는 다음과 같습니다.

함수기능
log(x[, base])x의 로그를 변환, base가 생략되면 자연로그, 지정되면 base값이 밑값으로 로그
sqrt(x)제곱근을 반환
sin(x), cos(x), tan(x)삼각함수 계산하여 반환
radis(x)degree 각도를 넣어주면 라디안 각도를 변환
pi원주율 값을 가진 상수
ceil(x)x보다 크거나 같은 최소의 정수로 어림함
floor(x)x보다 작거나 같은 최대의 정수로 어림함
trunc(x)소수점 아래의 값을 버림

4. 함수 만드는 방법

이제 직접 함수를 정의하는 방법에 대해 알아보도록 하겠습니다.

함수 정의

함수정의 방법은 다음과 같습니다.

def 함수명(매개변수):
  함수본문
  함수본문
  return 반환값

def예약어를 이용해서 함수를 정의합니다. 함수를 정의할 때는 코드가 실행되지는 않고 코드를 저장해 놓기만 합니다.

함수 호출

정의한 함수는 어떻게 호출해서 사용할까요? 사용방법은 다음과 같습니다.

함수명(인자)

인자와 매개변수

인자(Argument)는 매개변수와 어떻게 다를까요?
인자는 함수를 호출 할 때 입력값으로 전달하는 값입니다. 매개변수는 인자값을 담아 함수에서 사용되는 변수입니다. 따라서 인자는 함수호출 시 사용되고, 매개변수는 함수를 정의할 때 사용됩니다.

반환값

반환값이란 무엇일까요? 반환값은 함수를 실행한 결과값입니다. 함수 내에서 return구문을 통해 결과값이 전달됩니다.

다중 매개변수와 인자

함수에서는 매개변수와 인자값을 여러개를 사용할 수 있습니다. 다중일 경우에는 ,로 구분해서 여러개의 매개변수를 정의 할 수 있습니다. 대신 순서에 따라 매개변수와 인자값이 매칭됩니다.

def addtwo(a,b):
  added = a+b
  return added

x = addtwo(3,5)
print(x)

스크린샷 2018-05-13 오후 8.57.37

이때 , 매개변수의 개수와 인자의 개수가 맞지 않으면 에러가 발생합니다.

def addtwo(a,b):
  added = a+b
  return added

x = addtwo(3)
print(x)

스크린샷 2018-05-13 오후 8.58.25

반환값이 없는 함수

함수를 정의할 때 항상 반환값이 필요하지 않습니다. 이런 경우를 void함수라고 합니다. 반대로 반환하는 함수는 fruitful함수라고 합니다.

5. 함수 예제

예제 문제

월급 계산 프로그램을 만들어봅니다. 단, 근무시간이 40시간이 넘으면 초과 근무시간에는 시급의 1.5배를 지급합니다. 이름이 computepay이고 2개의 매개 변수(시간과 시급)을 받는 함수를 작성해 봅시다.

예상 답안

스크린샷 2018-05-13 오후 7.41.20

문제 풀기

먼저, 프로그램 작성 방법을 순서대로 나열해 보겠습니다.

  1. 근무시간(hour), 시급(rate)가 인자인 함수(computepay)를 정의합니다. 1-1. 근무시간이 40시간이 넘을 경우 시급의 1.5배를 계산합니다. 1-2. 근무시간이 40시간이 안넘을 경우 근무시간*시급을 계산합니다. 1-3. 계산된 급여를 반환합니다.

  2. 근무시간(hour), 시급(rate) 입력받습니다. 2-1. 입력값이 숫자일 경우 float 형태로 변환합니다. 2-2. 입력값이 문자일 경우 에러메시지를 출력하고 실행을 중단합니다.

  3. computepay( )함수를 호출합니다.
  4. 함수의 반환값을 출력합니다.

위 시나리오를 기반으로 코드를 작성해보도록 하겠습니다.

#1. 근무시간(hour), 시급(rate)가 인자인 함수(computepay)를 정의합니다.
def computepay(hours, rate) :
    #1-1. 근무시간이 40시간이 넘을 경우 시급의 1.5배를 계산한다.
    if fh > 40:
        reg = rate * hours
        # 초과 금액 계산
        otp = (hours - 40.0) * (rate * 1.5)
        pay = reg + otp
    #1-2. 근무시간이 40시간이 안넘을 경우 근무시간*시급을 계산합니다.
    else:
        pay = rate * hours

    #1-3. 계산된 급여를 반환합니다.
    return pay

#2. 근무시간(hour), 시급(rate) 입력받습니다.
sh = input("enter hours : ")
sr = input("enter rate : ")

try :
    # 2-1. 입력값이 숫자일 경우 float 형태로 변환합니다.
    fr = float(sr)
    fh = float(sh)
except:
    #2-2. 입력값이 문자일 경우 에러메시지를 출력하고 실행을 중단합니다.
    print("Error, please enter numeric input")
    quit()

#3. computepay( )함수를 호출합니다.
xp = computepay(fh,fr)

#4. 함수의 반환값을 출력합니다.
print("Pay:", xp)