IT world

[Python] 24.01.17 함수 심화(2)와 모듈에 대해서 본문

모두의 연구소(오름캠프)/AI 모델 활용 백엔드 개발 과정

[Python] 24.01.17 함수 심화(2)와 모듈에 대해서

엄킹 2024. 1. 17. 17:43

오늘은 함수의 심화(클로저, 데코레이터, args/kwargs, 제너레이터, nonlocal)와 모듈에 대해 교육을 받았다.

예외처리, 람다, 이터레이터은 앞 게시물에서 내용을 다뤘으니 해당 내용을 참고하면 될 것 같다.

 

클로저(Closure)란

함수 내 함수가 외부 변수를 참조하여 보존하는 것을 말한다.

즉 어떤 함수의 내부 함수가 외부 함수의 변수를 참조할 때, 외부함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있도록 어딘가에 저장하는 함수를 의미한다.

 

클로저 함수는 아래 조건을 충족해야한다.

  • 어떤 함수의 내부 함수일 것
  • 그 내부 함수가 외부 함수의 변수를 참조할 것
  • 외부 함수가 내부 함수를 리턴할 것

[클로저 예시]

 

해당 inner_function() 함수는 클로저 함수이며 outer_function()함수의 내부 함수로 존재하고 외부함수인 outer_function()의 x값을 참조하고 있으며 outer_function함수가 inner_function함수를 반환하고 있는 클로저 조건을 충족하고 있다.

 

inner_function 함수는 외부함수의 변수 x를 참조하고 있으므로 x의 상태를 기억하고 있다. 따라서 해당 출력 결과를 확인할 수 있다.

 

데코레이터(Decorator)란

함수나 메서드에 적용되어, 해당 함수나 메서드의 기능을 확장하거나 추가, 변경하는 역할로 @기호와 함꼐 사용되며 함수 또는 메서드 위에 위치한다.

 

데코레이터는 기본적으로 함수를 인자로 받고, 또 다른 함수를 반환하는 고차 함수이다. 데코레이터를 사용한 함수는 자기 자신을 인자로 사용하여 해당 함수에 사용된다.(하나 함수를 인자로 받아 기능 추가 또는 변경된 새로운 함수를 반환)

[데코레이터 예시1]

 

simple_decorator 함수는 데코레이터 함수로, 인자로 받는 function 파라미터는 실제 수행되는 함수 hello 함수를 인자로 받아 wrapper 함수를 반환한다 hello 함수를 호출하면 데코레이터가 추가한 내용과 함께 hello 함수의 내용이 출력된다.

[데코레이터 예시2]

 

*args란

*args(아규먼츠)는 임의의 개수의 인수(arguments)를 뜻하며 여러 개의 인수를 받아서 튜플 형태로 저장해준다.

여러개의 인자값을 받겠다는 의미로, 가변인자를 위한 변수인데, 한마디로 우리가 함수를 만들때 인자를 몇개 받아야할지 모르는 경우 사용하는 변수이다.

[*args 예시]

 

이렇게 여러개의 인자를 하나의 변수로 받을 때 사용하며, 전달된 값 모두 하나의 변수(args)에 묶인 것을 볼 수 있고 튜플을 통해 패킹된 것을 확인할 수있다.

 

일반 파마미터와 함께 사용한다면 일반 파라미터에 각각 값을 할당한 후 남은 개수의 값을 패킹한다. 다만 이렇게 선언할 때에는 아규먼트 뒤로 일반 파라미터를 사용하지 않도록 해야한다.

 

**kwargs란

*kwargs(기워드 아규먼츠)는 딕셔너리로 가변 아규먼트를 받을 수 있는 방법이다. 여러개의 키워드 인수를 받아 딕셔너리 형태로 저장된다.(**kwargs는 (키워드=특정 값) 형태로 함수를 호출하고 kwargs {'키워드':'특정 값'} 형태로 저장)

[**kwargs 예시]
[코드 예시]

 

제너레이터(Generator)란

제너레이터는 이터레이터를 생성해주는 함수로, yield 키워드를 사용하여 만든다.  

이 객체를 호출할때마다 yield가 작동하여 값을 순차적으로 산출한다.(함수의 내부 로컬 변수를 통해 내부 상태가 유지된다.)

 

제너레이터는 함수 실행 중간에 값을 반환할 수 있고, 이후 함수의 실행을 계속할 수 있는 특징을 가지고 있다(내부 값이 유지됨) 이를 통해 메모리를 효율적으로 관리하며 코드의 가독성을 향상시킨다.

[제너레이터 예시]

 

my_generater 함수는 x에서 할당 받은 값을 yield로 i값으로 넘겨주고 다시 호출될때까지 대기하며 이를 통해 넘겨주는 값이 없을 때까지 순회하며 출력한다.

[제너레이터 예시2]

 

nonlocal이란

파이썬의 키워드 중 하나로, 중첩 함수 내부에서 바깥 함수의 변수를 참조할 수 있게 한다.

말 그대로 해당 변수는 local이 아니다라고 선언해주는 키워드다. 즉 상위 함수에 변수를 참조한다고 미리 선언하는 것. 전역변수를 제외한 바로 위의 함수에서 사용되는 변수와 바인딩 되어 참조하도록 한다.

 

nonlocal을 사용할떄는 반드시 참조하는 변수가 실제로 바깥 함수에 존재하는지 확인해야한다.

[nonlocal 예시]

 

모듈(module)이란

모듈은 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일로 다른 파이썬 코드에서 그것들을 불러와 재사용할 수 있도록 한 것이다. 

 

모듈은 한 번 작성한 코드를 여러 프로젝트나 여러 곳에서 사용할 수 있기 때문에 재사용성이 높고, 유지보수하기 쉽다. 또한 모듈은 자체의 네임스페이스를 갖기 때문에 모듈간에 같은 변수가 있다고 하더라도 충돌 없이 코드를 구조화 할 수 있다.

    import info # info.py를 가져오겠다

    print(info.name) # 이런식으로 info라는 파이썬 파일 내에 작성된 변수와 함수를 호출한다.
    info.hello()

 

코드 작성자인 내가 직접 info.py 파일을 만들어 해당 파이썬 파일에서 변수와 함수를 호출한 예시이다. 

Comments