[Python] 함수
<함수 구조>
def 함수 이름(매개변수):
수행할 문장1
수행할 문장2
...
def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다. 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.
함수의 이름은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값이다.
def add(a, b):
return a + b # return은 함수의 결괏값을 돌려주는 명령어
예제
>>> def add(a, b)
... return a + b
>>> a = 3
>>> b = 4
>>> c = add(a, b)
>>> print(c)
...
7
<매개변수와 인수>
매개변수(parameter): 함수에 입력으로 전달된 값을 받는 변수를 의미
인수(argument): 함수를 호출할 때 입력값을 의미
def add(a, b): # a, b는 매개변수
return a + b
print(add(3, 4)) # 3, 4는 인수
<함수의 형태>
● 일반적인 함수
입력값이 있고 결괏값이 있는 함수가 일반적인 함수이다.
>>> def add(a, b):
... result = a + b
... return result # a + b의 결괏값 반환
>>> a = add(3, 4)
>>> print(a)
...
7
● 입력값이 없는 함수
결과값을 받을 변수 = 함수이름()
>>> def say():
... return 'Hi'
>>> a = say()
>>> print(a)
...
Hi
위 코드를 보면 say라는 함수를 만들었는데 매개변수에는 비어있다. 이 같은 함수를 쓰기 위해서는 say()처럼 괄호 안에 아무 값도 넣지 않아야 한다. 이 함수는 입력값은 없지만 결괏값으로 Hi라는 문자열을 돌려준다.
● 결괏값이 없는 함수
함수이름(입력인수1, 입력인수2, ...)
>>> def add(a, b):
... print("%d, %d의 합은 %d입니다." %(a, b, a+b))
>>> add(3, 4)
...
3, 4의 합은 7입니다.
결괏값이 없는 함수는 호출해도 돌려주는 값이 없다. 여기서 결괏값이 없는 함수는 return 명령어로 출력을 해야 결괏값이 나오는데 그렇지 않았기 때문에 결괏값이 없는 함수라고 한다.
● 입력값도 결괏값도 없는 함수
함수이름()
>>> def say():
... print('Hi')
>>> say()
Hi
매개변수도 없고 return문도 없어서 입력값도 결괏값도 없는 함수이다.
<매개변수 지정하여 호출하기>
>>> def add(a, b)
... return a + b
>>> result = add(a=3, b=7)
>>> print(result)
...
10
매개변수를 지정하면 순서에 상관없이 사용할 수 있다.
>>> result(b=7, a=3)
>>> print(result)
...
10
<입력값이 몇 개인지 모를 때>
def 함수이름(*매개변수):
수행할 문장
...
입력값이 몇 개인지 모를 때는 매개변수에 *기호를 사용하면 된다.
>>> def add_many(*args):
... result = 0
... for i in args:
... 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
응용 예제
>>> def add_mul(choice, *args):
... if choice == "add": # 매개변수 choice에 'add'를 입력받았을 때
... result = 0
... for i in args:
... result += i # *args에 입력받은 모든 값을 더함
... elif choice == "mul": # 매개변수 choice에 'mul'을 입력받았을 때
... result = 1
... for i in args:
... result *= i # *args에 입력받은 모든 값을 곱합
... 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
<키워드 파라미터>
키워드 파라미터는 매개변수 앞에 별 두개(**)를 붙인다.
>>> def print_kwargs(**kwargs):
... print(kwargs)
>>> print_kwargs(a=1)
{'a' : 1}
>>> print_kwargs(name='kim', age=12)
{'name' : 'kim', 'age' : 12}
위 코드에서 출력된 값을 보면 모두 딕셔너리로 만들어져서 출력되었다. 이와 같이 매개변수 앞에 **을 붙이면 모든 결괏값은 key=value 형태로 출력이 된다.
<함수의 결괏값은 무조건 하나>
>>> def add_and_mul(a, b):
... return a+b, a*b
>>> result = add_and_mul(3, 4)
>>> print(result)
(7, 12) # 튜플 값 1개
>>> result1, result2 = add_and_mul(3, 4)
>>> print(result1, result2)
7 12 # result1 = 7, result2 = 12
<매개변수에 초깃값 미리 설정하기>
>>> def say_myself(name, old, man=True):
... print("나의 이름은 %s입니다." %name)
... print("나이는 %d살입니다." %old)
... if man:
... print("남자입니다.")
... else:
... print("여자입니다.")
매개변수에 들어갈 값에 항상 똑같은 값으로 설정하고 싶으면 man=True와 같이 함수의 초깃값을 미리 설정해두면 된다. 만약에 "여자입니다" 라고 출력하고 싶으면 True 자리에 False를 입력하면 된다.
<함수 안에서 함수 밖의 변수를 변경하는 방법>
● return 사용하기
>>> a = 1
>>> def vartest(a):
... a += 1
... return a
>>> a = vartest(a)
>>> print(a)
...
2
vartest 함수는 return 함수로 인해 들어온 값에 1을 더한 값을 돌려준다. 따라서 a = vartest(a)라고 대입하면 a가 vartest 함수의 결괏값으로 바뀐다.
● global 명령어 사용하기
>>> a = 1
>>> def vartest():
... global a # 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
... a += 1
>>> vartest()
>>> print(a)
...
2
<lambda>
lambda는 함수를 생성할 때 사용하는 예약어다. 보통 함수를 한 줄로 간결하게 만들 때 사용한다. def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
lambda 매개변수1, 매개변수2, ...: 매개변수를 사용한 표현식
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
...
7
위 코드는 아래 def를 사용한 함수와 동일하다.
>>> def add(a, b):
... return a + b
>>> result = add(3, 4)
>>> print(result)
...
7