[References]
http://pythonstudy.xyz
함수(function)는 일정한 작업을 수행하는 Code Block으로 보통 반복적으로 계속 사용되는 Code들을 함수로 정의하여 사용하게 된다. Python에서 함수는 def Keyword를 사용하여 정의되며, 다음과 같은 문법을 갖는다. 여기서 입력 Parameter나 Return값은 구현하는 내용에 따라 있을 수도 있고, 없을 수도 있다.
def 함수명(Parameter1, Parameter2, ...):
문장1
문장2
[return Return값]
아래 예제는 두개의 입력 Parameter를 받아들여 이를 더한 값을 Return하는 함수를 정의하고 이를 사용하는 예이다.
def sum(a, b):
s = a + b
return s
total = sum(4, 7)
print(total)
# 11
def sum(a, b):
s = int(a) + int(b)
return s
total = sum(input("첫 번째 숫자 : "), input("두 번째 숫자 : "))
print(total)
1. Parameter 전달 방식
함수에서 입력 Parameter는 Pass by Assignment에 의해 전달된다. 즉, 호출자(Caller)는 입력 Parameter 객체에 대해 Reference(참조)를 생성하여 Reference를 복사하여 전달한다.
전달되는 입력 Parameter는 Mutable일 수도 있고, Immutable일 수도 있으므로 각 경우에 따라 다른 결과가 일어난다.
입력 Parameter가 Mutable 객체이고, 함수가 그 함수 내에서 해당 객체의 내용을 변경하면, 이러한 변경 사항은 호출자(caller)에게 반영된다. 하지만, 함수 내에서 새로운 객체의 Reference를 입력 Parameter에 할당한다면, Reference 자체는 복사하여 전달되었으므로, 호출자에서는 새로운 Reference에 대해 알지 못하게 되고, 호출자 객체는 아무런 변화가 없게 된다.
입력 Parameter가 Immutable 객체이면, 입력 Parameter의 값이 함수 내에서 변경될 수 없으며, 함수 내에서 새로운 객체의 Reference를 입력 Parameter에 할당되어도 함수 외부(Caller)의 값은 변하지 않는다.
# 함수내에서 i, mylist 값 변경
def f(i, mylist):
i = i + 1
mylist.append(0)
# k는 int (immutable)
k = 10
# m은 List (mutable)
m = [1,2,3]
# 함수 호출
f(k, m)
# 호출자 값 체크
print(k, m)
# 10 [1, 2, 3, 0]
위의 예제에서 함수 f()는 하나의 정수(i)와 하나의 List(mylist)를 입력받아, 함수 내에서 그 값들을 변경한다.
정수는 Immutable 타입이므로 함수 내에서 변경된 것이 호출자에 반영되지 않으며, List는 Mutable 타입이므로 추가된 요소가 호출자에서도 반영된다.
2. Default Parameter
함수에 전달되는 입력 Parameter 중 호출자가 전달하지 않으면 Default로 지정된 값을 사용하게 할 수 있는데, 이를 Default Parameter 혹은 Optional Parameter라 부른다. 아래 예제에서 factor는 Default Parameter로서 별도로 전달되지 않으면, 그 값이 1로 설정된다.
def calc(i, j, factor = 1):
return i * j * factor
result = calc(10, 20)
print(result)
# 200
def mul(a, b = 10):
return a * b
print(mul(3))
# 30
print(mul(4, 5))
# 20
기본 값을 사용하려는 Parameter 뒤에 기본 값을 사용하지 않는 Parameter가 올 수 없다.
def mul(a = 10, b):
return a * b
# SyntaxError: non-default argument follows default argument
* Parameter a에 기본 값을 지정하려면, Parameter b에도 기본 값을 지정하여야 한다.
3. Named Parameter
함수를 호출할 때 보통 함수에 정의된 대로 입력 Parameter를 순서대로 전달한다.
또 다른 호출 방식으로 "Parameter Name = Parameter Value"와 같은 형식으로 Parameter를 전달할 수 있는데, 이를 Named Parameter라 부른다. Named Parameter를 사용하면, 경우에 따라 어떤 Parameter를 전달하는지 쉽게 파악할 수 있는 장점이 있다.
def report(name, age, score):
print(name, score)
report(age=10, name="Kim", score=80)
4. 가변 길이 Parameter
함수의 입력 Parameter의 개수를 미리 알 수 없거나, 0부터 n개의 Parameter를 받아들이도록 하고 싶다면, 가변 길이 Parameter를 사용할 수 있다. 가변 길이 Parameter는 Parameter명 앞에 *를 붙여 가변 길이임을 표시한다. 아래 예제에서 *numbers는 가변 길이 Parameter이므로, total()을 호출할 때, 임의의 숫자의 Parameter들을 지정할 수 있다.
def total(*numbers):
tot = 0
for n in numbers:
tot += n
return tot
t = total(1, 2)
print(t)
# 3
t = total(1, 5, 2, 6)
print(t)
# 14
5. Return값
함수로부터 호출자로 Return 하기 위해서는 return문을 사용한다. return문은 단독으로 쓰이면 아무 값을 호출자에게 전달하지 않으며, "return value" 처럼 쓰이면, 값을 호출자에게 전달한다. 함수에서 Return되는 값은 하나 이상일 수 있는데, 필요한 수만큼 "return" Keyword 다음에 Comma로 구분하여 적는다.
예를 들어, return a, b, c는 3개의 값을 Return한다. 하지만, 기술적으로 좀 더 깊이 설명하면, 이는 (a, b, c) 세 개의 값을 포함하는 Tuple 하나를 Return하는 것으로 함수는 항상 하나의 Return값을 전달한다고 볼 수 있다.
def calc(*numbers):
count = 0
tot = 0
for n in numbers:
count += 1
tot += n
return count, tot
# (count, tot) tuple을 Return
count, sum = calc(1, 5, 2, 6)
print(count, sum)
# 4 14
6. Scoping Rule
Python에서 함수는 별도의 Name Space를 가진다. 예를 들어, 변수를 선언하면 그 변수의 이름이 Name Space에 생성된다. Python에서 변수명을 가지고 값을 얻는 것은, Name Space에 있는 이름을 가지고 특정 객체에 접근하여 값을 얻는 것이다.
Name Space는 총 3가지의 공간으로 나누어진다. 함수 내부의 공간은 지역(Lacal) 영역이라 하고, 함수 외부의 공간은 전역(Global) 영역이라 하며, Python 자체에서 정의된 공간은 내장(Built-in) 영역이라고 한다.
이름은 지역, 전역, 내장 순으로 검색한다. 이를 LGB 규칙이라고 한다.
n = 10
def func(n):
n = n * 10
func(n)
print(n)
# 10
n = 10
def func(x):
global n
n = n * 10
func(n)
print(n)
# 100
7. 내장 함수
sum()
l = [1, 2, 3, 4]
print(sum(l)) # 10
위 코드에서 sum()의 역할은 리스트 l 안에 있는 정수들을 전부 더해준다.
sum()에 두 번째 인자를 넣을 수 있다. 두 번째 인자는 최초의 변수 역할을 해주는데, 아래의 코드를 보면 좀 더 명확하게 이해할 수 있다.
x = 5
l = [1, 2, 3, 4]
for num in l:
x+=num
print(x)
# 15
y = 5
print(sum(l, y))
# 15
print(y)
# 5