우와한 개발자

[Python] 함수 - def, docstring, 호출 방식, 반환값, 중첩 함수

by 우와한개발자

1. 함수란?

  • 어떤 값을 입력받아 다른 값을 출력하도록 미리 만들어져 있는것
  • 인자는 없어도됨
def 함수명(인자1, 인자2, ...):
    실행할 구문
    return 반환값  # 생략 가능, 생략시 None 반환
  • 인자는 없어도 됨
⚠️ 쉼표(,)가 튜플을 만드는 것이지, 괄호가 튜플을 만드는 게 아님.
- return 10, 20 은 return (10, 20) 과 동일

 

2. docstring

  • 함수의 설명서
  • 함수 본문의 첫번째 문장에 작성
  • 한 줄인경우 " 또는 '
  • 여러줄인경우 """ 또는 ''' 사용
  • 첫 라인을 제외하고 들여쓰기 하지 않아도 됨
def my_function():
	""" docstring은
함수 첫 라인에 작성합니다"""

 

  • help(함수명) 또는 함수명.__doc__ 으로 확인 가능
def add(a, b):
    """두 수를 더한 값을 반환합니다."""
    return a + b

print(add.__doc__)  # 두 수를 더한 값을 반환합니다.

 

3. 함수 네이밍 규칙

  • 함수명은 스네이크 케이스(snake_case) 로 작성하는 것이 원칙
경우 표기법 예시
일반 함수 snake_case get_triangle()
사람 이름, 알고리즘 등 고유명사 CamelCase BubbleSort(), KMeans()

 

4. 함수 호출

1) 값에 의한 호출

  • 파이썬에서 모든 데이터는 객체이지만 함수 안에서 할당연산자(=)로 변수를 변경하는 경우 함수 밖의 변수에 영향을 주지 않음.
  • 즉, 지역 변수는 전역변수에 영향을 주지 않음
a = 100

def func(x):
    x = 200
    print(x)

func(a) #200
print(a) #100

 

2) 참조에 의한 호출

  • 리스트 등의 경우는 함수 안에서 참조연산자(.)로 객체를 변경하는 경우 내부 값은 바뀜
list =[1,2,3]

def func2(x):
    x.append(4)
    
func2(list)
print(list) #[1, 2, 3, 4]

 

5. 함수 이름 변경

  • 변수에 함수 자체를 할당하면 새로운 이름이 생기는 것과 같음
x=100

def my_func():
	print("hi")

# 함수 객체 자체를 변수에 할당한 것. 아직 실행되지 않음
myfunc2 = my_func

 # 함수를 즉시 실행한 뒤, 그 반환값을 변수에 할당한 것 
 # 이 함수는 return이 없으므로 myfunc3에는 None이 저장됨
myfunc3 = my_func()

 

6. 함수 반환

  • return이 없으면 자동으로 None을 반환.
  • return 값이 여러 개인 경우 튜플로 반환됨
# 1개 → 그냥 그 값 그대로 반환
def func1():
    return 10
print(type(func1()))    # <class 'int'>

# 여러 개 → 튜플로 반환
def func2():
    return 10, 20
print(type(func2()))    # <class 'tuple'>

# 없음 → None 반환
def func3():
    pass
print(type(func3()))    # <class 'NoneType'>

# 명시적으로 튜플로 반환
def func4():
    return (10,)        # 1개짜리 튜플을 반환하고 싶으면 쉼표 필요
print(type(func4()))    # <class 'tuple'>

 

 

1) 함수 객체 자체를 반환 (함수형 API)

def outer(num):
	def inner(num):
		print(num)
	return inner

outer(10)(5)  #가능 :함수형 API 

 

2) 중첩 함수에서 탈출 (nonlocal)

  • 중첩 함수에서 바깥 함수의 변수를 변경하려면 nonlocal 키워드 사용
  • nonlocal 없이 바깥 변수를 수정하면 새로운 지역변수로 처리됨
  • 자바처럼 label 없음.
def outer():
    count = 0

    def inner():
        nonlocal count   # 바깥 변수 참조 선언
        count += 1
        print(count)

    return inner

f = outer()
f()  # 1
f()  # 2
f()  # 3

 

  • nonlocal vs global 비교
키워드 범위
nonlocal 바로 바깥 함수의 변수
global 파일 전체(전역) 변수

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기