파이썬

파이썬 고급 문법

watervin 2022. 1. 17. 14:30

고급 문법


열거 가능 객체

for 반복문의 순회 대상 객체
해당 객체의 __iter__() 메서드로 열거 가능 객체 획득

매 루프마다__next()__함수를 통해 다음요소를 추출
더 이상 요소가 없는데 __next()__를 호출하는 경우

 


nums = [11,22,33]

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

 

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

    def __iter__(self):
        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 k in solarterm:
    print(k, end = ',')

print("\n======================")

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

제너레이터


객체로 순회가능한 객체를 만드는건 다소 귀찮은 작업
-> 제너레이터 함수로 대체 가능
함수에서 데이터를 연속해서 리턴(yield)
함수가 끝나면 (또는 return 실행) stopiteration 예외 발생
함수가 호출하면 함수가 실행되는 것이 아니고 순회 가능 객체가 리턴

 

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

def main():
    solarterm =seqgen("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
    #함수내에서 yeild 예약어가 사용된 경우
    #함수가 실행되는게 아님
    

    print(solarterm)
    print(dir(solarterm))

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

    for k in solarterm:
        print(k,end=',')
#루프를 한번만 돌릴 수 있다.
main()

데코레이터 


일급시민 
함수도 일반 변수와 동일한 특성을 가짐
이름을 가진다.
다른 변수에 대입할 수 있다.
인수로 전달할 수 있다.
리턴값이 될 수 있다.
컬렉션에 저장할 수 있다.
-->위와 같은 특성을 가지는 것을 일급시민이라 칭한다.

 

def add(a,b):
    print(a+b)
plus = add
plus(1,2)

 


def calcsum(n):
    def add(a,b):
        return a+b+b
    total = 0
    for i in range(n+1):
        total = add(total,i)

    return total

print("~10 = ",calcsum(10))

#add(10,20) -> 에러발생

def makeHello(message):
    def hello(name):
        print(message + ","+name)
    return hello
def main():
    enghello = makeHello("good moring")
    korhello = makeHello("안녕하세요")
    jphello = makeHello("곤니찌와")

    enghello("mr kim")
    korhello("홍길동")
    jphello("사쿠라")
main()

함수 데코레이터

이미 만들어진 함수에 동작을 추가하는 파이썬의 고급 기법
함수를 래핑하여 함수의 앞 또는 뒤에 코드를 자동으로 추가

 

def inner():
    print("결과를 출력합니다")
def outer(func):
    print("-"*20)
    func()
    print("-"*20)

outer(inner)

def hello():
    print("안녕하세요")
outer(hello)

 

1) 장식자 함수는 내부 함수를 리턴
2) 원래 함수로 다시 저장

 

def inner():
    print("결과를 출력합니다")
def outer(func):
    print("-"*20)
    func()
    print("-"*20)



def hello():
    print("안녕하세요")

def elapse(func):
    pass

def main():
    outer(inner)
    outer(hello)

    elapse(inner)
    elapse(hello)


main()

 

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 #inner = outer(inner)

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

from dataclasses import dataclass

@dataclass
class NameCard:
    name : str
    phone : str = ''
    email :  str = ''
    address : str =''

    def print(self):
        print(self.name)

    def __getitem__(self,key):
        return getattr(self,key)

    def __setattr__(self, key, value):
        setattr(self, key, value)
    
def main():
    card = NameCard('홍길동','010-1111-1111')
    print(card)

    name = getattr(card,'name')
    print(name)

    setattr(card,'email','hong@naver.com')
    print(card)

    func = getattr(card,'print')
    func()

    key = 'name'
    value = getattr(card,key)
    print(value)


    key='address'
    value = '서울시'
    setattr(card,key,value)
    

    print(card)

main()

context manger 객체
   __enter__(self) with로 객체를 만들어서 as에 배정할 때 호출
   __exit__(self,type,value,tb) with 코드 블럭을 벗어날때 호출\

 

#context manger 객체
#   __enter__(self) with로 객체를 만들어서 as에 배정할 때 호출
#   __exit__(self,type,value,tb) with 코드 블럭을 벗어날때 호출

class MyObject:
    def __init__(self) -> None:
        pass
    
    def __enter__(self):
        print('with 코드 블럭에 진입합니다.')
        print('초기화 작업 수행')
        return self
    
    def __exit__(self,type,value,tb):
        print('with 코드 블럭을 벗어납니다.')
        print('클린업 정리 작업 수행')

def main():
    with MyObject() as obj:
        input('마치려면 enter')

    print('작업완료')
main()

'파이썬' 카테고리의 다른 글

내가 헷갈리는 파이썬 정리  (0) 2022.07.02
파이썬 기타함수  (0) 2022.01.10
파이썬 집합  (0) 2022.01.07
파이썬 딕셔너리  (0) 2022.01.07