2018년 6월 25일 월요일

Python 내장 리스트와 Generator

* 내장 리스트 *
def devider(n):
   i = 1
   dv = [] 
   while(i <= n ): 
   if (n%i == 0): 
     dv.append(i) i += 1
     return dv 
 # 내장 리스트 방법 
def devider2(n): 
 return [d for d in range(1, n+1) if n%d == 0 ]
sal = [1000, 2000,3000, 4000, 5000]
net = [(n - (n * 0.033)) for n in sal]
print (net)
data = [(70, 60), (80, 40), (30,55)]
ft = [c[0] for c in data]
print(sum(ft))
st = [c[1] for c in data]
print(sum(st))
조건부 내장 리스트
if를 붙여서 조건을 추가할 수 있다.
sal = [1000, 2000,3000, 4000, 5000]
net = [(n - (n * 0.033)) for n in sal if n > 3000]
print (net)
* generator *
내장 리스트에 [] 대신 ()을 사용하면 generator가 생성 된다.
generator 사용 이유 : 메모리 절약.
내장 리스트는 생성 시 메모리를 모두 잡지만,
generator는 사용 시점에 값이 계산 되며 이전 계산 값은 기억하지 않는다.
import sys
내장 list 생성 방식
myLL = [n *10 for n in range(1,10000)] 
print(sys.getsizeof(myLL)) # range의 크기에 따라 메모리 증가 함.
generator 생성 방식
myGE = (n *10 for n in range(1,10000)) 
print(sys.getsizeof(myGE))
generator는 range의 크기에 따라 메모리 증가 하지 않음. 객체 메모리만 잡힐뿐 메모리에 담고 있지 않음.
때문에 bigdata 처리할 때 유용 함.
*Generator : 함수 기반 Generator와 내장 Generator*
함수기반 Generator
def fn() :
    yield 10    
yield 20   
yield 30    
yield 40
f = fn() # generator 객체
print(f)
print(next(f))
print(" ")
for i in f:
    print(i)
yield를 이용한 함수기반 Generator 객체는 내장 Generator에 비해 복잡한 연산의 결과를 Generator로 만들때 유용하다.
def divider(n):
    for i in range(1, n+1):
        if (n%i == 0):
            yield i
f = divider(10)
for n in f:
    print(n)
함수기반 Generator를 이용하여 세금 3.3을 제한 실수령액을 계산
def net(n):
    for i in n:
        yield i - i*0.033        
n = net(salary)
for i in n:
    print(i)
비교 : 동등한 결과를 내는 기존 내장 generator
result = (n - n*0.033 for n in salary)
d ={'name': 'son', 'kor':100, 'eng':80, 'name': 'kang', 'kor':80, 'eng':100} 
print([n for n in d.values() if type(n) == int])

댓글 없음:

댓글 쓰기