파이썬 함수 (2) - 사용자 정의 함수
사용자 정의 함수
- 사용자가 직접 만들어 사용하는 함수
- 구조
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쓰면 가능) |
함수 외부 읽기 | 불가 | 가능 |
함수 외부 쓰기(수정) | 불가 | 가능 |
* 참고자료
- 회사 교육자료
- 점프 투 파이썬