Python - 함수
● 함수
- 파이썬의 함수 구조
def 함수명(매개변수) :
수행문1
수행문2
...
예시)

- 함수 형태

함수는 들어온 입력값을 받은 후 어떤 처리를 하여 적절한 값을 리턴한다.
입력값과 리턴값의 존재 유무에 따라 4가지 형태의 함수가 존재한다.
1. 일반적인 함수 : 입력값, 리턴값 둘다 존재
리턴값이 있는 함수는 저장할 변수가 필요하다.
def 함수이름(매개변수):
<수행문>
...
return 리턴값
예시)

2. 입력값이 없는 함수
리턴값이 있는 함수는 저장할 변수가 필요하다.
예시)

** 리턴값을 받을 변수 = 함수명() == a = say()
3. 리턴값이 없는 함수
저장할 변수가 없다.
예시)

** return값은 오직 return명령어로만 돌려받을 수 있기 때문에 a에는 리턴값이 없다.
4. 입력값, 리턴값이 없는 함수
예시)

** 함수이름 say()를 통해서만 호출이 가능하다.
- 매개변수 지정하여 호출하기
예시)

** 매개변수를 지정하면 순서에 상관없이 사용할 수 있다.
- 입력값이 몇 개가 될지 알 수 없을 때
def 함수이름(*매개변수):
<수행문>
return문
* 매개변수가 아닌 *매개변수를 받는다.
예시)

** add_many함수는 입력값이 몇 개이든 상관없다.
** *args 처럼 매개변수 이름 앞에 * 를 붙이면 입력값을 전부 모아 튜플로 만들어준다.
** *args는 임의로 정한 변수명으로 *python, *sample 처럼 아무 이름을 붙여도 된다.
예시 2)

** *args 매개변수 앞에 choice 매개변수가 추가되어 있다.
- 키워드 매개변수 (kwargs)
키워드 매개변수를 사용하기 위해선 매개변수 앞에 별 2개(**)를 붙인다.
예시)

** **kwargs매개변수 이름 앞에 **을 붙이면 매개변수 kwags는 딕셔너리가 되고
key=value 형태의 입력값이 딕셔너리에 저장된다.
- 함수의 리턴값은 언제나 하나이다.
예시)

** 리턴값이 하나이기 때문에 리턴값 a+b, a*b는 튜플값 하나인 (a+b, a*b)로 리턴
** 튜플값을 분리하고 싶은 경우 각각의 함수를 주어 호출하면 된다.
- return문이 하는 역할?
1. 값을 돌려주는 역할
2. 함수를 종료시키는 역할
예시)

** 함수의 리턴값은 언제나 하나이기 때문에 return a*b는 실행되지 않는다. 단, 오류는 발생하지 않는다.
예시 2)


** 특별한 상황에 함수를 빠져나가고 싶은 경우 return을 단독으로 사용하여 함수를 빠져나갈 수 있다.
** '천재' 값이 들어오면 문자열 출력 없이 함수 종료
- 매개변수 초기값 미리 설정하기
예시)

** 매개변수는 (name, age, man=True) 로 초기값 미리 설정한 것으로 미대입 시 man=True의 초기값을 가진다.
** (name, man=True, age)는 사용 불가하며, 디폴트를 적용하는 매개변수는 맨 뒤에 놓아야 한다.
ㄴ say_myself("홍길동",36) # 두번째 인자 값 36이 어디에 대입될지 파이썬 인터프리터가 알 수 없다.
- 함수 안에서 선언한 변수의 효력 범위
예시)

* 함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관없다.
- 함수 안에서 함수 밖의 변수를 변경하는 방법
global 명령어
예시)

** global a는 함수 안에서 함수 밖의 a 변수를 사용하는 뜻이나
함수는 독립적으로 존재하는 것이 좋기 때문에 외부 변수에 종속적인 함수는 좋은 함수가 아니니 참고!
- lambda (람다)
lambda로 선언된 내용은 결론적으로 함수와 동일한 역할을 한다.
함수를 간결하게 만들 때 사용한다.
- lambda 사용방법
함수명 = lambda 매개변수1, 매개변수2, ..: 매개변수를 이용한 표현식
기존 함수 예시)

lambda 예시)

** lambda로 만든 함수는 return 명령어가 없어도 결과값을 리턴한다.
** 기존 def 함수와 값이 동일하다.