고급 문법
열거 가능 객체
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 |