[ Python ] 고급문법

·2023년 5월 7일
0

[ Python ]

목록 보기
19/19

열거 가능 객체 (iterable)

📌 개념

for 문의 순회 대상 객체이다.

1️⃣ iter() 메서드로 열거 가능 객체를 획득한다.

▪️ iter( 호출가능한객체, 반복을끝낼값 ) 함수로 iter() 메서드를 호출할 수 있다.
▪️ 반복을 끝낼 값이 나오면 StopIteration 예외가 발생한다.
▪️ 만약 클래스를 직접 구현하고 멤버 변수에 리스트가 있는 상황에서, 그 리스트를 순회하려면 iter() 메서드의 반환 값에 iter( 해당리스트 ) 이런 식으로 iter 함수를 이용해 반환하면 된다.

2️⃣ 매 루프마다 next() 메서드를 통해 다음 요소를 받는다.

▪️ 첫 요소도 이걸로 받는다.
▪️ next( 반복가능한객체, 기본값 ) 함수로 next() 메서드를 호출할 수 있다.
▪️ 마지막 요소에서 next() 를 호출하는 경우에는 StopIteration 예외가 발생하고 반복문이 끝난다.

3️⃣ 만약 기본값을 설정하면 예외 대신 계속 기본값이 출력된다.

▪️ 이 예외는 for 문에서 내부적으로 처리한다.

📌 예제

📒 유사 기능 구현 예시

nums = [11, 22, 33]

it = iter(nums)
while True:
    try:
        num = next(it)
    except StopIteration:
        break
    print(num)

>>> 11
>>> 22
>>> 33

📕 iter, next 메서드 구현 예시

class Seq:
    def __init__(self, data):
        self.data = data
        self.index = -2

    def __iter__(self):
        self.index = -2
        return self

    def __next__(self):
        self.index += 2
        if self.index >= len(self.data):
            raise StopIteration
        return self.data[self.index:self.index + 2]

solarterm = Seq("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
for idx, k in enumerate(solarterm):
    if idx: 
        print(',', end=' ')
    print(k, end='')
print()

for idx, k in enumerate(solarterm):
    if idx: 
        print(',', end=' ')
    print(k, end='')
print()

print(', '.join(solarterm))

>>> 입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서
>>> 입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서
>>> 입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서

제너레이터 (Generator)

📌 개념

▪️ 함수에서 데이터를 연속해서 리턴한다. (yield)
▪️ 함수가 끝나거나 return을 실행하면 StopIteration 예외가 발생한다.
▪️ 순차적으로 반환을 하기 때문에 메모리 효율 측면에서 좋다.
▪️ range · enumerate · filter · zip

📌 예제

📒 유사 기능 구현 예시

def seqgen(data):
    for index in range(0, len(data), 2):
        yield data[index:index+2]

solarterm = seqgen("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")

print(solarterm)
print(dir(solarterm))

for k in solarterm: 
    print(k, end = ',')

print(','.join(solarterm)) # 출력 X

>>> 입춘,우수,경칩,춘분,청명,곡우,입하,소만,망종,하지,소서,대서

데코레이터(Decorator)

📌 개념

1️⃣ 일급 객체 ( first-class object, 일급 시민 )
: 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

2️⃣ 지역 함수
: 함수 안에 정의된 함수이다.

▪️ 함수가 정의된 함수 내에서만 사용할 수 있다.
▪️ 함수의 이름 충돌 방지용으로 사용할 수 있다.
▪️ 함수를 리턴할 경우 함수 밖에서도 사용할 수 있다.

3️⃣ 함수 데코레이터
: 이미 만들어진 함수에 동작을 추가한다.

▪️ 함수를 래핑(Wrapping)하여 함수의 앞뒤에 코드를 자동으로 추가한다.

📒 유사 기능 구현 예시

def inner():
    print("결과를 출력합니다.")

def outer(func):
    def wrapper():
        print("-"*20)
        func()
        print("-"*20)
    return wrapper

inner = outer(inner)
inner()

>>> 결과를 출력합니다.

📕 @데코레이터 메서드 구현 예시

def outer(func):
    def wrapper():
        print("-"*20)
        func()
        print("-"*20)
    return wrapper

@outer
def inner():
    print("결과를 출력합니다.")

inner()

>>> 결과를 출력합니다.

'''
profile
https://dribbble.com/ohseyun

0개의 댓글