Python에서 함수를 정의할 때 def 키워드를 사용합니다.
그리고 조건문, 반복문에서 알아본 바와 같이 함수 선언부가 끝나면 콜론( : )을 붙여주고, 들여쓰기를 통해 block 단위를 지정합니다.
1. 기본 사용법
def func1():
print('Hello World')
def func2(a, b):
return a * b
def func3():
return
func1() # Hello World
print(func2(10, 10)) # 100
print(func3()) # None
2. 함수도 객체다
대부분의 스크립트 언어와 같이 파이썬도 함수는 객체입니다. ( 일급 객체, 일급 함수에 대한 내용은 여기를 참고해주세요 ! )
따라서 함수를 호출할 때 함수를 넘길 수 있습니다.
def func1():
print('Hello World')
def func2(func):
func()
f = func1
func2(f) # Hello World
주의할 것은 def func2( func() ) 으로 선언할 경우, 함수를 인자로 넘기는 것이 아니라 리턴 값을 넘기는 것입니다.
3. unpacking을 통해 여러 객체를 튜플로 return 할 수 있다.
def func():
return 10, 'hello', {1, 2, 3}, (1, 2, 3)
r1, r2, r3, r4 = func()
print(r1, r2, r3, r4) # 10 hello {1, 2, 3} (1, 2, 3)
4. call by reference
파이썬은 인자를 전달할 때 call by reference 방식을 사용합니다.
그런데 immutable 객체를 인자로 전달할 경우, 값을 변경할 수 없습니다.
def func1(li):
li[0] = 10
a = [1, 2]
func1(a) # call by ref
print(a) # [10, 2]
def func2(i):
i = 20
b = 10
func2(b) # int는 immutable이므로, 값이 변경되지 않음
print(b) # 10
5. Scope Rule
Symbol table의 범위에는 Local scope , Global scope , Built-in scope가 있습니다.
Symbol table에 동일한 변수가 있다면, Local -> Global -> Built-in 순으로 탐색을 합니다.
( Symbol table에 대해서는 여기를 참고해주세요 ! )
Local scope에서 Global scope의 변수를 사용하고 싶으면, global 키워드를 붙이면 됩니다.
그러나 global 변수를 Local scope에서 사용하는 것은 바람직하지 않습니다.
x = 1
def func1():
x = 2
print(x) # 2 - local scope
print(x) # 1 - global scope
func1()
# global 키워드
x = 1
def func2():
global xx = 3
func2()
print(x) # 3
6. 함수의 인자
1) 기본 인자 값 전달
인자가 전달되지 않을 때 default를 설정할 수 있습니다.
def func(a, b = 2):
return a + b
print(func(1)) # 3
2) 가변 인자 리스트
개수가 고정되지 않은 인자를 전달할 때 사용하는 방식입니다.
파라미터명 앞에 * 또는 **를 붙임으로써 가변 인자라는 것을 명시합니다.
def func1(a, *args):
# args[0] = 10 => *args는 튜플로 전달되므로 값 변경 불가
print(a, args)
func1(1,2,3,4,5) # 1 (2, 3, 4, 5)
def func2(a, **args):
args['b'] = 50 # => **args는 딕셔너리 형으로 전달 되므로 값 변경 가능
print(a, args)
func2(10, b=20, c=30) # 10 {'b': 50, 'c': 30}
7. 람다( lambda ) 함수
람다 함수는 익명 함수를 의미합니다.
즉 함수의 이름을 작성할 필요가 없이 사용이 가능합니다.
람다 함수는 한 번 사용하고 마는 함수를 사용할 때 효과적이며, 네임 스페이스가 더렵혀지지 않는다는 장점이 있습니다.
형식 : ( lambda [매개변수]: 리턴값을 포함한 알고리즘 )( [매개변수 값] )
a = (lambda foo: foo * 2)(10)
print(a) # 20
# 매개변수가 없는 경우
b = (lambda : 10)()
print(b) # 10
람다 함수 내부의 로직은 한 줄로 밖에 작성할 수 없습니다.
여러 줄의 로직을 작성해야 한다면 def로 함수를 정의해야 합니다.
이상으로 Python의 함수에 대해 알아보았습니다.
함수도 객체라는 점과 unpacking을 통해 여러 값을 return 할 수 있다는 것, 인자 값을 default로 설정할 수 있다는 점이 특이하네요.