ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python # 6 함수
    공부/Python 2021. 5. 12. 09:41

    함수의 개념과 목적

    함수

    : 프로그램에서 어떤 특정 기능을 수행할 목적으로 만들어진 재사용 구조의 코드 부분

    함수의 장점

    1. 하나의 큰 프로그램을 여러 부분으로 나눌 수 있기 때문에 구조적 프로그래밍이 가능해짐
    2. 동일 함수를 여러 곳에서 필요할 때마다 호출할 수 있다
    3. 수정이 용이하다

    함수 사용방법

    함수의 호출

    예제 : print()

    함수의 선언

    문법

    def 함수명 (매개변수) :
        명령문
        return문

    예제1

    def calc_sum(x, y) :
        return x + y
    
    a, b = 2, 3
    
    c = calc_sum(a, b) # 반환값 5가 변수 c 에 저장
    d = calc_sum(a, c) # 반환값 7이 변수 c 에 저장
    

    함수의 선언 위치가 중요하다

    함수의 유형

    매개변수

    : 함수에 입력 값을 전달해야 하는가를 결정하는 요인

    반환 값

    : 함수가 수행 결과를 호출한 곳으로 돌려줄 필요가 있는가를 결정하는 요인

    1. 매개변수와 반환 값이 있는 함수
    2. 매개변수는 없고 반환 값이 있는 함수
    3. 매개변수는 있고 반환 값이 없는 함수
    4. 매개변수와 반환 값이 없는 함수

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

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

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

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

     

    함수와 매개변수

    매개변수

    함수 호출시 입력 값을 전달 받기 위한 변수
    전달받은 인자의 값에 의해 타입이 결정됨
    선언된 매개변수의 개수만큼 인자 전달 가능

    언팩 연산자 (*)

    매개변수의 개수를 가변적으로 사용할 수 있게 해준다
    매개변수에 적용 시 인자를 튜플 형식으로 처리한다

    def sum(*params) :
        total = 0
    
        for val in params :
            total += val
        return total
    
    ret_val = sum(1, 2)

    주의사항

    가장 마지막 배개변수로 지정해야 오류가 나지 않는다

    def sum(p, *params) :
        if p == 0 :
            total = 0
        elif 0 < p < 1 :
            total = 0.0
    
        for val in params :
            total += val
    
        return total
    
    ret_val = sum(0, 1, 2)

    언팩 연산자를 사용하는 튜플 형식의 반환값

    def sum(p1, p2, *params) :
        if p1 == 0 :
            total1 = 0
        elif 0 < p1 < 1 :
            total1 = 0.0
    
        if p2 == 0 :
            total2 = 0
        elif 0 < p2 < 1 :
            total2 = 0.0
    
        for val in params :
            total1 += val
            total2 += val
    
        # 튜플을 반환해서 하나 이상의 값을 반환할 수 있다
        return total1, total2 
    
    ret_val = sum(0, 1, 2)

    키워드 언팩 연산자 (**)

    매개변수의 개수를 가변적으로 사용할 수 있도록 함
    키워드 인자들을 전달해 매개변수를 딕셔너리 형식으로 처리함

    def keyword(**params) :
    
        # 매개변수 params 에서 .keys() 함수를 통해 키 리스트 구함
        for k in params.keys() :
            print("{0} : {1}".format(k, params[k]))
    
    # 키 = 값 형식으로 전달하면, params 매개변수에 딕셔너리 형식으로 전달
    keyword(a=1, b=2, c=3)

    기본 값을 갖는 매개변수

    주의사항

    기본 값을 가지는 매개변수는 일반 매개변수 앞에 위치할 수 없다

    
    # +를 기본으로 지정
    def calc(x, y, operator="+") : 
        if operator == "+" :
            return x + y
    
        else :
            return x - y
    

    scope

    변수의 유효범위

    
    # a와 result 는 지역변수
    def test_scope(a) :
       result = a + 1
       retrun result
    
    # 전역변수
    x = 5
    
    ret_val = test_scope(x)

    global

    함수내에서 전역변수에 접근할 수 있다

    
    def global_val() :
        # x는 전역변수를 가리킴
        global x 
    
        # 변수 x의 값 5가 인자로 전달되고, 1을 더한 6을 결과값으로 반환
        x += 1
    
    x = 5
    global_val()
    
    print("전역변수 x의 값: {0}".format(x))
    
    > 전역변수 x의 값: 6
    

    고급 함수 사용법

    중첩 함수

    함수 내에 중첩함수를 선언해 상용 가능

    1. 중첩함수를 포함하는 함수 내에서만 호출이 가능함
    2. 중첩함수를 포함하는 함수의 스코프에도 접근이 가능함

    -> 함수 내에서 직접 선언해 호출할 수도 있고, 함수의 매개변수로 함수 인자를 전달받아 함수 내에서 호출해서 사용 가능

    프로그램의 유연성을 높이기 위해 함수를 매개변수로 전달한다

    def calc(operator_fn, x, y) :
        return operator_fn(x, y)
    
    def plus(op1, op2) :
        return op1 + op2
    
    def minus(op1, op2) :
        return op1 - op2
    
    
    ret_val = calc(plus, 10, 5)
    print("calc(plus, 10, 5)의 결과 값 : {0}".format(ret_val))
    
    ret_val = calc(minus, 10, 5)
    print("calc(minus, 10, 5)의 결과 값 : {0}".format(ret_val))
    
    

    람다식

    
    Lambda 매개변수 : 반환값
    1. 변수에 저장해 재사용이 가능한 함수처럼 사용함
    2. 기존의 함수처럼 매개변수의 인자로 전달함
    3. 함수의 매개변수에 직접 인자로 전달함
    
    def calc(operator_fn, x, y) :
        return operator_fn(x, y)
    
    ret_val = calc(lambda a, b: a + b, 10, 5)
    print("calc(lambda a, b: a + b, 10, 5)의 결과 값 : {0}".format(ret_val))
    
    ret_val = calc(lambda a, b: a - b, 10, 5)
    print("calc(lambda a, b: a - b, 10, 5)의 결과 값 : {0}".format(ret_val))
    

    클로저

    1. 중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근 가능
    2. 중첩함수 자체를 반환값으로 사용한다면?
      1. 정보 은닉 구현 가능
      2. 전역변수의 남용 방지
      3. 메서드가 하나밖에 없는 객체를 만드는 것보다 우아한 구현 가능
    
    def outer() :
        id = 0
    
        def inner() :
            # 변수 id 가 중첩함수인 inner 함수의 지역변수가 아님
            # 변수 id 접근시 outer 함수 스코프에서 찾게 만든다
            nonlocal id
            id += 1
    
            return id
    
        # inner 함수 호출이 아닌 함수에 대한 참조를 반환한다
        return inner
    
    
    make_id = outer()
    
    
    # 중첩함수 inner 호출
    # outer 함수의 지역변수 id 1씩 증가
    # 증가된 id 값 반환
    # 출력
    print("make_id() 호출의 결과 : {0}".format(make_id()))
    print("make_id() 호출의 결과 : {0}".format(make_id()))
    print("make_id() 호출의 결과 : {0}".format(make_id()))
    
    # 결과
    make_id() 호출의 결과 : 1
    make_id() 호출의 결과 : 2
    make_id() 호출의 결과 : 3
    
    

    예제

    함수를 활용하여 원의 둘레와 면적 구하기

    1. 반지름 입력
    2. 원의 면적 계산
    3. 원의 둘레 계산
    
    PI = 3.14
    
    def input_radius() :
        radius_str = input("반지름을 입력하세요: ")
        return float(radius_str)
    
    def calc_circle_area(r) :
        return PI * r * r
    
    def calc_circumference(r) :
        return 2 * PI * r
    
    radius = input_radius()
    circle_area = calc_circle_area(radius)
    circumference = calc_circumference(radius)
    
    print("원의 면적: {0:0.2F}, 원의 둘레: {1:0.2F}".format(circle_area, circumference))
    
    
    
    반응형

    '공부 > Python' 카테고리의 다른 글

    Python #8 모듈  (0) 2021.05.23
    Python #7 내장 함수  (0) 2021.05.12
    Python #5 for  (0) 2021.05.12
    Python #4 if  (0) 2021.05.12
    Python #3 연산자  (0) 2021.05.12

    댓글

Designed by Tistory.