반응형
함수란?
- 반복적으로 사용되는 부분을 하나로 묶어서, 어떤 입력값을 주었을 때 어떤 결과값을 돌려줄 수 있는 함수로 작성하는 것을 말한다.
- 참고로 매개변수(parameter)는 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이고, 인수(arguments)는 함수 호출시 전달하는 입력 값이다.
def 함수명(입력인수):
<수행할 문장1> # def는 함수를 만들 때 사용하는 예약어
<수행할 문장2> # 함수명은 함수를 만드는 사람이 임의 설정 가능
...
def add(a, b): # a, b가 매개변수
return a+b
print(add(3, 4)) # 3, 4가 인수
입력값과 결과값에 따른 함수 형태
- 입력값과 결과값이 있는 일반적인 함수
>>> def sum(a, b): # 1. 함수 만들기
>>> return a + b # 입력값 2개(a, b), 결과값은 입력값 2개를 더한 것
# return은 함수의 결과값을 돌려주는 명령어
>>> a = 1 # 2. 함수 사용
>>> b = 2 # 함수에 a와 b를 입력값으로 넣어줌
>>> c = sum(a, b) # 변수 c에 add 함수의 결과값을 대입
>>> print(c)
3
- 입력값이 없는 함수
# 입력값이 없는 함수 예시
>>> def say(): # 매개변수 부분이 비어 있는 say라는 이름의 함수
>>> return 'Hi' # 입력값은 없지만 결과값으로 Hi라는 문자열을 돌려줌
>>> a = say() # 위의 함수를 쓰기 위해서는,
>>> print(a) # say()처럼 괄호 안에 아무런 값도 넣지 않아야 함
Hi
- 결과값이 없는 함수: print문은 함수의 구성 요소 중 하나로, 결과값은 오직 return 명령어로만 돌려받을 수 있다.
>>> def add(a, b):
... print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>> add(3, 4)
3, 4의 합은 7입니다.
>>> a = add(3, 4)
>>> print(a)
None # None이란 거짓을 나타내는 자료형
# 결과값이 없는 함수는 리턴값으로 변수에 None을 돌려줌
# 하지만 이는 결과값은 아니다
- 입력값도 결과값도 없는 함수
>>> def say(): # 입력 인수를 받는 매개변수도 없고
... print('Hi') # return문도 없으니 입력값도 결과값도 없는 함수
...
>>> say() # 이 함수를 사용하는 방법은 단 한 가지 - 함수명만 입력
Hi
- 입력값이 몇 개가 될지 모를 때: 매개변수명 앞에 *을 붙이면 입력값들을 전부 모아서 튜플로 만들어 준다.
# 입력값 모를때 기본 구조
def 함수이름(*매개변수):
<수행할 문장>
...
① *args(인수) : 입력값이 여러개인 인수가 주어지면 그를 토대로 함수 작동
# 입력값이 여러개일 때, 매개변수 1개 함수
>>> def add_many(*args): # argument 약자
... result = 0
... for i in args:
... result = result + i
... return result
...
>>> result = add_many(1,2,3) # 함수 사용
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55
# 입력값이 여러개일 때, 매개변수 2개 함수
>>> def add_mul(choice, *args): # 함수 설정
... if choice == "add":
... result = 0
... for i in args:
... result = result + i
... elif choice == "mul":
... result = 1
... for i in args:
... result = result * i
... return result
...
>>> result = add_mul('add', 1,2,3,4,5) # 함수 사용
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120
② **kwargs(키워드 파라미터) : 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.
# 키워드 파라미터 (kwargs) 예시
>>> def print_kwargs(**kwargs): # keyworkd arguments 약자
... print(kwargs)
>>> print_kwargs(a=1) # 함수 사용
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'} # 입력이 모두 딕셔너리로 만들어져서 출력
매개변수에 따른 함수 표현법
- 매개변수 지정하여 호출하기
>>> def add(a, b):
... return a+b
>>> result = add(a=3, b=7) # a에 3, b에 7 전달
>>> print(result)
10
>>> result = add(b=5, a=3) # b에 5, a에 3 전달 - 순서에 상관없음
>>> print(result)
8
함수의 결과값은 언제나 하나다
- 함수 결과값이 2개일때는 튜플값 하나(a, b)로 돌려준다.
# 함수 결과값이 2개일때, 튜플로 반환
>>> def add_and_mul(a,b): # 함수 생성
... return a+b, a*b
>>> result = add_and_mul(3,4) # 함수 호출
>>> result
(7, 12) # 튜플값 하나(a+b, a*b)로 돌려줌
# 만약 하나의 튜플값을 각각의 결과값으로 받고 싶을때
>>> result1, result2 = add_and_mul(3, 4)
>>> result1
7
>>> result2
12
- 함수 내에 return문구가 많더라도, 함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가므로 첫번째 return값만 호출된다.
# return문을 2번 사용하면
>>> def add_and_mul(a,b):
... return a+b
... return a*b
>>> result = add_and_mul(2, 3)
>>> print(result) # 두번째 return문 a*b는 실행되지 않음
5 # 결과값은 5 하나뿐
# return을 쓰면 함수에서 즉시 빠져나갈 수 있음
>>> def say_nick(nick):
... if nick == "바보":
... return
... print("나의 별명은 %s 입니다." % nick)
>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보') # 바보 출력하지 않음
>>>
매개변수 초깃값 미리 설정하기
- 함수의 매개변수에 전달되는 값이 항상 변하는 것이 아닐 경우에는 함수 초깃값을 미리 설정해 두면 유용
- 초기화시키고 싶은 매개변수들을 항상 뒤쪽에 위치시켜야 함 (ex. 매개변수로 (name, old, man=True)는 되지만 (name, man=True, old)는 안 됨)
# 매개변수가 3개일 때,
>>> def say_myself(name, old, man=True): # say_myself 함수는 3개 받아서
>>> print("나의 이름은 %s 입니다." % name)
>>> print("나이는 %d살입니다." % old)
>>> if man: # man이 True면 남자
>>> print("남자입니다.")
>>> else: # False면 여자 출력
>>> print("여자입니다.")
>>> say_myself("박응용", 27)
나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.
함수 안에서 선언된 변수의 효력 범위
- 함수 안에서 선언된 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다.
>>> a = 1
>>> def vartest(a): # 매개변수 a의 값에 1을 더했으니
>>> a = a +1 # 2가 출력되어야 할 것 같지만 결과값은 1이 나옴
>>> vartest(a) # 입력받은 a는 함수 안에서만 사용
>>> # 아무것도 안 나옴
>>> print(a) # 함수 밖의 변수 a와 다름
1
# 함수 에러
>>> def vartest(a):
>>> a = a + 1
>>> vartest(3) # vartest라는 함수 내에서 a는 4가 됨
4
>>> print(a) # print(a)에서 사용된 a는 찾을수 없어 에러
NameError: name 'a' is not defined
함수 안에서 함수 밖의 변수를 변경하는 방법
① return 사용: 함수 내에서 결과값을 return으로 받고, 이를 변수로 받아서 출력.
>>> a = 1
>>> def vartest(a): # 함수 vartest(a)의 a는 단순 임의의 변수명
>>> a = a +1
>>> return a
>>> a = vartest(a) # 여기서 vartest(a)은 vartest(1)과 동일
>>> print(a)
2
② global 명령어 사용: 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻. 하지만 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니므로 비추천.
>>> a = 1
>>> def vartest():
>>> global a # 함수안에서 함수밖의 a 변수를 직접 사용
>>> a = a+1
>>> vartest()
>>> print(a)
2
Lambda 함수
- 'lambda 변수: return 내용' 형식의 단일문으로 표현되는 함수
- 익명의 함수로 이름이 없는 구현체만 존재하는 간단한 함수를 의미
- 코드 상에서 한번만 사용되는 기능이 있을 때, 굳이 긴 함수로 만들지 않고 1회성으로 만들어서 쓸 때 사용.
# 함수 def 함수이름(변수)
def add(x, y):
return x + y
# 함수 lambda 변수: return 내용
add2 = lambda x, y: x + y
add2(10, 20)
# 람바다 예시
>>> add = lambda a, b: a+b # 2개의 인수를 받아 서로 더한 값을 리턴
>>> result = add(3, 4)
>>> print(result)
7
# 위와 동일한 def 함수
>>> def add(a, b):
... return a+b
>>> result = add(3, 4)
>>> print(result)
7
Reference
반응형
'Data > Python' 카테고리의 다른 글
[Python] 파이썬 입출력 - 파일 읽고 쓰기 (0) | 2023.06.17 |
---|---|
[Python] 파이썬 입출력 - 사용자 입력과 출력 (0) | 2023.06.17 |
[Python] 파이썬 제어문 - for 반복문, continue, List comprehension (0) | 2023.06.17 |
[Python] 파이썬 제어문 - while 반복문, break, continue (0) | 2023.06.17 |
[Python] 파이썬 제어문 - If, elif, 조건부 표현식 (0) | 2023.06.17 |