Python/이론, 기초

[Python] 파이썬 단계적 함수, 함수 안에 함수 선언

파송송 2023. 5. 4. 12:10
728x90

함수 선언

함수 안에 함수를 선언하는 방법은 그냥 안에 선언해 주면 된다.

def 함수이름1():
    코드
    def 함수이름2():
        코드

def add_num():
    a = 1
    b = 2

    def add():
        return a+b
print(add_num())
print(add()) # 에러 발생
None

def add_num():
    a = 1
    b = 2
    def add():
        return a+b
    return add()
print(add_num())
3

add 함수는 add_num 안에 있기 때문에 직접적으로 접근하지 못하고 add_num()을 통해 접근해야 한다.


지역 변수

각 함수의 지역 변수 접근 범위는 아래와 같다. add는 add_num의 변수에 접근할 수 있지만 add_num은 add의 변수에 접근할 수 없다.

def A():
    a = 10 # A의 지역변수 a
    b = 20 # A의 지역변수 b
    def B():
        b = 15 # b에 15 할당
        print(b)
        return a+b
    print(B())
    return a, b # A의 지역변수 a, b
print(A())
15
25
(10, 20)

nonlocal

A의 지역변수 b를 B에서 변경하고 싶다면 nonlocal 키워드를 사용하면 된다.

nonlocal은 함수 밖의 지역 변수를 사용하겠다는 의미이다.

def A():
    a = 10
    b = 20
    def B():
        nonlocal b
        b = 15
        print(b)
        return a+b
    print(B())
    return a, b
print(A())
15
25
(10, 15)

순서

이런 단계적 함수 사용은 자주 쓰지 않고 함수마다 같은 이름의 변수를 사용하는 것을 좋지 않다. 최대한 변수 이름 다르게 지어주자...!

nonlocal은 해당 함수의 가까운 함수부터 탐색한다.

def A():
    a = 10
    b = 20
    def B():
        b = 100
        def C():
            nonlocal a
            nonlocal b
            a += 10
            b += 15
            print(b)
            return a+b
        print(C())
    B()
    return a, b
print(A())
115
135
(20, 20)


global

몇 단계가 겹쳐있는 global 키워드를 사용하면 전역변수를 사용할 수 있다.

아래의 코드에서 nonlocal b 대신 global b를 사용하면 전역변수 b가 없기 때문에 에러가 발생한다.

 

*전역변수란 함수 밖에서 선언된 변수로 함수 실행이 끝남과 동시에 사라지는 지역 변수와 다르게 늘 존재한다.

a = 100
def A():
    a = 10
    b = 20
    def B():
        b = 100
        def C():
            global a
            nonlocal b
            a += 10
            b += 15
            print(b)
            return a+b
        print(C())
    B()
    return a, b
print(A())
115
225
(10, 20)

728x90