본문 바로가기
파이썬

파이썬 함수 (2) - 사용자 정의 함수

by Daisy_On 2020. 9. 26.

 

 

 

 

 

사용자 정의 함수

- 사용자가 직접 만들어 사용하는 함수

- 구조

def 함수명(매개변수):
    수행할 문장
    ...
    [return 반환값]

- 매개변수(parameter) : 함수에 입력으로 전달된 값을 받는 변수

- 인수 또는 인자(argument) : 함수를 호출할 때 전달하는 입력값

 

입력값과 결과값에 따른 함수의 형태

입력값 결과값 사용 방법 예시
결과값 받을 변수=함수이름(입력인수1, 입력인수2...) def add(a,b):
    result=a+b
    return result

a=add(3,4)  # 입력값 3, 4
print(a)  # 결과값 a
결과값 받을 변수=함수이름() def say():
    return 'Hi'

a=say()  # 입력값 없음
print(a)  # 결과값 a
함수이름(입력인수1, 입력인수2...) def add(a,b):
    print(a+b)

print(add(3,4))  # 7, 입력값 3, 4
a=add(3,4)  # None(거짓), return값이 없기 때문에 사용 불가
함수이름() def say():
    print('Hi')

say() # Hi

 

매개변수(parameter)

일반 매개변수

- 함수 호출시 위치에 따라 매개변수가 전달되는 방식

- 가장 많이 사용되는 방식이며 함수 호출시 정의된 매개변수와 함수 선언시 정의된 매개변수의 개수는 반드시 같아야 함

def add(a, b):
    return a+b  # a, b는 일반 매개변수
    
print(add(3,4)) # 3, 4는 인수

 

기본(default) 매개변수

- 함수를 호출할 때 매개변수의 값을 설정해 주지 않아도 기본 값이 할당되도록 하는 매개변수

- 기본 매개변수는 반드시 일반 매개변수보다 뒤에 위치해야함

def add(a,b=0):
    return a+b  # b가 기본 매개변수
    
print(add(10))    #10+0
print(add(10,20)) #10+20

 

지정 매개변수

- 함수에 인수값을 전달할 때 인수의 이름으로 전달하는 방법

- 순서에 상관없이 사용할 수 있음

- 일반인수와 혼용할 경우 일반인수보다 뒤에 나와야하며 키워드 인수 이후에는 순서에 의한 매칭 불가능

def add(a,b):
    return a+b
    
print(add(10,b=20))    # a:일반 인자, b:지정 인자
print(add(b=20,a=10))  # a, b: 지정 인자

 

가변 매개변수 args(*)

- 함수를 정의(선언)할 때 매개변수 앞에 *을 붙이면 정해지지 않은 수의 매개변수를 받겠다는 의미

- 가변 매개변수는 입력받은 인수를 튜플 형식으로 저장(packing)

- 매개변수 앞에 *을 붙여서 사용

- args: arguments의 약자로 관례적으로 사용

def add_many(*args):
    result=0
    for i in args:
        result=result+i
    return result
    
result1=add_many(1,2,3)     # 1+2+3
result2=add_many(1,2,3,4,5) # 1+2+3+4+5

- 다른 매개변수와 혼용 가능

def add_many(a,*b):
    result=a
    for i in b:
        result=result+i
    return result
    
result1=add_many(1,2,3)     # a=1, b=(2,3)
result2=add_many(1,2,3,4,5) # a=1, b=(2,3,4,5)

 

키워드 매개변수 kwargs(**)

- 함수에서 정의되지 않은 매개변수를 받을 때 사용되며 딕셔너리 형식으로 전달

- 일반 매개변수, 가변 매개변수와 함께 있을 경우 반드시 일반->가변->키워드 순으로 인수를 전달하고 받아야 함

- 매개변수 앞에 **을 붙여서 사용

- kwargs: keyword arguments의 약자로 args와 마찬가지로 관례적으로 사용

def print_kwargs(**kwargs):
    print(kwargs)
    
print_kwargs(a=1) # {'a',1}
print_kwargs(id='Daisy', pw=1234) # {'id':'Daisy', 'pw':1234}

 

return문

- 함수의 결과값을 여러개로 받고 싶다면 튜플 형태로 받음. (튜플 1개)

- 함수 내에서 return은 한 번만 사용 가능하며,  return문을 만나는 순간 함수를 빠져나가게 되므로 여러번 사용할 경우 처음 return만 유효함

- 특별한 상황에서 함수를 빠져나가고 싶을 때 return 단독으로 사용해서 함수를 빠져나가기도 함

