본문 바로가기
PROGRAMMING/PYTHON

[Python] 함수

by 안녕나는현서 2021. 4. 25.
728x90

- 함수

  • 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드 집합
  • 함수는 자체 제작가능하고 내장 함수도 존재함
    • 내장 함수 : len(), input(), range() 등

 

 

- 함수 사용 이유

  • 반복적인 프로그래밍 피할 수 있음
  • 모듈화로 전체적인 코드의 가독성이 좋아짐
  • 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수 가능
  • 함수가 동작한 후에 어떠한 결과가 나오는지만 알면 함수 내부 구조를 몰라도 사용하는 데 문제가 없음

 

- 순수 함수(pure function)

  • 결과값 반환외에 외부에 영향을 주지 않는 함수
  • 함수형 프로그래밍 지원 언어에서는 순수 함수를 인자, 반환값으로 사용

 

- 함수의 구조

def 함수명(매개변수) :
     실행문장
     return 반환변수
- def : 함수 선언

- 함수 호출 : 함수명(인수 or 인자)

- return
  • 함수의 결과값을 돌려주는 명령어 (함수가 수행 결과를 호출한 곳으로 돌려줄 필요가 있는가를 결정하는 요인)
  • 바로 출력하는 것이 아닌 함수 내의 변수에 저장하게끔 하는 기능
  • print문은 수행만을 하는 것! 결과값은 없음
  • 결과값을 반환하는 것은 오직 return
- 매개변수(parameter)
  • 함수에 입력으로 전달된 값을 받는 변수 (함수에 입력 값을 전달해야 하는가를 결정하는 요인)
  • 함수 선언할 때 ()안의 값
- 인수(arguments)
  • 함수를 호출할 때 전달하는 입력값 
  • 함수 사용할 때 ()안의 값

 

- 매개변수와 반환 값이 있는 함수

def add(a, b) :
    result = a+b
    return result​
add(3,4)

 

- 매개변수는 없고 반환 값이 있는 함수

# 입력값이 없는 함수

def say() :
    return 'Hi'
say()

 

- 매개변수는 있고 반환 값이 없는 함수

# 결과값이 없는 함수

def add(a,b) :
    print(f'{a}, {b}의 합은 {a+b}입니다.')
a = add(3,4)

print(a)  #None->결과값이 없다는 뜻

 

- 매개변수와 반환 값이 없는 함수

# 입력값도 결과값도 없는 함수

def say():
    print('Hi')
say()

 

- 함수의 결과값은 언제나 하나

def add(a,b) :
    return a+b, a-b

add(5,2) # -> 튜플의 형태로 하나로 반환

 

- 가변 매개변수(variable parameters)

  • 함수 호출시 몇 개의 인수가 전달될 지 알 수 없다면, 사용자가 직접 매개변수의 개수를 정할 수 있도록 선언
  • 전달된 인수는 모두 모아서 튜플 형태로 저장
  • 언팩 연산자(*) 사용
  • 가변 매개변수를 가장 마지막 매개변수로 지정해야 부작용 없이 사용 가능
def 함수명(*매개변수) :
    실행문장
    return 반환변수
def add(*args) :
    result = 0
    
    for i in args :
        result += i
    
    return result
add(1, 2, 3, 4, 5, 6)

 

- 매개변수 기본값 설정(default parameters)

  • 기본값을 가지는 매개변수는 일반 매개변수 앞에 위치할 수 없음(맨 마지막에 두는 것이 좋음)
def say_myself(name, old, man=True) :
    print(f'나의 이름은 {name}입니다.')
    print(f'나이는 {old}살 입니다.')
    if man :
        print('남자입니다.')
    else :
        print('여자입니다.')
say_myself('홍길동', 27) # 3번째 인자값을 생략하면 기본값이 사용됨

say_myself('유관순', 27, False)

 

- scope

  • 변수의 유효범위
  • 어디서나 접근 가능한 전역 변수 : 전역 스코프
  • 함수 내에서만 접근 가능한 지역 변수 : 함수 스코프
def test_scope(a) :
	result = a + 1
    print('\n\ttest_scope() 안에서의 a의 값 : {}'.format(a))
    print('\ttest_scope() 안에서의 result의 값 : {}\n"\'.format(result))
    return result
    
x = 5
print('test_scope() 호출 전 x의 값 : {}'.format(x))

ret_val = test_scope(x) # 호출
print('test_scope() 함수가 반환한 값 : {}'.format(ret_val))
print('test_scope() 호출 후 x의 값 : {}'.format(x))

  • 변수에 접근하는 절차
    1. 함수 스코프 내에서 가장 먼저 변수를 찾음
    2. 함수 스코프 내에 변수가 없을 경우, 전역 스코프에서 변수를 찾음
# 1순위

 a = 1
 
 def scope() :
 	a = 2        # 함수 스코프 내에서 가장 먼저 변수 찾음
    print(a)
    
scope()
print(a)

# 2순위

a = 1           # 2. 전역 스코프에서 변수를 찾음

 def scope() :
    print(a)    # 1. 함수 스코프 내에 변수가 없을 경우
    
scope()
print(a)
  • 위와 같은 절차때문에 지역변수와 전역변수 이름이 같을 경우, 전역변수가 가려져 접근 못할 수 있음
    • 접근하고자 하는 전역변수 앞에 global을 기술
# 함수 내에서 global 변수에 접근하기

def chane_global() :
	global x            # 함수 내에서 x는 전역 변수를 가리킴
    x += 1              # 변수 x의 값 5가 인자로 전달되고, 1을 더한 결과값 반환
    
    
x = 5                   # 변수 x에 5 할당
change_global()         

print('전역변수 x의 값 : {}'.format(x))   # 지역 스코프 내에서 변경된 6이 출력됨

 

- lambda

  • def와 동일한 역할
  • 함수를 한 줄로 간결하게 만들 때 사용 -> lambda 매개변수 : 반환값
  • def를 사용할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 사용
  • 함수의 매개변수에 직접 인자로 전달 가능
add = lambda a, b : a+b
add(3,4)

 

- 클로저

  • 중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근 가능
  • 중첩함수 자체를 반환값으로 사용한다면?
    • 정보 은닉 구현 가능
    • 전역변수 남용 방지
    • 메서드가 하나밖에 없는 객체를 만드는 것보다 우아한 구현 가능
def outer_func() :
	id = 0            # 지역변수
    
    def inner_func() :
    	nonlocal id   # 변수 id 접근 시 outer_func함수 스코프에서 찾게 만듦
        id += 1
        return id
        
    return inner_func # inner_func함수 호출이 아닌 함수에 대한 참조를 반환
    
make_id = outer_func()

print(f'make_id() 호출의 결과 : {make_id()}')
print(f'make_id() 호출의 결과 : {make_id()}')
print(f'make_id() 호출의 결과 : {make_id()}')

728x90

'PROGRAMMING > PYTHON' 카테고리의 다른 글

[Python] 클래스  (0) 2021.04.26
[Python] 파일  (0) 2021.04.26
[Python] 딕셔너리  (0) 2021.04.25
[Python] 반복문  (0) 2021.04.25
[Python] 리스트, 튜플  (0) 2021.04.25

댓글