Python

함수2 - 함수의 종류

김아다만티움 2022. 3. 7. 12:08

* 바로 쓰는 파이썬, 박진수, 서울대학교출판문화원

함수가 간단할 줄 알았는데 간단하지 않아서 당황스럽...

 

 

  이번 포스트에서 다룰 내용은 함수의 종류입니다. 크게 1. 전역함수 & 지역함수, 2. 람다함수, 3. 메서드를 정리해보겠습니다. 

 

1. 전역 함수(global function) & 지역 함수(local function)

  전역 함수는 일반 함수로 생각하면 됩니다. 같은 모듈(하나의 .py 파일 내부) 안에서는 어디서든 사용 가능합니다. 다른 모듈에서 전역 함수를 사용하려면 다른 모듈/라이브러리를 import하여 사용할 수 있습니다. 또한 당연히 파이썬 자체 내장 함수(i.e. print(), len())도 전역 함수이기에 어디서든 사용 가능합니다.

1
2
3
4
5
6
7
8
9
10
def rectangle_area(height, width)
    return height * width
 
rectangle_area(105# 50
 
 
def triangle_area(base, height)
    return base * height * 0.5
 
triangle_area(105# 25.0
cs

 

  반면 지역 함수(=내재 함수)는 함수 안에서만 정의된 함수입니다. 따라서 해당 함수 안에서만 사용이 가능하고, 다른 함수 혹은 프로그램에서 호출해 사용할 수 없습니다. 때문에 지역 함수는 특정 함수 안에서 여러번의 작업을 수행하는 도우미 함수로 활용됩니다.  

1
2
3
4
5
6
7
8
def display_stand(product):
    def display_num():
        import random
        return random.randint(1,99)
    print('{}: {}번 진열대에 배치하세요.'.format(product, display_num()))
 
display_stand('연필')
# 연필: 60번 진열대에 배치하세요.
cs

def display_stand... 밑에 def display_num... 이라는 함수가 하나 더 있습니다. 얘가 바로 지역 함수 입니다. 지역함수를 단독으로 사용하려고 하면 다음과 같은 NameError가 뜨므로, 지역 함수는 자기가 딸린 함수 안에서만 사용할 수 있음을 알 수 있습니다.

 

 

2. 람다 함수(lambda function)

  람다 함수는 함수 사용 시점에 표현식 형태로 정의하여 바로 사용할 수 있는 함수입니다. 즉 def......의 과정 없이 바로 간결하게 함수 사용이 가능합니다. 람다 함수는 다음과 같이 표현되며 몇가지 제약 사항들이 있습니다.

lambda parameter: 표현식

  1) 람다 함수는 매개변수(parameter)를 설정하면 일반적으로 위치 매개변수의 형태를 띕니다.

      또한 매개변수는 선택사항이며, 한 개 이상도 사용 가능합니다.

  2) 표현식은 계산한 값을 반환합니다. 

    - 다만 표현식에 return(yield)은 사용할 수 없습니다.

    - 조건문, 순환문도 사용할 수  없습니다. 그러나 간편 조건문은 사용 가능합니다.

    - 표현식이 튜플이면 표현식을 반드시 괄호 안에 넣어주어야 합니다. 

 

 

  람다 함수는 정의 후 변수에 저장해주어야 합니다. 이름이 없기 때문에 익명 함수(anonymous function)이라고도 합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
def say_anything(anything):
    return print('안녕', anything)
 
say_anything('파이썬'# 안녕 파이썬
 
 
# 람다 함수화
lambda anything: print('안녕', anything)
 
# 변수에 저장하여 사용
talk = lambda anything: print('안녕', anything)
talk('파이썬'# 안녕 
cs

위와 같이 일반 함수를 람다 함수로 정의할 수 있으며, 람다 함수는 변수에 저장하여 사용하여야 합니다. 

 

  좀 더 복잡한 람다 함수의 예도 있습니다. 파일 하나면 file, 파일 두 개 이상이면 files가 출력되는 함수입니다.

1
2
3
4
5
6
7
8
= lambda i: '' if i == 1 else 's'
count = 1
print('{} file{} proceed'.format(count, x(count)))
# 1 file proceed
 
count = 5
print('{} file{} proceed'.format(count, x(count)))
# 5 files proceed
cs

람다 함수 표현식은 i가 1일 경우는 아무것도 붙이지 않지만(''), 그게 아니라면 s를 붙이란 뜻입니다. 

 

  람다 함수의 매개변수에 여러개의 매개변수를 놓을 수도 있습니다. 

1
2
3
4
5
6
7
8
9
10
def rectangle_area(height, width)
    return height * width
 
rectangle_area(105# 50
 
 
lambda height, width: height * width
rec = lambda height, width: height * width
 
rec(105# 50
cs

 

 

3. 메서드(method)

  메서드는 클래스(class) 내부에 구현된 함수를 말합니다. 클래스와 관련이 있는 함수기 때문에 해당 클래스와 같이 사용해야 하며 '.'을 사용합니다. 문자열.format()으로 사용되는 format()이 대표적인 메서드입니다. 

1
2
3
4
5
class myclass:
    def say_anything(self):
        print('안녕'self)
 
myclass.say_anything('파이썬'# 안녕 파이썬
cs

say_anything() 함수는 클래스 myclass에 속한 메서드이기 때문에 클래스/클래스의 인스턴스와 함께 호출해야 합니다. 클래스 인스턴스는 okt = Okt() 중 굵은 글씨를 말합니다. 아무튼 함께 호출하는 것은 '클래스.메서드'로 합니다.

모든 메서드는 함수입니다. 그러나 기본적으로 메서드는 클래스 내의 함수이기 때문에, 모든 함수가 메서드가 되지는 않습니다.