def add_and_mul(a,b):
    return a+b, a*b
    
result = add_and_mul(3,4)  # (7, 12)
result1, result2 = add_and_mul(3,4)  # result1=7, result2=12
def div(a,b):
    if b == 0:
        return
    print(a/b)
    
div(2,1) # 2.0
div(2,0) # 아무것도 출력되지 않음

 

스코핑 룰 (scoping rule)

- 스코프(scope, 영역)란 변수나 객체 이름이 가지는 범위를 의미함

- 스코프를 벗어난 변수의 접근은 오류를 발생 시킴

- 이름을 찾는 순서는 local -> global ->built-in 순서 (모두 없으면 NameError 발생)

- Local : 이름이 만들어진 함수나 클래스 내부

- Global : 함수나 클래스 외부

- Built-in : 파이썬 자체에서 정의한 이름

 

지역 변수 (Local variable)

- 함수 내부에서만 효력이 있는 변수 이름.

- 함수 안에서 선언한 매개변수는 함수 안에서만 사용되기 때문에 함수 밖에서는 존재하지 않음

a = 1
def vartest(a):  # a:지역변수
    a=a+1
    
print(vartest(a))  # 2
print(a)  # 1, vartest내부에서 바뀐 a 값은 함수 밖의 a와 상관없음
def vartest(a):
    a=a+1
    
print(vartest(3)) # 4
print(a) # a는 존재하지 않기 때문에 에러

 

전역 변수 (Global variable)

- 프로그램 내부 어디서든 호출 가능한 변수. 

- 함수 밖에서 변수를 정의하면 전역 변수가 됨

- 함수 안에서는 전역 변수 값을 바꿀 수 없는게 기본이지만 바꿀 수 있는 방법 있음

  1) return

a = 1
def vartest(a):
    a = a+1
    return a
    
print(a) # 1
a = vartest(a) # a에 vartest 반환값을 저장해주어야 a 값을 변화시킬 수 있음
print(a) # 2

  2) global - 함수는 독립적으로 존재하는 것이 좋기 때문에 권장하지 않음

a = 1
def vartest():
    global a  # 함수 밖의 변수 a를 직접 사용하겠다는 뜻
    a=a+1
    
print(a)  # 1
vartest()
print(a)  # 2

 

lambda 함수

- 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할

- 한 줄짜리 간단한 함수를 만들 때 사용

- return 문이 없어도 결과값을 반환함

- 사용법 : lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식

add = lambda a, b: a+b
result=add(3,4)
print(result) # 7

 

 


요약

- 함수는 입력값이 있거나 없거나/출력값이 있거나 없거나 4가지 경우의 수가 있으며, 출력값이 있는 경우 결과는 항상 하나. (return a, b 등으로 여러개 출력하는 경우 튜플 하나로 반환)

- 함수에서 return문을 만나는 경우 바로 함수를 빠져나옴

 

  구조
사용자 정의 함수 def 함수명(매개변수):
    수행할 내용
     [return 반환값]
lambda 함수 lambda 매개변수1, 매개변수2, ... : 수행할 내용

 

매개변수 종류 설명 예시
일반 매개변수 순서에 의한 매칭 def add(a,b):
    return(a,b)
print(add(3,4)) #7
기본(default) 매개변수 매개변수 초기값 미리 설정 def add(a,b=0):
    return a+b
print(add(3)) #3
print(add(3,4)) #7
지정 매개변수 함수에 인수를 전달할 때 이름으로 매개변수 지정.
순서에 상관 없음
def add(a,b):
    return a+b
print(add(a=3,b=4)) #7
print(add(b=4,a=3)) #7
가변 매개변수 (*) 매개변수 개수가 정해져있지 않을 때 사용하며, 튜플 형식으로 받음 def sum(*a):
    b=0
    for i in a: b=b+i
    return b
print(sum(1,2,3)) #6
키워드 매개변수 (**) 함수에서 정의되지 않은 매개변수를 받을 때 사용하며, 딕셔너리 형식으로 받음
매개변수는 일반->가변->키워드 순서.
def print_kwargs(**a):
    print(kwargs)

print_kwargs(a=1) #{'a',1}

 

  지역 변수 전역 변수
개념 함수 내부에서만 효력 프로그램 내부 어디서든 읽을 수 있음
함수 내부 읽기 가능 가능
함수 내부 쓰기(수정) 가능 불가
(return, global쓰면 가능)
함수 외부 읽기 불가 가능
함수 외부 쓰기(수정) 불가 가능

 

 

* 참고자료

- 회사 교육자료

- 점프 투 파이썬

댓글