[Python] 함수(Function)

y = f(x)#

  • 특정 역할을 수행하는 코드 집합을 하나의 단위로 묶어놓은 것
  • 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것

Python의 함수적 특징#

1. 사용자 정의 함수 (User define function)#

  • 함수를 정의할 때 사용하는 keyword : def
  • 함수명을 정의할 때 가독성이 있는 이름으로 정의해야한다.
    • 숫자로 시작하면 안되고 대문자로 시작하지 않는다.
    • 대문자로 시작하게 되면 Class를 지칭할 때와 겹치기 때문에 주의해야한다.
    • _를 이용해서 의미를 구분해도 좋다 다른 특수기호는 쓰지 말것
    • 함수 표현 : name_search, 클래스 표현 : NameSearch
    • 다른 함수와 겹치지 않고 이미 사용하는 용어를 사용하지 않게 잘 지어야 한다.
    • 단일 단어로 사용하는건 권장하지 않음
    • jupyter notebook 기준 녹색은 이미 있는 word, 파란색이 사용가능한 word로 ide별로 구분되서 알려주는경우가 있음
def my_sum(a, b):
    print('입력받은 값은 {}, {} 입니다.'.format(a, b))
    return a + b

print(my_sum(100, 100))
# --- result ---
# 입력받은 값은 100, 100 입니다.
# 200
  • (객체지향 제외하고 일단 naive하게 한다면) 인자값을 받을 환경이 달라질 때마다 함수를 새로 정의해야하는 상황이 있음
  • 이럴 때 다수의 인자를 전달할 수 있는 방법이 있음
  • 인자 부분에 wildcard * 를 이용하여 표현해도 된다. 이때 tuple 형태로 입력데이터를 받는다.
def my_sum(*a):
    print('입력받은 값은 {} 입니다.'.format(a))
    result = 0
    for tmp in a:
        result += tmp
    return result

print(my_sum(100, 100, 1, 2, 3, 4, 5, 6))
# --- result ---
# 입력받은 값은 (100, 100, 1, 2, 3, 4, 5, 6) 입니다.
# 221

2. Python의 메모리 특성#

  • 특정 변수가 가지고 있는 주소값을 알고 싶을 때: id()
  • 숫자는 많이 사용하기에 메모리 효율성을 위해 int 256까지(System마다 상이함)는 객체를 1개만 만들어서 공유해서 사용한다.
  • Python은 1급함수를 지원하기에 함수의 address만 넘겨서 처리가 가능하다.
print(id(a))
 # 140720166120960 
#  정수값으로 표현된 메모리 주소, 직접 접근은 안되니 컨버팅된 주소가 나온 것

a = [1, 2, 3] # 2014906646408
print(id(a))
b = [1, 2, 3] # 2014906566664
print(id(b))
print(a == b) # True 내용이 같은가? Yes
print(a is b) # False 메모리 id까지 공유해서 같은가? No

a = 50
b = 50
print(a is b) 
# True 숫자는 워낙 많이 사용하기 때문에 메모리 효율성을 위해 int 256까지(System마다 상이함)는 객체를 1개만 만들어서 공유해서 사용

a = 256
b = 256
print(a is b)

a = 257
b = 257
print(a is b)

# python은 함수의 address만 넘겨서 처리가 가능하다 즉 1급 함수를 지원한다.
def test_func(a, b):
    print("안녕하세요")
    result = a + b
    return result

def testing(hoho):
    hoho(10, 20)
    
testing(test_func)

3. 함수의 결과값은 언제나 하나이다.#

  • 각 함수의 값은 무조건 하나
  • 여러개의 return값이 나오는 것처럼 보이지만, 실제로는 다르다.
def my_return(a, b):
    return a+b, a*b

result = my_return(3, 4)
  • 위의 코드만 보면 오류가 날 것 같지만, 함수의 결과값은 2개가 아니라 언제나 1개이기 때문에 my_return 함수의 결과값 a+b, a*b는 튜플 값 하나인 (a+b, a*b)로 돌려준다.
  • 만약 반대로 여러개의 결과값처럼 받고 싶다면 다음과 같이 호출하면 된다.
>>> result1, result2 = add_and_mul(3, 4)

4. 매개변수에 초기값 미리 설정하기.#

  • Python의 함수는 default parameter를 사용할 수 있다.
  • 이를 통해서 인자를 미리 설정해서 생략하여 입력받을 수 있다.
  • 단, 맨 마지막 인자에만 적용이 가능하다.
def say_myself(name, old, man=True): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

say_myself("박응용", 27)
say_myself("박응용", 27, False)

5. local variable vs. global variable#

  • 일반적으로는 함수안에서 함수 밖의 변수를 변경하기 위해서 return을 이용한다.
  • global variable를 이용하고 싶으면 global로 선언하여 사용하면 된다.
tmp = 100

def my_var(x):
    global tmp
    tmp += x
    return tmp

print(my_var(100))