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 x

x = 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로 설정할 수 있다는 점이 특이하네요.