본문 바로가기
C++,python (인프런+사이트)/python 파이썬 정리

Comprehending Lists으로 Generator 만들기 + 깊복,얕복

by 알 수 없는 사용자 2022. 4. 1.

Generator 란

# Generator : 한 번에 한 개의 항목을 생성(메모리 유지X)
 
왜 쓸까?

메모리 공간 절약

반복자는 인스턴스화될 때 각 항목의 값을 계산하지 않습니다. 그들은 당신이 그것을 요청할 때만 그것을 계산합니다. 이것을 지연 평가 라고 합니다.

지연 평가는 계산할 데이터 세트가 매우 큰 경우에 유용합니다. 전체 데이터 세트가 계산되는 동안 데이터 사용을 즉시 시작할 수 있습니다.

 

왜쓸까 출처 : https://www.freecodecamp.org/news/how-and-why-you-should-use-python-generators-f6fb56650888/


 

dataSet이 아주 큰 경우에는 모든 data를 읽어오는데 시간이 너무 오래 걸리므로 필요한만큼 필요한부분만 꺼내 쓰는게 가능하다.

 

만드는법

Comprehending Lists 만들떄 '[ ]' 이거를 '( )' 이거로 하면 됨 

 

더보기
# Generator 생성
import array
chars = '+_)(*&^%$#@!~)'
# Generator : 한 번에 한 개의 항목을 생성(메모리 유지X)
tuple_g = (ord(s) for s in chars)
# Array
array_g = array.array('I',  (ord(s) for s in chars))

print("-----")
print(tuple_g)  # <generator object <genexpr>
print(type(tuple_g))    # <class 'generator'>
print(next(tuple_g))    # 43
print(next(tuple_g))    # 95
print("-----")
print(array_g)  # array('I', [43, 95,~~~ 41])
print(type(array_g))  # <class 'array.array'>
print(array_g.tolist())  # [43, 95, 41, 40,~~~ 41]

print()

# 제네레이터 예제
print(('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1, 11)))

for s in ('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1, 11)):
    print(s)


print()
print()

# 리스트 주의
marks1 = [['~'] * 5 for n in range(5)]
marks2 = [['~'] * 5] * 5

print(marks1)
print(marks2)

print()

# 수정
marks1[0][1] = 'X'
marks2[0][1] = 'X'

print(marks1)
print(marks2)

# 증명
print([id(i) for i in marks1])
print([id(i) for i in marks2])

깊복 얕복

 

marks2의 ID 가 전부 동일하다 그래서 [0][1] 하나만 바꿔도 전부 바뀐거임.

 

코드

결과창

 

 

 

댓글